45 if (levelSet ==
nullptr) {
47 .addError(
"No level set passed to Interior. Not activating.")
52 if (levelSet->getNumberOfPoints() == 0)
55 const int startWidth = levelSet->getLevelSetWidth();
57 for (
int currentCycle = 0; currentCycle < 100; ++currentCycle) {
60 const T limit = (startWidth + currentCycle + 1);
62 auto &grid = levelSet->getGrid();
63 auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
64 auto &newDomain = newlsDomain->getDomain();
65 auto &domain = levelSet->getDomain();
67 newDomain.initialize(domain.getNewSegmentation(), domain.getAllocation());
69 const bool updateData = updatePointData;
72 std::vector<std::vector<unsigned>> newDataSourceIds;
74 newDataSourceIds.resize(newDomain.getNumberOfSegments());
76#pragma omp parallel for reduction(+ : addedPoints)
77 for (
unsigned p = 0; p < newDomain.getNumberOfSegments(); ++p) {
78 auto &domainSegment = newDomain.getDomainSegment(p);
80 viennahrle::Index<D>
const startVector =
81 (p == 0) ? grid.getMinGridPoint()
82 : newDomain.getSegmentation()[p - 1];
84 viennahrle::Index<D>
const endVector =
85 (p !=
static_cast<int>(newDomain.getNumberOfSegments() - 1))
86 ? newDomain.getSegmentation()[p]
87 : grid.incrementIndices(grid.getMaxGridPoint());
91 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>;
92 std::unique_ptr<GuideIt> guideIt;
94 guideIt = std::make_unique<GuideIt>(guide->getDomain(), startVector);
96 for (viennahrle::ConstSparseStarIterator<
98 neighborIt(domain, startVector);
99 neighborIt.getIndices() < endVector; neighborIt.next()) {
101 auto ¢erIt = neighborIt.getCenter();
104 bool insideGuide =
false;
106 guideIt->goToIndicesSequential(neighborIt.getIndices());
107 insideGuide = (guideIt->getValue() <
T(0));
117 int definedNeighbor = -1;
118 for (
int i = 0; i < 2 *
D; i++) {
119 auto &nb = neighborIt.getNeighbor(i);
120 T newValue = nb.getValue() -
T(1);
121 if (distance < newValue)
123 if (nb.isDefined() && definedDistance < newValue) {
124 definedDistance = newValue;
130 if (!insideGuide && definedDistance >= -limit &&
131 definedNeighbor != -1) {
133 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
136 newDataSourceIds[p].push_back(
137 neighborIt.getNeighbor(definedNeighbor).getPointId());
140 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
145 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
148 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
149 centerIt.getValue());
151 newDataSourceIds[p].push_back(centerIt.getPointId());
158 newlsDomain->getPointData().translateFromMultiData(
159 levelSet->getPointData(), newDataSourceIds);
162 newDomain.finalize();
163 levelSet->deepCopy(newlsDomain);
164 if (addedPoints == 0)