55 { pointStatus::CONVEX,
"convex" },
56 { pointStatus::CONCAVE,
"concave" },
57 { pointStatus::MIXED,
"mixed" },
58 { pointStatus::NONFEATURE,
"nonFeature" },
68 { edgeStatus::EXTERNAL,
"external" },
69 { edgeStatus::INTERNAL,
"internal" },
70 { edgeStatus::FLAT,
"flat" },
71 { edgeStatus::OPEN,
"open" },
72 { edgeStatus::MULTIPLE,
"multiple" },
73 { edgeStatus::NONE,
"none" },
83 { sideVolumeType::INSIDE,
"inside" },
84 { sideVolumeType::OUTSIDE,
"outside" },
85 { sideVolumeType::BOTH,
"both" },
86 { sideVolumeType::NEITHER,
"neither" },
105 return wordHashSet(*fileExtensionConstructorTablePtr_);
111 return wordHashSet(*writefileExtensionMemberFunctionTablePtr_);
119 return edgeMeshFormatsCore::checkSupport
131 return edgeMeshFormatsCore::checkSupport
148 return canReadType(ext, verbose);
160 const labelList& ptEds(pointEdges()[ptI]);
162 label nPtEds = ptEds.size();
176 if (edStat == EXTERNAL)
180 else if (edStat == INTERNAL)
186 if (nExternal == nPtEds)
190 else if (nInternal == nPtEds)
210 const edgeList& edges = this->edges();
220 const edge&
e = edges[edgeI];
231 nHits += edgeHits[edgeI].size();
257 label prevPtI = edges[edgeI][0];
260 label newPtI = newPoints.size();
262 newPoints.
append(eHits[eHitI].hitPoint());
263 newToOldPoint.
append(edges[edgeI][0]);
264 dynPointsFromEdge.
append(newPtI);
266 dynSurfTri.
append(eHits[eHitI].index());
270 newEdges[edgeI] =
edge(prevPtI, newPtI);
275 newToOldEdge.
append(edgeI);
279 newEdges.
append(
edge(prevPtI, edges[edgeI][1]));
280 newToOldEdge.
append(edgeI);
292 pointsFromEdge.
transfer(dynPointsFromEdge);
297 autoMap(
allPoints, allEdges, pointMap, edgeMap);
309 const edgeList& edges = this->edges();
316 forAll(edgeCentres, edgeI)
318 const edge&
e = edges[edgeI];
319 edgeCentres[edgeI] =
e.centre(
points);
326 label compactEdgeI = 0;
330 if (volTypes[edgeI] == volType)
332 edgeMap[compactEdgeI++] = edgeI;
341 const edge&
e = edges[edgeMap[i]];
347 label compactPointI = 0;
348 forAll(pointToCompact, pointI)
350 if (pointToCompact[pointI] != -1)
352 pointToCompact[pointI] = compactPointI;
353 pointMap[compactPointI++] = pointI;
356 pointMap.
setSize(compactPointI);
363 const edge&
e = edges[edgeMap[i]];
364 subEdges[i][0] = pointToCompact[
e[0]];
365 subEdges[i][1] = pointToCompact[
e[1]];
369 autoMap(subPoints, subEdges, pointMap, edgeMap);
392 normalVolumeTypes_(0),
394 normalDirections_(0),
396 featurePointNormals_(0),
397 featurePointEdges_(0),
410 nonFeatureStart_(-1),
416 normalVolumeTypes_(0),
418 normalDirections_(0),
420 featurePointNormals_(0),
421 featurePointEdges_(0),
432 concaveStart_(fem.concaveStart()),
433 mixedStart_(fem.mixedStart()),
434 nonFeatureStart_(fem.nonFeatureStart()),
435 internalStart_(fem.internalStart()),
436 flatStart_(fem.flatStart()),
437 openStart_(fem.openStart()),
438 multipleStart_(fem.multipleStart()),
439 normals_(fem.normals()),
440 normalVolumeTypes_(fem.normalVolumeTypes()),
441 edgeDirections_(fem.edgeDirections()),
442 normalDirections_(fem.normalDirections()),
443 edgeNormals_(fem.edgeNormals()),
444 featurePointNormals_(fem.featurePointNormals()),
445 featurePointEdges_(fem.featurePointEdges()),
446 regionEdges_(fem.regionEdges()),
467 this->storedPoints() =
points;
468 this->storedEdges() = edges;
481 this->storedEdges().transfer(edges);
511 normalVolumeTypes_.
setSize(normals_.size());
520 label sFEI = featureEdges[i];
523 const labelList& eFaces = edgeFaces[sFEI];
527 label eFI = eFaces[j];
532 normalVolumeTypes_[nAdded++] =
534 surfBaffleRegions[surf[eFI].region()]
572 label nonFeatureStart,
588 concaveStart_(concaveStart),
589 mixedStart_(mixedStart),
590 nonFeatureStart_(nonFeatureStart),
591 internalStart_(internalStart),
592 flatStart_(flatStart),
593 openStart_(openStart),
594 multipleStart_(multipleStart),
596 normalVolumeTypes_(normalVolumeTypes),
597 edgeDirections_(edgeDirections),
598 normalDirections_(normalDirections),
599 edgeNormals_(edgeNormals),
600 featurePointNormals_(featurePointNormals),
601 featurePointEdges_(featurePointEdges),
602 regionEdges_(regionEdges),
643 return read(unzipName, unzipName.
ext());
666 scalar searchDistSqr,
670 info = pointTree().findNearest
681 scalar searchDistSqr,
685 info = edgeTree().findNearest
723 info.
setSize(edgeTrees.size());
727 sliceStarts[0] = externalStart_;
728 sliceStarts[1] = internalStart_;
729 sliceStarts[2] = flatStart_;
730 sliceStarts[3] = openStart_;
731 sliceStarts[4] = multipleStart_;
735 info[i] = edgeTrees[i].findNearest
745 info[i].setIndex(info[i].index() + sliceStarts[i]);
753 scalar searchRadiusSqr,
768 label index = elems[elemI];
769 label ptI = pointTree().shapes().pointLabels()[index];
774 dynPointHit.append(nearHit);
784 const scalar searchRadiusSqr,
790 info.
setSize(edgeTrees.size());
794 sliceStarts[0] = externalStart_;
795 sliceStarts[1] = internalStart_;
796 sliceStarts[2] = flatStart_;
797 sliceStarts[3] = openStart_;
798 sliceStarts[4] = multipleStart_;
806 labelList elems = edgeTrees[i].findSphere
814 label index = elems[elemI];
815 label edgeI = edgeTrees[i].shapes().edgeLabels()[index];
816 const edge&
e = edges()[edgeI];
820 label hitIndex = index + sliceStarts[i];
829 dynEdgeHit.append(nearHit);
840 if (pointTree_.empty())
851 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
852 bb.
max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
880 if (edgeTree_.empty())
891 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
892 bb.
max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
922 if (edgeTreesByType_.size() == 0)
924 edgeTreesByType_.setSize(nEdgeTypes);
935 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
936 bb.
max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
942 identity((internalStart_ - externalStart_), externalStart_);
945 sliceEdges[1] =
identity((flatStart_ - internalStart_), internalStart_);
948 sliceEdges[2] =
identity((openStart_ - flatStart_), flatStart_);
951 sliceEdges[3] =
identity((multipleStart_ - openStart_), openStart_);
955 identity((edges().size() - multipleStart_), multipleStart_);
957 forAll(edgeTreesByType_, i)
980 return edgeTreesByType_;
988 concaveStart_ =
mesh.concaveStart_;
989 mixedStart_ =
mesh.mixedStart_;
990 nonFeatureStart_ =
mesh.nonFeatureStart_;
991 internalStart_ =
mesh.internalStart_;
992 flatStart_ =
mesh.flatStart_;
993 openStart_ =
mesh.openStart_;
994 multipleStart_ =
mesh.multipleStart_;
996 normalVolumeTypes_.transfer(
mesh.normalVolumeTypes_);
997 edgeDirections_.transfer(
mesh.edgeDirections_);
998 normalDirections_.transfer(
mesh.normalDirections_);
999 edgeNormals_.transfer(
mesh.edgeNormals_);
1000 featurePointNormals_.transfer(
mesh.featurePointNormals_);
1001 featurePointEdges_.transfer(
mesh.featurePointEdges_);
1002 regionEdges_.transfer(
mesh.regionEdges_);
1003 pointTree_ = std::move(
mesh.pointTree_);
1004 edgeTree_ = std::move(
mesh.edgeTree_);
1005 edgeTreesByType_.transfer(
mesh.edgeTreesByType_);
1016 nonFeatureStart_ = 0;
1022 normalVolumeTypes_.clear();
1023 edgeDirections_.clear();
1024 normalDirections_.clear();
1025 edgeNormals_.clear();
1026 featurePointNormals_.clear();
1027 featurePointEdges_.clear();
1028 regionEdges_.clear();
1031 edgeTreesByType_.clear();
1045 for (
label i = 0; i < concaveStart(); i++)
1056 for (
label i = concaveStart(); i < mixedStart(); i++)
1067 for (
label i = mixedStart(); i < nonFeatureStart(); i++)
1078 for (
label i = nonFeatureStart(); i <
points().size(); i++)
1089 newPoints.
rmap(fem.
points(), reverseFemPointMap);
1096 labelList reverseEdgeMap(edges().size());
1101 for (
label i = 0; i < internalStart(); i++)
1103 reverseEdgeMap[i] = newEdgeI++;
1107 reverseFemEdgeMap[i] = newEdgeI++;
1111 label newInternalStart = newEdgeI;
1112 for (
label i = internalStart(); i < flatStart(); i++)
1114 reverseEdgeMap[i] = newEdgeI++;
1118 reverseFemEdgeMap[i] = newEdgeI++;
1122 label newFlatStart = newEdgeI;
1123 for (
label i = flatStart(); i < openStart(); i++)
1125 reverseEdgeMap[i] = newEdgeI++;
1129 reverseFemEdgeMap[i] = newEdgeI++;
1133 label newOpenStart = newEdgeI;
1134 for (
label i = openStart(); i < multipleStart(); i++)
1136 reverseEdgeMap[i] = newEdgeI++;
1140 reverseFemEdgeMap[i] = newEdgeI++;
1144 label newMultipleStart = newEdgeI;
1145 for (
label i = multipleStart(); i < edges().size(); i++)
1147 reverseEdgeMap[i] = newEdgeI++;
1151 reverseFemEdgeMap[i] = newEdgeI++;
1157 const edge&
e = edges()[i];
1158 newEdges[reverseEdgeMap[i]] =
edge
1160 reversePointMap[
e[0]],
1161 reversePointMap[
e[1]]
1167 newEdges[reverseFemEdgeMap[i]] =
edge
1169 reverseFemPointMap[
e[0]],
1170 reverseFemPointMap[
e[1]]
1176 edgeDirections().size()
1179 newEdgeDirections.
rmap(edgeDirections(), reverseEdgeMap);
1192 newNormals.
append(normals());
1193 newNormals.append(fem.
normals());
1199 edgeNormals().size()
1216 const label mapI = reverseFemEdgeMap[i];
1220 en[j] += normals().size();
1228 featurePointNormals().size()
1235 newFeaturePointNormals,
1237 ) = featurePointNormals();
1240 newFeaturePointNormals,
1246 const label mapI = reverseFemPointMap[i];
1247 labelList& fn = newFeaturePointNormals[mapI];
1250 fn[j] += normals().size();
1258 regionEdges().size()
1263 newRegionEdges.append(reverseEdgeMap[regionEdges()[i]]);
1267 newRegionEdges.append(reverseFemEdgeMap[fem.
regionEdges()[i]]);
1275 concaveStart_ = newConcaveStart;
1276 mixedStart_ = newMixedStart;
1277 nonFeatureStart_ = newNonFeatureStart;
1281 edgeMesh newmesh(std::move(newPoints), std::move(newEdges));
1286 internalStart_ = newInternalStart;
1287 flatStart_ = newFlatStart;
1288 openStart_ = newOpenStart;
1289 multipleStart_ = newMultipleStart;
1291 edgeDirections_.transfer(newEdgeDirections);
1293 normals_.transfer(newNormals);
1294 edgeNormals_.transfer(newEdgeNormals);
1295 featurePointNormals_.transfer(newFeaturePointNormals);
1297 regionEdges_.transfer(newRegionEdges);
1301 edgeTreesByType_.clear();
1317 for (
label i = concaveStart(); i < mixedStart(); i++)
1323 for (
label i = 0; i < concaveStart(); i++)
1339 for (
label i = internalStart(); i < flatStart(); i++)
1341 reverseEdgeMap[i] = newEdgeI++;
1344 label newInternalStart = newEdgeI;
1345 for (
label i = 0; i < internalStart(); i++)
1347 reverseEdgeMap[i] = newEdgeI++;
1357 const edge&
e = edges()[i];
1358 newEdges[reverseEdgeMap[i]] =
edge
1360 reversePointMap[
e[0]],
1361 reversePointMap[
e[1]]
1369 pointField newEdgeDirections(edges().size());
1370 newEdgeDirections.
rmap(-1.0*edgeDirections(), reverseEdgeMap);
1377 labelListList newFeaturePointNormals(featurePointNormals().size());
1382 newFeaturePointNormals,
1384 ) = featurePointNormals();
1386 labelList newRegionEdges(regionEdges().size());
1389 newRegionEdges[i] = reverseEdgeMap[regionEdges()[i]];
1393 concaveStart_ = newConcaveStart;
1397 edgeMesh newmesh(std::move(newPoints), std::move(newEdges));
1402 internalStart_ = newInternalStart;
1404 edgeDirections_.transfer(newEdgeDirections);
1405 normals_.transfer(newNormals);
1406 edgeNormals_.transfer(newEdgeNormals);
1407 featurePointNormals_.transfer(newFeaturePointNormals);
1408 regionEdges_.transfer(newRegionEdges);
1412 edgeTreesByType_.clear();
1425 label subIntStart = edgeMap.size();
1426 label subFlatStart = edgeMap.size();
1427 label subOpenStart = edgeMap.size();
1428 label subMultipleStart = edgeMap.size();
1430 forAll(edgeMap, subEdgeI)
1432 label edgeI = edgeMap[subEdgeI];
1433 if (edgeI >= internalStart() && subIntStart == edgeMap.size())
1435 subIntStart = subEdgeI;
1437 if (edgeI >= flatStart() && subFlatStart == edgeMap.size())
1439 subFlatStart = subEdgeI;
1441 if (edgeI >= openStart() && subOpenStart == edgeMap.size())
1443 subOpenStart = subEdgeI;
1445 if (edgeI >= multipleStart() && subMultipleStart == edgeMap.size())
1447 subMultipleStart = subEdgeI;
1454 label subConcaveStart = pointMap.size();
1455 label subMixedStart = pointMap.size();
1456 label subNonFeatStart = pointMap.size();
1458 forAll(pointMap, subPointI)
1460 label pointI = pointMap[subPointI];
1461 if (pointI >= concaveStart() && subConcaveStart == pointMap.size())
1463 subConcaveStart = subPointI;
1465 if (pointI >= mixedStart() && subMixedStart == pointMap.size())
1467 subMixedStart = subPointI;
1471 pointI >= nonFeatureStart()
1472 && subNonFeatStart == pointMap.size()
1475 subNonFeatStart = subPointI;
1484 bitSet isRegionEdge(edges().size(), regionEdges());
1487 forAll(edgeMap, subEdgeI)
1489 if (isRegionEdge.
test(edgeMap[subEdgeI]))
1491 newRegionEdges.
append(subEdgeI);
1494 subRegionEdges.
transfer(newRegionEdges);
1499 if (featurePointEdges().size())
1501 subFeaturePointEdges.
setSize(subNonFeatStart);
1502 for (
label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1504 label pointI = pointMap[subPointI];
1505 const labelList& pEdges = featurePointEdges()[pointI];
1507 labelList& subPEdges = subFeaturePointEdges[subPointI];
1508 subPEdges.
setSize(pEdges.size());
1514 subPEdges[i] = edgeMap[pEdges[i]];
1521 vectorField subEdgeDirections(edgeDirections(), edgeMap);
1524 labelList reverseNormalMap(normals().size(), -1);
1528 bitSet isSubNormal(normals().size());
1529 for (
label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1531 label pointI = pointMap[subPointI];
1532 const labelList& pNormals = featurePointNormals()[pointI];
1534 isSubNormal.
set(pNormals);
1536 forAll(edgeMap, subEdgeI)
1538 label edgeI = edgeMap[subEdgeI];
1539 const labelList& eNormals = edgeNormals()[edgeI];
1541 isSubNormal.
set(eNormals);
1544 forAll(isSubNormal, normalI)
1546 if (isSubNormal.
test(normalI))
1548 label subNormalI = normalMap.size();
1549 reverseNormalMap[normalI] = subNormalI;
1550 normalMap.
append(subNormalI);
1559 if (normalDirections().size())
1561 subNormalDirections.
setSize(edgeMap.size());
1563 forAll(edgeMap, subEdgeI)
1565 label edgeI = edgeMap[subEdgeI];
1566 const labelList& eNormals = normalDirections()[edgeI];
1568 labelList& subNormals = subNormalDirections[subEdgeI];
1569 subNormals.
setSize(eNormals.size());
1572 if (eNormals[i] >= 0)
1574 subNormals[i] = reverseNormalMap[eNormals[i]];
1585 forAll(edgeMap, subEdgeI)
1587 label edgeI = edgeMap[subEdgeI];
1588 const labelList& eNormals = edgeNormals()[edgeI];
1589 labelList& subNormals = subEdgeNormals[subEdgeI];
1595 for (
label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1597 label pointI = pointMap[subPointI];
1598 const labelList& pNormals = featurePointNormals()[pointI];
1599 labelList& subNormals = subPointNormals[subPointI];
1608 if (normalVolumeTypes().size())
1610 subNormalVolumeTypes =
1613 normalVolumeTypes(),
1636 subNormalVolumeTypes,
1642 subNormalDirections,
1648 subFeaturePointEdges,
1688 select(surf, volType, subPointMap, subEdgeMap);
1699 edgeStat[edgeI] = getEdgeStatus(edgeI);
1701 forAll(pointStat, pointI)
1703 pointStat[pointI] = getPointStatus(pointI);
1707 labelList oldPointToIndex(nOldPoints, -1);
1708 forAll(pointsFromEdge, i)
1710 oldPointToIndex[pointsFromEdge[i]] = i;
1712 forAll(subPointMap, pointI)
1714 label oldPointI = subPointMap[pointI];
1715 label index = oldPointToIndex[oldPointI];
1718 pointStat[pointI] = classifyFeaturePoint(pointI);
1729 sortedToOriginalPoint,
1730 sortedToOriginalEdge
1734 pointMap =
labelUIndList(pointMap, sortedToOriginalPoint)();
1748 label pointConcaveStart;
1749 label pointMixedStart;
1750 label pointNonFeatStart;
1752 label edgeInternalStart;
1753 label edgeFlatStart;
1754 label edgeOpenStart;
1755 label edgeMultipleStart;
1760 sortedToOriginalPoint,
1761 sortedToOriginalEdge,
1776 forAll(sortedToOriginalPoint, sortedI)
1778 reversePointMap[sortedToOriginalPoint[sortedI]] = sortedI;
1782 forAll(sortedEdges, sortedI)
1792 sortedToOriginalPoint,
1793 sortedToOriginalEdge
1797 concaveStart_ = pointConcaveStart;
1798 mixedStart_ = pointMixedStart;
1799 nonFeatureStart_ = pointNonFeatStart;
1800 internalStart_ = edgeInternalStart;
1801 flatStart_ = edgeFlatStart;
1802 openStart_ = edgeOpenStart;
1803 multipleStart_ = edgeMultipleStart;
1809 const scalar mergeDist,
1828 forAll(oldToMerged, oldI)
1830 label newI = oldToMerged[oldI];
1831 if (pointMap[newI] == -1)
1833 pointMap[newI] = oldI;
1841 const edge& oldE = edges()[edgeI];
1842 newEdges[edgeI] =
edge(oldToMerged[oldE[0]], oldToMerged[oldE[1]]);
1858 edgeStat[edgeI] = getEdgeStatus(edgeI);
1862 forAll(pointStat, pointI)
1864 pointStat[pointI] = getPointStatus(pointI);
1869 forAll(oldToMerged, oldPointI)
1871 nPoints[oldToMerged[oldPointI]]++;
1878 pointStat[pointI] = classifyFeaturePoint(pointI);
1887 sortedToOriginalPoint,
1890 pointMap =
labelUIndList(pointMap, sortedToOriginalPoint)();
1892 return nNewPoints != nOldPoints;
1898 Info<<
nl <<
"Writing extendedEdgeMesh components to " << prefix
1904 OBJstream convexFtPtStr(prefix +
"_convexFeaturePts.obj");
1905 Info<<
"Writing " << concaveStart_
1906 <<
" convex feature points to " << convexFtPtStr.
name() <<
endl;
1908 for(
label i = 0; i < concaveStart_; i++)
1915 OBJstream concaveFtPtStr(prefix +
"_concaveFeaturePts.obj");
1916 Info<<
"Writing " << mixedStart_-concaveStart_
1917 <<
" concave feature points to "
1920 for(
label i = concaveStart_; i < mixedStart_; i++)
1927 OBJstream mixedFtPtStr(prefix +
"_mixedFeaturePts.obj");
1928 Info<<
"Writing " << nonFeatureStart_-mixedStart_
1929 <<
" mixed feature points to " << mixedFtPtStr.
name() <<
endl;
1931 for(
label i = mixedStart_; i < nonFeatureStart_; i++)
1938 OBJstream mixedFtPtStructureStr(prefix+
"_mixedFeaturePtsStructure.obj");
1940 << nonFeatureStart_-mixedStart_
1941 <<
" mixed feature point structure to "
1942 << mixedFtPtStructureStr.
name() <<
endl;
1944 for(
label i = mixedStart_; i < nonFeatureStart_; i++)
1946 const labelList& ptEds = pointEdges()[i];
1950 const edge&
e = edges()[ptEds[j]];
1951 mixedFtPtStructureStr.
write
1961 OBJstream externalStr(prefix +
"_externalEdges.obj");
1962 Info<<
"Writing " << internalStart_-externalStart_
1963 <<
" external edges to " << externalStr.
name() <<
endl;
1965 for (
label i = externalStart_; i < internalStart_; i++)
1967 const edge&
e = edges()[i];
1973 OBJstream internalStr(prefix +
"_internalEdges.obj");
1974 Info<<
"Writing " << flatStart_-internalStart_
1975 <<
" internal edges to " << internalStr.
name() <<
endl;
1977 for (
label i = internalStart_; i < flatStart_; i++)
1979 const edge&
e = edges()[i];
1985 OBJstream flatStr(prefix +
"_flatEdges.obj");
1986 Info<<
"Writing " << openStart_-flatStart_
1987 <<
" flat edges to " << flatStr.
name() <<
endl;
1989 for (
label i = flatStart_; i < openStart_; i++)
1991 const edge&
e = edges()[i];
1997 OBJstream openStr(prefix +
"_openEdges.obj");
1998 Info<<
"Writing " << multipleStart_-openStart_
1999 <<
" open edges to " << openStr.
name() <<
endl;
2001 for (
label i = openStart_; i < multipleStart_; i++)
2003 const edge&
e = edges()[i];
2009 OBJstream multipleStr(prefix +
"_multipleEdges.obj");
2010 Info<<
"Writing " << edges().size()-multipleStart_
2011 <<
" multiple edges to " << multipleStr.
name() <<
endl;
2013 for (
label i = multipleStart_; i < edges().size(); i++)
2015 const edge&
e = edges()[i];
2021 OBJstream regionStr(prefix +
"_regionEdges.obj");
2022 Info<<
"Writing " << regionEdges_.size()
2023 <<
" region edges to " << regionStr.
name() <<
endl;
2027 const edge&
e = edges()[regionEdges_[i]];
2033 OBJstream edgeDirsStr(prefix +
"_edgeDirections.obj");
2034 Info<<
"Writing " << edgeDirections_.size()
2035 <<
" edge directions to " << edgeDirsStr.
name() <<
endl;
2037 forAll(edgeDirections_, i)
2039 const vector& eVec = edgeDirections_[i];
2040 const edge&
e = edges()[i];
2055 os <<
indent <<
"point classification :" <<
nl;
2057 os <<
indent <<
"convex feature points : "
2058 <<
setw(8) << concaveStart_-convexStart_
2061 os <<
indent <<
"concave feature points : "
2062 <<
setw(8) << mixedStart_-concaveStart_
2065 os <<
indent <<
"mixed feature points : "
2066 <<
setw(8) << nonFeatureStart_-mixedStart_
2069 os <<
indent <<
"other (non-feature) points : "
2070 <<
setw(8) <<
points().size()-nonFeatureStart_
2075 os <<
indent <<
"edge classification :" <<
nl;
2077 os <<
indent <<
"external (convex angle) edges : "
2078 <<
setw(8) << internalStart_-externalStart_
2081 os <<
indent <<
"internal (concave angle) edges : "
2082 <<
setw(8) << flatStart_-internalStart_
2085 os <<
indent <<
"flat region edges : "
2086 <<
setw(8) << openStart_-flatStart_
2089 os <<
indent <<
"open edges : "
2090 <<
setw(8) << multipleStart_-openStart_
2093 os <<
indent <<
"multiply connected edges : "
2094 <<
setw(8) << edges().size()-multipleStart_
2109 label nEdNorms = edNorms.size();
2115 else if (nEdNorms == 2)
2117 const vector& n0(norms[edNorms[0]]);
2118 const vector& n1(norms[edNorms[1]]);
2120 if ((n0 & n1) > cosNormalAngleTol_)
2124 else if ((fC0tofC1 & n0) > 0.0)
2133 else if (nEdNorms > 2)
2150 label& pointConcaveStart,
2151 label& pointMixedStart,
2152 label& pointNonFeatStart,
2154 label& edgeInternalStart,
2155 label& edgeFlatStart,
2156 label& edgeOpenStart,
2157 label& edgeMultipleStart
2160 sortedToOriginalPoint.
setSize(pointStat.size());
2161 sortedToOriginalPoint = -1;
2163 sortedToOriginalEdge.
setSize(edgeStat.size());
2164 sortedToOriginalEdge = -1;
2175 forAll(pointStat, pointI)
2177 switch (pointStat[pointI])
2202 label convexStart = 0;
2203 label concaveStart = nConvex;
2204 label mixedStart = concaveStart+nConcave;
2205 label nonFeatStart = mixedStart+nMixed;
2209 pointConcaveStart = concaveStart;
2210 pointMixedStart = mixedStart;
2211 pointNonFeatStart = nonFeatStart;
2213 forAll(pointStat, pointI)
2215 switch (pointStat[pointI])
2218 sortedToOriginalPoint[convexStart++] = pointI;
2222 sortedToOriginalPoint[concaveStart++] = pointI;
2226 sortedToOriginalPoint[mixedStart++] = pointI;
2230 sortedToOriginalPoint[nonFeatStart++] = pointI;
2239 label nExternal = 0;
2240 label nInternal = 0;
2243 label nMultiple = 0;
2247 switch (edgeStat[edgeI])
2277 label externalStart = 0;
2278 label internalStart = nExternal;
2279 label flatStart = internalStart + nInternal;
2280 label openStart = flatStart + nFlat;
2281 label multipleStart = openStart + nOpen;
2285 edgeInternalStart = internalStart;
2286 edgeFlatStart = flatStart;
2287 edgeOpenStart = openStart;
2288 edgeMultipleStart = multipleStart;
2292 switch (edgeStat[edgeI])
2295 sortedToOriginalEdge[externalStart++] = edgeI;
2299 sortedToOriginalEdge[internalStart++] = edgeI;
2303 sortedToOriginalEdge[flatStart++] = edgeI;
2307 sortedToOriginalEdge[openStart++] = edgeI;
2311 sortedToOriginalEdge[multipleStart++] = edgeI;
2348 os << static_cast<label>(vt);
2357 os <<
"// points" <<
nl
2361 <<
"// concaveStart mixedStart nonFeatureStart" <<
nl
2365 <<
"// internalStart flatStart openStart multipleStart" <<
nl
2370 <<
"// normals" <<
nl
2372 <<
"// normal volume types" <<
nl
2374 <<
"// normalDirections" <<
nl
2376 <<
"// edgeNormals" <<
nl
2378 <<
"// featurePointNormals" <<
nl
2380 <<
"// featurePointEdges" <<
nl
2382 <<
"// regionEdges" <<
nl