28 #include "triSurface.H"
113 return wordHashSet(*fileExtensionConstructorTablePtr_);
119 return wordHashSet(*writefileExtensionMemberFunctionTablePtr_);
131 return edgeMeshFormatsCore::checkSupport
147 return edgeMeshFormatsCore::checkSupport
166 ext =
name.lessExt().ext();
168 return canReadType(ext, verbose);
180 const labelList& ptEds(pointEdges()[ptI]);
196 if (edStat == EXTERNAL)
200 else if (edStat == INTERNAL)
206 if (nExternal == nPtEds)
210 else if (nInternal == nPtEds)
232 const edgeList& edges = this->edges();
242 const edge&
e = edges[edgeI];
253 nHits += edgeHits[edgeI].
size();
279 label prevPtI = edges[edgeI][0];
282 label newPtI = newPoints.size();
284 newPoints.
append(eHits[eHitI].hitPoint());
285 newToOldPoint.
append(edges[edgeI][0]);
286 dynPointsFromEdge.
append(newPtI);
288 dynSurfTri.
append(eHits[eHitI].index());
292 newEdges[edgeI] =
edge(prevPtI, newPtI);
297 newToOldEdge.
append(edgeI);
301 newEdges.
append(
edge(prevPtI, edges[edgeI][1]));
302 newToOldEdge.
append(edgeI);
314 pointsFromEdge.
transfer(dynPointsFromEdge);
319 autoMap(
allPoints, allEdges, pointMap, edgeMap);
331 const edgeList& edges = this->edges();
338 forAll(edgeCentres, edgeI)
340 const edge&
e = edges[edgeI];
341 edgeCentres[edgeI] =
e.centre(
points);
348 label compactEdgeI = 0;
352 if (volTypes[edgeI] == volType)
354 edgeMap[compactEdgeI++] = edgeI;
363 const edge&
e = edges[edgeMap[i]];
369 label compactPointI = 0;
370 forAll(pointToCompact, pointI)
372 if (pointToCompact[pointI] != -1)
374 pointToCompact[pointI] = compactPointI;
375 pointMap[compactPointI++] = pointI;
378 pointMap.
setSize(compactPointI);
385 const edge&
e = edges[edgeMap[i]];
386 subEdges[i][0] = pointToCompact[
e[0]];
387 subEdges[i][1] = pointToCompact[
e[1]];
391 autoMap(subPoints, subEdges, pointMap, edgeMap);
414 normalVolumeTypes_(0),
416 normalDirections_(0),
418 featurePointNormals_(0),
419 featurePointEdges_(0),
430 concaveStart_(fem.concaveStart()),
431 mixedStart_(fem.mixedStart()),
432 nonFeatureStart_(fem.nonFeatureStart()),
433 internalStart_(fem.internalStart()),
434 flatStart_(fem.flatStart()),
435 openStart_(fem.openStart()),
436 multipleStart_(fem.multipleStart()),
437 normals_(fem.normals()),
438 normalVolumeTypes_(fem.normalVolumeTypes()),
439 edgeDirections_(fem.edgeDirections()),
440 normalDirections_(fem.normalDirections()),
441 edgeNormals_(fem.edgeNormals()),
442 featurePointNormals_(fem.featurePointNormals()),
443 featurePointEdges_(fem.featurePointEdges()),
444 regionEdges_(fem.regionEdges()),
472 normalVolumeTypes_(0),
474 normalDirections_(0),
476 featurePointNormals_(0),
477 featurePointEdges_(0),
494 nonFeatureStart_(-1),
500 normalVolumeTypes_(0),
502 normalDirections_(0),
504 featurePointNormals_(0),
505 featurePointEdges_(0),
529 normalVolumeTypes_.
setSize(normals_.size());
538 label sFEI = featureEdges[i];
541 const labelList& eFaces = edgeFaces[sFEI];
545 label eFI = eFaces[j];
550 normalVolumeTypes_[nAdded++] =
552 surfBaffleRegions[surf[eFI].region()]
575 nonFeatureStart_(-1),
581 normalVolumeTypes_(0),
583 normalDirections_(0),
585 featurePointNormals_(0),
586 featurePointEdges_(0),
608 label nonFeatureStart,
624 concaveStart_(concaveStart),
625 mixedStart_(mixedStart),
626 nonFeatureStart_(nonFeatureStart),
627 internalStart_(internalStart),
628 flatStart_(flatStart),
629 openStart_(openStart),
630 multipleStart_(multipleStart),
632 normalVolumeTypes_(normalVolumeTypes),
633 edgeDirections_(edgeDirections),
634 normalDirections_(normalDirections),
635 edgeNormals_(edgeNormals),
636 featurePointNormals_(featurePointNormals),
637 featurePointEdges_(featurePointEdges),
638 regionEdges_(regionEdges),
660 normalVolumeTypes_(0),
662 normalDirections_(0),
664 featurePointNormals_(0),
665 featurePointEdges_(0),
686 normalVolumeTypes_(0),
688 normalDirections_(0),
690 featurePointNormals_(0),
691 featurePointEdges_(0),
715 return read(unzipName, unzipName.
ext());
740 scalar searchDistSqr,
744 info = pointTree().findNearest
755 scalar searchDistSqr,
759 info = edgeTree().findNearest
801 sliceStarts[0] = externalStart_;
802 sliceStarts[1] = internalStart_;
803 sliceStarts[2] = flatStart_;
804 sliceStarts[3] = openStart_;
805 sliceStarts[4] = multipleStart_;
809 info[i] = edgeTrees[i].findNearest
819 info[i].setIndex(info[i].index() + sliceStarts[i]);
827 scalar searchRadiusSqr,
842 label index = elems[elemI];
843 label ptI = pointTree().shapes().pointLabels()[index];
848 dynPointHit.
append(nearHit);
858 const scalar searchRadiusSqr,
868 sliceStarts[0] = externalStart_;
869 sliceStarts[1] = internalStart_;
870 sliceStarts[2] = flatStart_;
871 sliceStarts[3] = openStart_;
872 sliceStarts[4] = multipleStart_;
880 labelList elems = edgeTrees[i].findSphere
888 label index = elems[elemI];
889 label edgeI = edgeTrees[i].shapes().edgeLabels()[index];
890 const edge&
e = edges()[edgeI];
894 label hitIndex = index + sliceStarts[i];
903 dynEdgeHit.
append(nearHit);
914 if (pointTree_.empty())
925 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
926 bb.
max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
954 if (edgeTree_.empty())
965 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
966 bb.
max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
996 if (edgeTreesByType_.size() == 0)
998 edgeTreesByType_.setSize(nEdgeTypes);
1009 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
1010 bb.
max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
1016 identity(internalStart_ - externalStart_) + externalStart_;
1019 sliceEdges[1] =
identity(flatStart_ - internalStart_) + internalStart_;
1022 sliceEdges[2] =
identity(openStart_ - flatStart_) + flatStart_;
1025 sliceEdges[3] =
identity(multipleStart_ - openStart_) + openStart_;
1029 identity(edges().size() - multipleStart_) + multipleStart_;
1031 forAll(edgeTreesByType_, i)
1033 edgeTreesByType_.set
1054 return edgeTreesByType_;
1062 concaveStart_ =
mesh.concaveStart_;
1063 mixedStart_ =
mesh.mixedStart_;
1064 nonFeatureStart_ =
mesh.nonFeatureStart_;
1065 internalStart_ =
mesh.internalStart_;
1066 flatStart_ =
mesh.flatStart_;
1067 openStart_ =
mesh.openStart_;
1068 multipleStart_ =
mesh.multipleStart_;
1070 normalVolumeTypes_.transfer(
mesh.normalVolumeTypes_);
1071 edgeDirections_.transfer(
mesh.edgeDirections_);
1072 normalDirections_.transfer(
mesh.normalDirections_);
1073 edgeNormals_.transfer(
mesh.edgeNormals_);
1074 featurePointNormals_.transfer(
mesh.featurePointNormals_);
1075 featurePointEdges_.transfer(
mesh.featurePointEdges_);
1076 regionEdges_.transfer(
mesh.regionEdges_);
1077 pointTree_ =
mesh.pointTree_;
1078 edgeTree_ =
mesh.edgeTree_;
1085 return xferMoveTo<extendedEdgeMesh, extendedEdgeMesh>(*
this);
1094 nonFeatureStart_ = 0;
1100 normalVolumeTypes_.clear();
1101 edgeDirections_.clear();
1102 normalDirections_.clear();
1103 edgeNormals_.clear();
1104 featurePointNormals_.clear();
1105 featurePointEdges_.clear();
1106 regionEdges_.clear();
1109 edgeTreesByType_.clear();
1122 label newPointI = 0;
1123 for (
label i = 0; i < concaveStart(); i++)
1125 reversePointMap[i] = newPointI++;
1129 reverseFemPointMap[i] = newPointI++;
1133 label newConcaveStart = newPointI;
1134 for (
label i = concaveStart(); i < mixedStart(); i++)
1136 reversePointMap[i] = newPointI++;
1140 reverseFemPointMap[i] = newPointI++;
1144 label newMixedStart = newPointI;
1145 for (
label i = mixedStart(); i < nonFeatureStart(); i++)
1147 reversePointMap[i] = newPointI++;
1151 reverseFemPointMap[i] = newPointI++;
1155 label newNonFeatureStart = newPointI;
1156 for (
label i = nonFeatureStart(); i <
points().size(); i++)
1158 reversePointMap[i] = newPointI++;
1162 reverseFemPointMap[i] = newPointI++;
1167 newPoints.
rmap(fem.
points(), reverseFemPointMap);
1174 labelList reverseEdgeMap(edges().size());
1179 for (
label i = 0; i < internalStart(); i++)
1181 reverseEdgeMap[i] = newEdgeI++;
1185 reverseFemEdgeMap[i] = newEdgeI++;
1189 label newInternalStart = newEdgeI;
1190 for (
label i = internalStart(); i < flatStart(); i++)
1192 reverseEdgeMap[i] = newEdgeI++;
1196 reverseFemEdgeMap[i] = newEdgeI++;
1200 label newFlatStart = newEdgeI;
1201 for (
label i = flatStart(); i < openStart(); i++)
1203 reverseEdgeMap[i] = newEdgeI++;
1207 reverseFemEdgeMap[i] = newEdgeI++;
1211 label newOpenStart = newEdgeI;
1212 for (
label i = openStart(); i < multipleStart(); i++)
1214 reverseEdgeMap[i] = newEdgeI++;
1218 reverseFemEdgeMap[i] = newEdgeI++;
1222 label newMultipleStart = newEdgeI;
1223 for (
label i = multipleStart(); i < edges().size(); i++)
1225 reverseEdgeMap[i] = newEdgeI++;
1229 reverseFemEdgeMap[i] = newEdgeI++;
1235 const edge&
e = edges()[i];
1236 newEdges[reverseEdgeMap[i]] =
edge
1238 reversePointMap[
e[0]],
1239 reversePointMap[
e[1]]
1245 newEdges[reverseFemEdgeMap[i]] =
edge
1247 reverseFemPointMap[
e[0]],
1248 reverseFemPointMap[
e[1]]
1253 newEdgeDirections.
rmap(edgeDirections(), reverseEdgeMap);
1264 newNormals.
append(normals());
1274 forAll(reverseFemEdgeMap, i)
1276 label mapI = reverseFemEdgeMap[i];
1280 en[j] += normals().size();
1288 featurePointNormals().size()
1295 newFeaturePointNormals,
1297 ) = featurePointNormals();
1300 newFeaturePointNormals,
1305 label mapI = reverseFemPointMap[i];
1306 labelList& fn = newFeaturePointNormals[mapI];
1309 fn[j] += normals().size();
1317 regionEdges().size()
1322 newRegionEdges.
append(reverseEdgeMap[regionEdges()[i]]);
1334 concaveStart_ = newConcaveStart;
1335 mixedStart_ = newMixedStart;
1336 nonFeatureStart_ = newNonFeatureStart;
1342 internalStart_ = newInternalStart;
1343 flatStart_ = newFlatStart;
1344 openStart_ = newOpenStart;
1345 multipleStart_ = newMultipleStart;
1347 edgeDirections_.transfer(newEdgeDirections);
1349 normals_.transfer(newNormals);
1350 edgeNormals_.transfer(newEdgeNormals);
1351 featurePointNormals_.transfer(newFeaturePointNormals);
1353 regionEdges_.transfer(newRegionEdges);
1357 edgeTreesByType_.clear();
1371 label newPointI = 0;
1373 for (
label i = concaveStart(); i < mixedStart(); i++)
1375 reversePointMap[i] = newPointI++;
1378 label newConcaveStart = newPointI;
1379 for (
label i = 0; i < concaveStart(); i++)
1381 reversePointMap[i] = newPointI++;
1395 for (
label i = internalStart(); i < flatStart(); i++)
1397 reverseEdgeMap[i] = newEdgeI++;
1400 label newInternalStart = newEdgeI;
1401 for (
label i = 0; i < internalStart(); i++)
1403 reverseEdgeMap[i] = newEdgeI++;
1413 const edge&
e = edges()[i];
1414 newEdges[reverseEdgeMap[i]] =
edge
1416 reversePointMap[
e[0]],
1417 reversePointMap[
e[1]]
1425 pointField newEdgeDirections(edges().size());
1426 newEdgeDirections.
rmap(-1.0*edgeDirections(), reverseEdgeMap);
1433 labelListList newFeaturePointNormals(featurePointNormals().size());
1438 newFeaturePointNormals,
1440 ) = featurePointNormals();
1442 labelList newRegionEdges(regionEdges().size());
1445 newRegionEdges[i] = reverseEdgeMap[regionEdges()[i]];
1449 concaveStart_ = newConcaveStart;
1455 internalStart_ = newInternalStart;
1457 edgeDirections_.transfer(newEdgeDirections);
1458 normals_.transfer(newNormals);
1459 edgeNormals_.transfer(newEdgeNormals);
1460 featurePointNormals_.transfer(newFeaturePointNormals);
1461 regionEdges_.transfer(newRegionEdges);
1465 edgeTreesByType_.clear();
1481 label subMultipleStart = edgeMap.
size();
1483 forAll(edgeMap, subEdgeI)
1485 label edgeI = edgeMap[subEdgeI];
1486 if (edgeI >= internalStart() && subIntStart == edgeMap.
size())
1488 subIntStart = subEdgeI;
1490 if (edgeI >= flatStart() && subFlatStart == edgeMap.
size())
1492 subFlatStart = subEdgeI;
1494 if (edgeI >= openStart() && subOpenStart == edgeMap.
size())
1496 subOpenStart = subEdgeI;
1498 if (edgeI >= multipleStart() && subMultipleStart == edgeMap.
size())
1500 subMultipleStart = subEdgeI;
1507 label subConcaveStart = pointMap.
size();
1509 label subNonFeatStart = pointMap.
size();
1511 forAll(pointMap, subPointI)
1513 label pointI = pointMap[subPointI];
1514 if (pointI >= concaveStart() && subConcaveStart == pointMap.
size())
1516 subConcaveStart = subPointI;
1518 if (pointI >= mixedStart() && subMixedStart == pointMap.
size())
1520 subMixedStart = subPointI;
1524 pointI >= nonFeatureStart()
1525 && subNonFeatStart == pointMap.
size()
1528 subNonFeatStart = subPointI;
1540 label edgeI = regionEdges()[i];
1541 isRegionEdge[edgeI] =
true;
1545 forAll(edgeMap, subEdgeI)
1547 label edgeI = edgeMap[subEdgeI];
1548 if (isRegionEdge[edgeI])
1550 newRegionEdges.
append(subEdgeI);
1553 subRegionEdges.
transfer(newRegionEdges);
1558 if (featurePointEdges().size())
1560 subFeaturePointEdges.
setSize(subNonFeatStart);
1561 for (
label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1563 label pointI = pointMap[subPointI];
1564 const labelList& pEdges = featurePointEdges()[pointI];
1566 labelList& subPEdges = subFeaturePointEdges[subPointI];
1573 subPEdges[i] = edgeMap[pEdges[i]];
1580 vectorField subEdgeDirections(edgeDirections(), edgeMap);
1583 labelList reverseNormalMap(normals().size(), -1);
1588 for (
label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1590 label pointI = pointMap[subPointI];
1591 const labelList& pNormals = featurePointNormals()[pointI];
1595 isSubNormal[pNormals[i]] =
true;
1598 forAll(edgeMap, subEdgeI)
1600 label edgeI = edgeMap[subEdgeI];
1601 const labelList& eNormals = edgeNormals()[edgeI];
1605 isSubNormal[eNormals[i]] =
true;
1609 forAll(isSubNormal, normalI)
1611 if (isSubNormal[normalI])
1613 label subNormalI = normalMap.size();
1614 reverseNormalMap[normalI] = subNormalI;
1615 normalMap.
append(subNormalI);
1624 if (normalDirections().size())
1628 forAll(edgeMap, subEdgeI)
1630 label edgeI = edgeMap[subEdgeI];
1631 const labelList& eNormals = normalDirections()[edgeI];
1633 labelList& subNormals = subNormalDirections[subEdgeI];
1637 if (eNormals[i] >= 0)
1639 subNormals[i] = reverseNormalMap[eNormals[i]];
1650 forAll(edgeMap, subEdgeI)
1652 label edgeI = edgeMap[subEdgeI];
1653 const labelList& eNormals = edgeNormals()[edgeI];
1654 labelList& subNormals = subEdgeNormals[subEdgeI];
1660 for (
label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1662 label pointI = pointMap[subPointI];
1663 const labelList& pNormals = featurePointNormals()[pointI];
1664 labelList& subNormals = subPointNormals[subPointI];
1673 if (normalVolumeTypes().size())
1675 subNormalVolumeTypes =
1678 normalVolumeTypes(),
1701 subNormalVolumeTypes,
1707 subNormalDirections,
1713 subFeaturePointEdges,
1753 select(surf, volType, subPointMap, subEdgeMap);
1764 edgeStat[edgeI] = getEdgeStatus(edgeI);
1766 forAll(pointStat, pointI)
1768 pointStat[pointI] = getPointStatus(pointI);
1772 labelList oldPointToIndex(nOldPoints, -1);
1773 forAll(pointsFromEdge, i)
1775 oldPointToIndex[pointsFromEdge[i]] = i;
1777 forAll(subPointMap, pointI)
1779 label oldPointI = subPointMap[pointI];
1780 label index = oldPointToIndex[oldPointI];
1783 pointStat[pointI] = classifyFeaturePoint(pointI);
1794 sortedToOriginalPoint,
1795 sortedToOriginalEdge
1813 label pointConcaveStart;
1814 label pointMixedStart;
1815 label pointNonFeatStart;
1817 label edgeInternalStart;
1818 label edgeFlatStart;
1819 label edgeOpenStart;
1820 label edgeMultipleStart;
1825 sortedToOriginalPoint,
1826 sortedToOriginalEdge,
1841 forAll(sortedToOriginalPoint, sortedI)
1843 reversePointMap[sortedToOriginalPoint[sortedI]] = sortedI;
1847 forAll(sortedEdges, sortedI)
1857 sortedToOriginalPoint,
1858 sortedToOriginalEdge
1862 concaveStart_ = pointConcaveStart;
1863 mixedStart_ = pointMixedStart;
1864 nonFeatureStart_ = pointNonFeatStart;
1865 internalStart_ = edgeInternalStart;
1866 flatStart_ = edgeFlatStart;
1867 openStart_ = edgeOpenStart;
1868 multipleStart_ = edgeMultipleStart;
1874 const scalar mergeDist,
1893 forAll(oldToMerged, oldI)
1895 label newI = oldToMerged[oldI];
1896 if (pointMap[newI] == -1)
1898 pointMap[newI] = oldI;
1906 const edge& oldE = edges()[edgeI];
1907 newEdges[edgeI] =
edge(oldToMerged[oldE[0]], oldToMerged[oldE[1]]);
1923 edgeStat[edgeI] = getEdgeStatus(edgeI);
1927 forAll(pointStat, pointI)
1929 pointStat[pointI] = getPointStatus(pointI);
1934 forAll(oldToMerged, oldPointI)
1936 nPoints[oldToMerged[oldPointI]]++;
1943 pointStat[pointI] = classifyFeaturePoint(pointI);
1952 sortedToOriginalPoint,
1957 return nNewPoints != nOldPoints;
1963 Info<<
nl <<
"Writing extendedEdgeMesh components to " << prefix
1969 OBJstream convexFtPtStr(prefix +
"_convexFeaturePts.obj");
1970 Info<<
"Writing " << concaveStart_
1971 <<
" convex feature points to " << convexFtPtStr.
name() <<
endl;
1973 for(
label i = 0; i < concaveStart_; i++)
1980 OBJstream concaveFtPtStr(prefix +
"_concaveFeaturePts.obj");
1981 Info<<
"Writing " << mixedStart_-concaveStart_
1982 <<
" concave feature points to "
1985 for(
label i = concaveStart_; i < mixedStart_; i++)
1992 OBJstream mixedFtPtStr(prefix +
"_mixedFeaturePts.obj");
1993 Info<<
"Writing " << nonFeatureStart_-mixedStart_
1994 <<
" mixed feature points to " << mixedFtPtStr.
name() <<
endl;
1996 for(
label i = mixedStart_; i < nonFeatureStart_; i++)
2003 OBJstream mixedFtPtStructureStr(prefix+
"_mixedFeaturePtsStructure.obj");
2005 << nonFeatureStart_-mixedStart_
2006 <<
" mixed feature point structure to "
2007 << mixedFtPtStructureStr.
name() <<
endl;
2009 for(
label i = mixedStart_; i < nonFeatureStart_; i++)
2011 const labelList& ptEds = pointEdges()[i];
2015 const edge&
e = edges()[ptEds[j]];
2016 mixedFtPtStructureStr.
write
2026 OBJstream externalStr(prefix +
"_externalEdges.obj");
2027 Info<<
"Writing " << internalStart_-externalStart_
2028 <<
" external edges to " << externalStr.
name() <<
endl;
2030 for (
label i = externalStart_; i < internalStart_; i++)
2032 const edge&
e = edges()[i];
2038 OBJstream internalStr(prefix +
"_internalEdges.obj");
2039 Info<<
"Writing " << flatStart_-internalStart_
2040 <<
" internal edges to " << internalStr.
name() <<
endl;
2042 for (
label i = internalStart_; i < flatStart_; i++)
2044 const edge&
e = edges()[i];
2050 OBJstream flatStr(prefix +
"_flatEdges.obj");
2051 Info<<
"Writing " << openStart_-flatStart_
2052 <<
" flat edges to " << flatStr.
name() <<
endl;
2054 for (
label i = flatStart_; i < openStart_; i++)
2056 const edge&
e = edges()[i];
2062 OBJstream openStr(prefix +
"_openEdges.obj");
2063 Info<<
"Writing " << multipleStart_-openStart_
2064 <<
" open edges to " << openStr.
name() <<
endl;
2066 for (
label i = openStart_; i < multipleStart_; i++)
2068 const edge&
e = edges()[i];
2074 OBJstream multipleStr(prefix +
"_multipleEdges.obj");
2075 Info<<
"Writing " << edges().size()-multipleStart_
2076 <<
" multiple edges to " << multipleStr.
name() <<
endl;
2078 for (
label i = multipleStart_; i < edges().size(); i++)
2080 const edge&
e = edges()[i];
2086 OBJstream regionStr(prefix +
"_regionEdges.obj");
2087 Info<<
"Writing " << regionEdges_.size()
2088 <<
" region edges to " << regionStr.
name() <<
endl;
2092 const edge&
e = edges()[regionEdges_[i]];
2098 OBJstream edgeDirsStr(prefix +
"_edgeDirections.obj");
2099 Info<<
"Writing " << edgeDirections_.size()
2100 <<
" edge directions to " << edgeDirsStr.
name() <<
endl;
2102 forAll(edgeDirections_, i)
2104 const vector& eVec = edgeDirections_[i];
2105 const edge&
e = edges()[i];
2120 os <<
indent <<
"point classification :" <<
nl;
2122 os <<
indent <<
"convex feature points : "
2123 <<
setw(8) << concaveStart_-convexStart_
2126 os <<
indent <<
"concave feature points : "
2127 <<
setw(8) << mixedStart_-concaveStart_
2130 os <<
indent <<
"mixed feature points : "
2131 <<
setw(8) << nonFeatureStart_-mixedStart_
2134 os <<
indent <<
"other (non-feature) points : "
2135 <<
setw(8) <<
points().size()-nonFeatureStart_
2140 os <<
indent <<
"edge classification :" <<
nl;
2142 os <<
indent <<
"external (convex angle) edges : "
2143 <<
setw(8) << internalStart_-externalStart_
2146 os <<
indent <<
"internal (concave angle) edges : "
2147 <<
setw(8) << flatStart_-internalStart_
2150 os <<
indent <<
"flat region edges : "
2151 <<
setw(8) << openStart_-flatStart_
2154 os <<
indent <<
"open edges : "
2155 <<
setw(8) << multipleStart_-openStart_
2158 os <<
indent <<
"multiply connected edges : "
2159 <<
setw(8) << edges().size()-multipleStart_
2180 else if (nEdNorms == 2)
2182 const vector& n0(norms[edNorms[0]]);
2183 const vector& n1(norms[edNorms[1]]);
2185 if ((n0 & n1) > cosNormalAngleTol_)
2189 else if ((fC0tofC1 & n0) > 0.0)
2198 else if (nEdNorms > 2)
2217 label& pointConcaveStart,
2218 label& pointMixedStart,
2219 label& pointNonFeatStart,
2221 label& edgeInternalStart,
2222 label& edgeFlatStart,
2223 label& edgeOpenStart,
2224 label& edgeMultipleStart
2228 sortedToOriginalPoint = -1;
2231 sortedToOriginalEdge = -1;
2242 forAll(pointStat, pointI)
2244 switch (pointStat[pointI])
2269 label convexStart = 0;
2270 label concaveStart = nConvex;
2271 label mixedStart = concaveStart+nConcave;
2272 label nonFeatStart = mixedStart+nMixed;
2276 pointConcaveStart = concaveStart;
2277 pointMixedStart = mixedStart;
2278 pointNonFeatStart = nonFeatStart;
2280 forAll(pointStat, pointI)
2282 switch (pointStat[pointI])
2285 sortedToOriginalPoint[convexStart++] = pointI;
2289 sortedToOriginalPoint[concaveStart++] = pointI;
2293 sortedToOriginalPoint[mixedStart++] = pointI;
2297 sortedToOriginalPoint[nonFeatStart++] = pointI;
2306 label nExternal = 0;
2307 label nInternal = 0;
2310 label nMultiple = 0;
2314 switch (edgeStat[edgeI])
2344 label externalStart = 0;
2345 label internalStart = nExternal;
2346 label flatStart = internalStart + nInternal;
2347 label openStart = flatStart + nFlat;
2348 label multipleStart = openStart + nOpen;
2352 edgeInternalStart = internalStart;
2353 edgeFlatStart = flatStart;
2354 edgeOpenStart = openStart;
2355 edgeMultipleStart = multipleStart;
2359 switch (edgeStat[edgeI])
2362 sortedToOriginalEdge[externalStart++] = edgeI;
2366 sortedToOriginalEdge[internalStart++] = edgeI;
2370 sortedToOriginalEdge[flatStart++] = edgeI;
2374 sortedToOriginalEdge[openStart++] = edgeI;
2378 sortedToOriginalEdge[multipleStart++] = edgeI;
2405 is.check(
"operator>>(Istream&, sideVolumeType&)");
2417 os << static_cast<label>(vt);
2426 os <<
"// points" <<
nl
2430 <<
"// concaveStart mixedStart nonFeatureStart" <<
nl
2434 <<
"// internalStart flatStart openStart multipleStart" <<
nl
2439 <<
"// normals" <<
nl
2441 <<
"// normal volume types" <<
nl
2443 <<
"// normalDirections" <<
nl
2445 <<
"// edgeNormals" <<
nl
2447 <<
"// featurePointNormals" <<
nl
2449 <<
"// featurePointEdges" <<
nl
2451 <<
"// regionEdges" <<
nl
2456 os.
check(
"Ostream& operator<<(Ostream&, const extendedEdgeMesh&)");
2482 is.
check(
"Istream& operator>>(Istream&, extendedEdgeMesh&)");