157 std::vector<std::vector<std::vector<IndexType>>> componentList(
158 domain->getNumberOfSegments());
159 for (
unsigned segmentId = 0; segmentId < domain->getNumberOfSegments();
161 componentList[segmentId].resize(
D + 1);
162 for (
int dim = -1; dim <
D; ++dim) {
163 componentList[segmentId][dim + 1].resize(
164 domain->getDomain().getNumberOfRuns(segmentId, dim), -1);
168 std::size_t numberOfComponents = 0;
169 std::vector<IndexType> pointsPerComponent;
174 neighborIt(domain->getDomain());
175 !neighborIt.isFinished(); neighborIt.next()) {
176 auto ¢er = neighborIt.getCenter();
179 auto ¤tComponentId =
180 componentList[center.getSegmentId()][center.getLevel()]
181 [center.getRunTypePosition()];
184 if (currentComponentId == -1) {
185 for (
int k = 0; k < 2 *
D; ++k) {
186 auto &neighbor = neighborIt.getNeighbor(k);
187 const auto neighborComponentId =
188 componentList[neighbor.getSegmentId()][neighbor.getLevel()]
189 [neighbor.getRunTypePosition()];
193 if (neighborComponentId != -1) {
194 if (areConnected(center.getValue(), neighbor.getValue())) {
195 currentComponentId = neighborComponentId;
196 if (center.getValue() >= 0.)
197 ++pointsPerComponent[currentComponentId];
205 if (currentComponentId == -1) {
206 currentComponentId = numberOfComponents;
207 pointsPerComponent.push_back((center.getValue() > 0.) ? 1 : 0);
209 ++numberOfComponents;
213 for (
int k = 0; k < 2 *
D; ++k) {
214 auto &neighbor = neighborIt.getNeighbor(k);
215 auto &neighborComponentId =
216 componentList[neighbor.getSegmentId()][neighbor.getLevel()]
217 [neighbor.getRunTypePosition()];
218 if (areConnected(center.getValue(), neighbor.getValue())) {
220 if (neighborComponentId != -1) {
222 if (currentComponentId != neighborComponentId) {
226 neighborComponentId = currentComponentId;
227 if (neighbor.getValue() >= 0.)
228 ++pointsPerComponent[neighborComponentId];
237 (reverseVoidDetection) ? components[0] : components.back();
241 auto pointsPerConnected =
242 mergeComponentCounts(components, pointsPerComponent);
245 if (detectLargestSurface) {
246 topComponent = calculateTopID(components, pointsPerConnected);
248 while (topComponent >= 0 && pointsPerConnected[topComponent] == 0) {
249 if (reverseVoidDetection)
257 std::vector<T> voidPointMarkers;
258 voidPointMarkers.resize(domain->getNumberOfPoints());
260 std::vector<T> componentMarkers;
262 componentMarkers.resize(domain->getNumberOfPoints());
267 neighborIt(domain->getDomain());
268 !neighborIt.isFinished(); neighborIt.next()) {
269 auto center = neighborIt.getCenter();
271 if (!center.isDefined())
275 if (center.getValue() >= 0) {
276 const int &oldComponentId = componentList[center.getSegmentId()][0]
277 [center.getRunTypePosition()];
278 voidPointMarkers[center.getPointId()] =
279 (components[oldComponentId] != topComponent);
285 for (k = 0; k < 2 *
D; ++k) {
286 auto &neighbor = neighborIt.getNeighbor(k);
287 if (std::signbit(neighbor.getValue()) ==
288 std::signbit(center.getValue()))
290 const int &oldneighborComponentId =
291 componentList[neighbor.getSegmentId()][neighbor.getLevel()]
292 [neighbor.getRunTypePosition()];
293 if (components[oldneighborComponentId] == topComponent) {
297 voidPointMarkers[center.getPointId()] = (k == 2 *
D);
300 if (saveComponents) {
301 const int &oldComponentId = componentList[center.getSegmentId()][0]
302 [center.getRunTypePosition()];
303 componentMarkers[center.getPointId()] = components[oldComponentId];
307 auto &pointData = domain->getPointData();
308 auto voidMarkersPointer = pointData.getScalarData(
voidPointLabel,
true);
310 if (voidMarkersPointer ==
nullptr) {
313 *voidMarkersPointer = std::move(voidPointMarkers);
316 if (saveComponents) {
318 *std::max_element(componentMarkers.begin(), componentMarkers.end());
319 assert(maxComponent >= 0);
320 numComponents = maxComponent;
322 auto componentMarkersPointer =
323 pointData.getScalarData(
"ConnectedComponentId",
true);
325 if (componentMarkersPointer ==
nullptr) {
326 pointData.insertNextScalarData(componentMarkers,
327 "ConnectedComponentId");
329 *componentMarkersPointer = std::move(componentMarkers);