45 if (levelSet ==
nullptr) {
47 .addError(
"No level set passed to Expand. Not expanding.")
52 if (width <= levelSet->getLevelSetWidth())
55 if (levelSet->getNumberOfPoints() == 0)
58 const T totalLimit = width * 0.5;
59 const int startWidth = levelSet->getLevelSetWidth();
60 const int numberOfRequiredCycles = width - startWidth;
62 for (
int currentCycle = 0; currentCycle < numberOfRequiredCycles;
65 const int allocationFactor =
66 1 + 1.0 /
static_cast<double>(startWidth + currentCycle);
67 const T limit = (startWidth + currentCycle + 1) *
T(0.5);
69 auto &grid = levelSet->getGrid();
70 auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
71 auto &newDomain = newlsDomain->getDomain();
72 auto &domain = levelSet->getDomain();
74 newDomain.initialize(domain.getNewSegmentation(),
75 domain.getAllocation() * allocationFactor);
77 const bool updateData = updatePointData;
80 std::vector<std::vector<unsigned>> newDataSourceIds;
82 newDataSourceIds.resize(newDomain.getNumberOfSegments());
84#pragma omp parallel for
85 for (
unsigned p = 0; p < newDomain.getNumberOfSegments(); ++p) {
87 auto &domainSegment = newDomain.getDomainSegment(p);
89 viennahrle::Index<D>
const startVector =
90 (p == 0) ? grid.getMinGridPoint()
91 : newDomain.getSegmentation()[p - 1];
93 viennahrle::Index<D>
const endVector =
94 (p !=
static_cast<int>(newDomain.getNumberOfSegments() - 1))
95 ? newDomain.getSegmentation()[p]
96 : grid.incrementIndices(grid.getMaxGridPoint());
98 for (viennahrle::ConstSparseStarIterator<
100 neighborIt(domain, startVector);
101 neighborIt.getIndices() < endVector; neighborIt.next()) {
103 auto ¢erIt = neighborIt.getCenter();
104 if (std::abs(centerIt.getValue()) <= totalLimit) {
105 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
106 centerIt.getValue());
108 newDataSourceIds[p].push_back(centerIt.getPointId());
110 if (centerIt.getValue() > -std::numeric_limits<T>::epsilon()) {
113 for (
int i = 0; i < 2 *
D; i++) {
114 T newValue = neighborIt.getNeighbor(i).getValue() +
T(1);
115 if (distance > newValue) {
120 if (distance <= limit) {
121 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
124 newDataSourceIds[p].push_back(
125 neighborIt.getNeighbor(neighbor).getPointId());
128 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
134 for (
int i = 0; i < 2 *
D; i++) {
135 T newValue = neighborIt.getNeighbor(i).getValue() -
T(1);
136 if (distance < newValue) {
141 if (distance >= -limit) {
142 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
145 newDataSourceIds[p].push_back(
146 neighborIt.getNeighbor(neighbor).getPointId());
149 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
159 newlsDomain->getPointData().translateFromMultiData(
160 levelSet->getPointData(), newDataSourceIds);
163 newDomain.finalize();
164 levelSet->deepCopy(newlsDomain);
166 levelSet->getDomain().segment();
167 levelSet->finalize(width);