41 if (levelSet ==
nullptr) {
43 .addError(
"No level set was passed to FromMesh.")
47 if (mesh ==
nullptr) {
49 .addError(
"No Mesh was supplied to FromMesh.")
54 auto &domain = levelSet->getDomain();
55 auto &nodes = mesh->getNodes();
56 auto values = mesh->getPointData().getScalarData(
"LSValues",
true);
57 if (values ==
nullptr) {
58 values = mesh->getCellData().getScalarData(
"LSValues",
true);
61 if (values ==
nullptr) {
63 .addError(
"Mesh does not contain level set values (\"LSValues\").")
75 const viennahrle::Grid<D> &grid = domain.getGrid();
76 const T gridDelta = grid.getGridDelta();
78 viennahrle::Index<D> lastIndex;
79 for (
unsigned i = 0; i <
D; ++i) {
80 lastIndex[i] = nodes.front()[i] / gridDelta;
83 if (lastIndex != grid.getMinGridPoint()) {
84 domain.insertNextUndefinedPoint(0, grid.getMinGridPoint(),
90 auto pointDataIt = nodes.begin();
91 auto pointDataEnd = nodes.end();
93 auto valueIt = values->begin();
94 auto valueEnd = values->end();
96 VectorType<bool, D> signs;
97 std::fill(signs.begin(), signs.end(),
98 values->front() <= -std::numeric_limits<T>::epsilon());
100 while (pointDataIt != pointDataEnd && valueIt != valueEnd) {
103 if (std::abs(*valueIt) > 2.5) {
109 bool setPoint =
true;
111 viennahrle::Index<D> currentIndex;
112 for (
unsigned i = 0; i <
D; ++i) {
113 currentIndex[i] = std::round(pointDataIt->at(i) / gridDelta);
118 for (
unsigned i = 0; i <
D; ++i) {
119 if (grid.getBoundaryConditions(i) !=
120 viennahrle::BoundaryType::INFINITE_BOUNDARY) {
121 if (currentIndex[i] > grid.getMaxBounds(i) ||
122 currentIndex[i] < grid.getMinBounds(i)) {
130 domain.insertNextDefinedPoint(0, currentIndex, *valueIt);
134 bool changeSign =
false;
135 for (
int i =
D - 1; i >= 0; --i) {
136 changeSign = changeSign || (currentIndex[i] > lastIndex[i]);
138 signs[i] = *valueIt <= -std::numeric_limits<T>::epsilon();
139 lastIndex[i] = currentIndex[i];
145 viennahrle::Index<D> nextIndex;
151 if (pointDataIt == pointDataEnd) {
152 nextIndex = grid.getMaxGridPoint();
155 for (
unsigned i = 0; i <
D; ++i) {
156 nextIndex[i] = std::round(pointDataIt->at(i) / gridDelta);
163 for (
int q = 0; q <
D; q++) {
164 viennahrle::Index<D> tmp = currentIndex;
166 if (tmp[q] > grid.getMaxGridPoint(q))
168 for (
int r = 0; r < q; ++r)
169 tmp[r] = grid.getMinGridPoint(r);
171 if (tmp >= nextIndex)
174 domain.insertNextUndefinedPoint(0, tmp,