71 mag(eHit.rawPoint() - start)
72 <
mag(eHit.rawPoint() - end)
94 for (label i = 0; i < externalStart_; i++)
96 edgeStat[featureEdges_[i]] = REGION;
100 for (label i = externalStart_; i < internalStart_; i++)
102 edgeStat[featureEdges_[i]] = EXTERNAL;
106 for (label i = internalStart_; i < featureEdges_.size(); i++)
108 edgeStat[featureEdges_[i]] = INTERNAL;
126 if (edgeStat[edgeI] == REGION)
130 else if (edgeStat[edgeI] == EXTERNAL)
134 else if (edgeStat[edgeI] == INTERNAL)
140 externalStart_ = nRegion;
141 internalStart_ = externalStart_ + nExternal;
146 featureEdges_.setSize(internalStart_ + nInternal);
149 label externalI = externalStart_;
150 label internalI = internalStart_;
154 if (edgeStat[edgeI] == REGION)
156 featureEdges_[regionI++] = edgeI;
158 else if (edgeStat[edgeI] == EXTERNAL)
160 featureEdges_[externalI++] = edgeI;
162 else if (edgeStat[edgeI] == INTERNAL)
164 featureEdges_[internalI++] = edgeI;
169 calcFeatPoints(edgeStat);
174 void Foam::surfaceFeatures::calcFeatPoints(
const List<edgeStatus>& edgeStat)
180 forAll(pointEdges, pointI)
182 const labelList& pEdges = pointEdges[pointI];
184 label nFeatEdges = 0;
188 if (edgeStat[pEdges[i]] != NONE)
196 featurePoints.append(pointI);
200 featurePoints_.transfer(featurePoints);
205 Foam::label Foam::surfaceFeatures::nextFeatEdge
207 const List<edgeStatus>& edgeStat,
209 const label unsetVal,
210 const label prevEdgeI,
214 const labelList& pEdges = surf_.pointEdges()[vertI];
216 label nextEdgeI = -1;
220 label edgeI = pEdges[i];
225 && edgeStat[edgeI] != NONE
226 && featVisited[edgeI] == unsetVal
253 Foam::surfaceFeatures::labelScalar Foam::surfaceFeatures::walkSegment
256 const List<edgeStatus>& edgeStat,
257 const label startEdgeI,
258 const label startPointI,
259 const label currentFeatI,
263 label edgeI = startEdgeI;
265 label vertI = startPointI;
285 unsetVal = currentFeatI;
289 scalar visitedLength = 0.0;
296 edgeI = nextFeatEdge(edgeStat, featVisited, unsetVal, edgeI, vertI);
298 if (edgeI == -1 || edgeI == startEdgeI)
307 featVisited[edgeI] = currentFeatI;
311 featVisited[edgeI] = -2;
316 const edge&
e = surf_.edges()[edgeI];
318 vertI = e.otherVertex(vertI);
322 visitedLength += e.mag(surf_.localPoints());
326 if (nVisited > surf_.nEdges())
328 Warning<<
"walkSegment : reached iteration limit in walking "
329 <<
"feature edges on surface from edge:" << startEdgeI
330 <<
" vertex:" << startPointI <<
nl
331 <<
"Returning with large length" <<
endl;
333 return labelScalar(nVisited, GREAT);
338 return labelScalar(nVisited, visitedLength);
360 const label externalStart,
361 const label internalStart
365 featurePoints_(featurePoints),
366 featureEdges_(featureEdges),
367 externalStart_(externalStart),
368 internalStart_(externalStart)
376 const scalar includedAngle,
387 findFeatures(includedAngle);
389 if (minLen > 0 || minElems > 0)
391 trimFeatures(minLen, minElems);
404 featurePoints_(featInfoDict.
lookup(
"featurePoints")),
405 featureEdges_(featInfoDict.
lookup(
"featureEdges")),
406 externalStart_(readLabel(featInfoDict.
lookup(
"externalStart"))),
407 internalStart_(readLabel(featInfoDict.
lookup(
"internalStart")))
430 externalStart_ = readLabel(featInfoDict.
lookup(
"externalStart"));
431 internalStart_ = readLabel(featInfoDict.
lookup(
"internalStart"));
439 featurePoints_(sf.featurePoints()),
440 featureEdges_(sf.featureEdges()),
441 externalStart_(sf.externalStart()),
442 internalStart_(sf.internalStart())
450 const bool regionEdges,
451 const bool externalEdges,
452 const bool internalEdges
461 for (label i = 0; i < externalStart_; i++)
463 selectedEdges.
append(featureEdges_[i]);
471 for (label i = externalStart_; i < internalStart_; i++)
473 selectedEdges.
append(featureEdges_[i]);
481 for (label i = internalStart_; i < featureEdges_.size(); i++)
483 selectedEdges.
append(featureEdges_[i]);
487 return selectedEdges.
shrink();
496 (180.0-includedAngle)
501 const vectorField& faceNormals = surf_.faceNormals();
509 const labelList& eFaces = edgeFaces[edgeI];
511 if (eFaces.
size() != 2)
514 edgeStat[edgeI] = REGION;
518 label face0 = eFaces[0];
519 label face1 = eFaces[1];
521 if (surf_[face0].region() != surf_[face1].region())
523 edgeStat[edgeI] = REGION;
527 if ((faceNormals[face0] & faceNormals[face1]) < minCos)
533 surf_[face1].
centre(points)
534 - surf_[face0].
centre(points);
536 if ((f0Tof1 & faceNormals[face0]) > 0.0)
538 edgeStat[edgeI] = INTERNAL;
542 edgeStat[edgeI] = EXTERNAL;
549 setFromStatus(edgeStat);
575 label startEdgeI = 0;
580 for (; startEdgeI < edgeStat.
size(); startEdgeI++)
584 edgeStat[startEdgeI] != NONE
585 && featLines[startEdgeI] == -1
593 if (startEdgeI == edgeStat.
size())
600 featLines[startEdgeI] = featI;
602 const edge& startEdge = surf_.edges()[startEdgeI];
605 labelScalar leftPath =
616 labelScalar rightPath =
629 (leftPath.len_ + rightPath.len_ < minLen)
630 || (leftPath.n_ + rightPath.n_ < minElems)
636 featLines[startEdgeI] = -2;
668 label edgeI = featureEdges_[i];
670 if (featLines[edgeI] == -2)
672 edgeStat[edgeI] = NONE;
677 setFromStatus(edgeStat);
685 featInfoDict.
add(
"externalStart", externalStart_);
686 featInfoDict.
add(
"internalStart", internalStart_);
687 featInfoDict.
add(
"featureEdges", featureEdges_);
688 featInfoDict.
add(
"featurePoints", featurePoints_);
690 featInfoDict.
write(writeFile);
704 OFstream regionStr(prefix +
"_regionEdges.obj");
705 Pout<<
"Writing region edges to " << regionStr.
name() <<
endl;
708 for (label i = 0; i < externalStart_; i++)
710 const edge& e = surf_.edges()[featureEdges_[i]];
714 regionStr <<
"l " << verti-1 <<
' ' << verti <<
endl;
718 OFstream externalStr(prefix +
"_externalEdges.obj");
719 Pout<<
"Writing external edges to " << externalStr.
name() <<
endl;
722 for (label i = externalStart_; i < internalStart_; i++)
724 const edge& e = surf_.edges()[featureEdges_[i]];
728 externalStr <<
"l " << verti-1 <<
' ' << verti <<
endl;
731 OFstream internalStr(prefix +
"_internalEdges.obj");
732 Pout<<
"Writing internal edges to " << internalStr.
name() <<
endl;
735 for (label i = internalStart_; i < featureEdges_.size(); i++)
737 const edge& e = surf_.edges()[featureEdges_[i]];
741 internalStr <<
"l " << verti-1 <<
' ' << verti <<
endl;
744 OFstream pointStr(prefix +
"_points.obj");
745 Pout<<
"Writing feature points to " << pointStr.
name() <<
endl;
749 label pointI = featurePoints_[i];
781 const pointField& surfPoints = surf_.localPoints();
785 label surfPointI = pointLabels[i];
787 const point& surfPt = surfPoints[surfPointI];
789 point maxDistPt(maxDist[i], maxDist[i], maxDist[i]);
791 treeBoundBox tightest(surfPt - maxDistPt, surfPt + maxDistPt);
792 scalar tightestDist = Foam::GREAT;
804 <<
"Problem for point "
805 << surfPointI <<
" in tree " << ppTree.
octreeBb()
811 magSqr(samples[sampleI] - surfPt)
815 nearest.insert(sampleI, surfPointI);
827 <<
"Dumping nearest surface feature points to nearestSamples.obj"
829 <<
"View this Lightwave-OBJ file with e.g. javaview" <<
endl
832 OFstream objStream(
"nearestSamples.obj");
838 iter != nearest.end();
844 objStream<<
"l " << vertI-1 <<
' ' << vertI <<
endl;
860 const scalar minSampleDist
863 const pointField& surfPoints = surf_.localPoints();
864 const edgeList& surfEdges = surf_.edges();
866 scalar maxSearch =
max(maxDist);
867 vector span(maxSearch, maxSearch, maxSearch);
886 label surfEdgeI = selectedEdges[i];
888 const edge& e = surfEdges[surfEdgeI];
890 if (debug && (i % 1000) == 0)
892 Pout<<
"looking at surface feature edge " << surfEdgeI
893 <<
" verts:" << e <<
" points:" << surfPoints[e[0]]
894 <<
' ' << surfPoints[e[1]] <<
endl;
899 scalar eMag =
mag(eVec);
914 point edgePoint(surfPoints[e.
start()] + s*eVec);
916 treeBoundBox tightest(edgePoint - span, edgePoint + span);
917 scalar tightestDist = Foam::GREAT;
931 if (tightestDist < maxDist[sampleI])
933 nearest.insert(sampleI, surfEdgeI);
943 s +=
max(minSampleDist*eMag, sampleDist[sampleI]);
945 if (s >= (1-minSampleDist)*eMag)
960 Pout<<
"Dumping nearest surface edges to nearestEdges.obj\n"
961 <<
"View this Lightwave-OBJ file with e.g. javaview\n" <<
endl;
963 OFstream objStream(
"nearestEdges.obj");
969 iter != nearest.end();
973 label sampleI = iter.key();
977 const edge& e = surfEdges[iter()];
984 objStream<<
"l " << vertI-1 <<
' ' << vertI <<
endl;
1005 const scalar minSampleDist
1023 const pointField& surfPoints = surf_.localPoints();
1024 const edgeList& surfEdges = surf_.edges();
1026 scalar maxSearch =
max(maxDist);
1027 vector span(maxSearch, maxSearch, maxSearch);
1039 label surfEdgeI = selectedEdges[i];
1041 const edge& e = surfEdges[surfEdgeI];
1043 if (debug && (i % 1000) == 0)
1045 Pout<<
"looking at surface feature edge " << surfEdgeI
1046 <<
" verts:" << e <<
" points:" << surfPoints[e[0]]
1047 <<
' ' << surfPoints[e[1]] <<
endl;
1052 scalar eMag =
mag(eVec);
1067 point edgePoint(surfPoints[e.
start()] + s*eVec);
1069 treeBoundBox tightest(edgePoint - span, edgePoint + span);
1070 scalar tightestDist = Foam::GREAT;
1087 const edge& e = sampleEdges[sampleEdgeI];
1089 if (tightestDist < maxDist[e.
start()])
1108 if (s >= (1-minSampleDist)*eMag)
1122 Pout<<
"Dumping nearest surface feature edges to nearestEdges.obj\n"
1123 <<
"View this Lightwave-OBJ file with e.g. javaview\n" <<
endl;
1125 OFstream objStream(
"nearestEdges.obj");
1131 iter != nearest.end();
1135 label sampleEdgeI = iter.key();
1137 const edge& sampleEdge = sampleEdges[sampleEdgeI];
1146 objStream<<
"l " << vertI-1 <<
' ' << vertI <<
endl;
1160 const vector& searchSpan,
1170 const pointField& localPoints = surf_.localPoints();
1189 const point& sample = samples[i];
1191 treeBoundBox tightest(sample - searchSpan, sample + searchSpan);
1193 scalar tightestDist =
magSqr(searchSpan);
1210 edgeLabel[i] = selectedEdges[index];
1214 const edge& e = surf_.edges()[edgeLabel[i]];
1219 localPoints[e.
start()],
1220 localPoints[e.
end()],
1225 edgeEndPoint[i] = pHit.
index();
1240 const vector& searchSpan,
1248 pointOnFeature.
setSize(selectedSampleEdges.
size());
1257 surf_.localPoints(),
1266 forAll(selectedSampleEdges, i)
1268 const edge& e = sampleEdges[selectedSampleEdges[i]];
1274 treeBoundBox tightest(eMid - searchSpan, eMid + searchSpan);
1292 edgeLabel[i] = featureEdges_[index];
1307 "Foam::surfaceFeatures::operator=(const Foam::surfaceFeatures&)"
1308 ) <<
"Attempted assignment to self"
1316 "Foam::surfaceFeatures::operator=(const Foam::surfaceFeatures&)"
1317 ) <<
"Operating on different surfaces"