96 const point& pt = pts[i];
98 os <<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
endl;
107 Info<<
"Dumping borderPoints as Lightwave .obj file to " << fName
108 <<
"\nThis can be visualized with e.g. javaview (www.javaview.de)\n\n";
112 forAll(borderPoint, pointI)
114 if (borderPoint[pointI] != -1)
118 os <<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
endl;
128 Info<<
"Dumping borderEdges as Lightwave .obj file to " << fName
129 <<
"\nThis can be visualized with e.g. javaview (www.javaview.de)\n\n";
137 if (borderEdge[edgeI])
154 Info<<
"Dumping connectedFaces as Lightwave .obj file to " << fName
155 <<
"\nThis can be visualized with e.g. javaview (www.javaview.de)\n\n";
162 iter != connectedFaces.
end();
170 os <<
"v " << ctr.x() <<
' ' << ctr.y() <<
' ' << ctr.z() <<
endl;
175 void testSortedEdgeFaces(
const triSurface& surf)
182 const labelList& myFaces = edgeFaces[edgeI];
183 const labelList& sortMyFaces = sortedEdgeFaces[edgeI];
187 if (
findIndex(sortMyFaces, myFaces[i]) == -1)
194 if (
findIndex(myFaces, sortMyFaces[i]) == -1)
204 label markBorderEdges
211 label nBorderEdges = 0;
217 if (edgeFaces[edgeI].size() == 4)
219 borderEdge[edgeI] =
true;
227 dumpEdges(surf, borderEdge);
236 label markBorderPoints
248 forAll(pointEdges, pointI)
250 const labelList& pEdges = pointEdges[pointI];
252 label nBorderEdges = 0;
256 if (borderEdge[pEdges[i]])
262 if (nBorderEdges == 2 && borderPoint[pointI] == -1)
264 borderPoint[pointI] = nPoints++;
268 label nBorderPoints = nPoints - surf.
nPoints();
272 dumpPoints(surf, borderPoint);
275 return nBorderPoints;
281 scalar minEdgeLen(
const triSurface& surf,
const label pointI)
287 scalar minLen = GREAT;
291 label edgeI = pEdges[i];
293 scalar len = surf.
edges()[edgeI].mag(points);
315 label edgeI = edgeLabels[i];
336 FatalErrorIn(
"findEdge(..)") <<
"Cannot find edge with labels " << v0
337 <<
' ' << v1 <<
" in candidates " << edgeLabels
350 const label otherEdgeI,
358 label edgeI = fEdges[i];
375 FatalErrorIn(
"otherEdge(..)") <<
"Cannot find other edge on face " << faceI
377 <<
" connected to point " << pointI
394 const label startFaceI,
395 const label startEdgeI,
396 const label startPointI,
402 label faceI = startFaceI;
403 label edgeI = startEdgeI;
404 label pointI = startPointI;
415 edgeI =
otherEdge(surf, faceI, edgeI, pointI);
417 if (borderEdge[edgeI])
419 if (!faceToEdge.
insert(faceI, edgeI))
430 else if (!faceToPoint.
insert(faceI, pointI))
439 if (eFaces.
size() != 2)
442 <<
"Can only handle edges with 2 or 4 edges for now."
446 if (eFaces[0] == faceI)
450 else if (eFaces[1] == faceI)
466 pointI = surf.
edges()[edgeI].otherVertex(pointI);
468 if (borderPoint[pointI] == -1)
483 const label firstFaceI,
484 const label sharedEdgeI
489 const edge& e = surf.
edges()[sharedEdgeI];
496 bool edgeOrder = (f[f.
fcIndex(startIndex)] == e.
end());
504 label faceIndex =
findIndex(eFaces, firstFaceI);
509 return eFaces[eFaces.
rcIndex(faceIndex)];
514 return eFaces[eFaces.
fcIndex(faceIndex)];
538 iter != faceToEdge.
end();
542 label edgeI = iter();
544 if (!edgeDone[edgeI])
546 edgeDone[edgeI] =
true;
554 const labelList& eFaces = sortedEdgeFaces[edgeI];
558 label faceI = eFaces[i];
560 if (faceToEdge.
found(faceI))
566 else if (face1I == -1)
575 if (face0I == -1 && face1I == -1)
577 Info<<
"Writing surface to errorSurf.ftr" <<
endl;
579 surf.write(
"errorSurf.ftr");
582 <<
"Cannot find two faces using border edge " << edgeI
583 <<
" verts:" << edges[edgeI]
584 <<
" eFaces:" << eFaces << endl
585 <<
"face0I:" << face0I
586 <<
" face1I:" << face1I <<
nl
587 <<
"faceToEdge:" << faceToEdge <<
nl
588 <<
"faceToPoint:" << faceToPoint
589 <<
"Written surface to errorSurf.ftr"
595 const edge& e = edges[edgeI];
605 vector e0 = (points[v0] - points[e.
start()]) ^ eVec;
618 scalar magMidVec =
mag(midVec);
620 if (magMidVec > SMALL)
625 borderPointVec[e.
start()] += midVec;
626 borderPointVec[e.
end()] += midVec;
646 iter != faceToEdge.
end();
650 label faceI = iter.key();
656 if (pointMap[f[fp]] != -1)
658 newTris[faceI][fp] = pointMap[f[fp]];
667 bool splitBorderEdges
679 if (borderEdge[edgeI])
683 if (borderPoint[e.
start()] == -1 && borderPoint[e.
end()] == -1)
687 edgesToBeSplit[nSplit++] = edgeI;
691 edgesToBeSplit.
setSize(nSplit);
695 Info<<
"Splitting surface along " << nSplit <<
" borderEdges that don't"
696 <<
" neighbour other borderEdges" <<
nl <<
endl;
698 surf = triSurfaceTools::greenRefine(surf, edgesToBeSplit);
713 int main(
int argc,
char *argv[])
729 Info<<
"Reading surface from " << inSurfName <<
endl;
734 testSortedEdgeFaces(surf);
738 markBorderEdges(debug, surf, borderEdge);
743 markBorderPoints(debug, surf, borderEdge, borderPoint);
746 splitBorderEdges(surf, borderEdge, borderPoint);
749 Info<<
"Writing split surface to " << outSurfName <<
nl <<
endl;
750 surf.write(outSurfName);
751 Info<<
"Finished writing surface to " << outSurfName <<
nl <<
endl;
755 label nOldBorderEdges = -1;
756 label nOldBorderPoints = -1;
765 label nBorderEdges = markBorderEdges(debug, surf, borderEdge);
767 if (nBorderEdges == 0)
769 Info<<
"Found no border edges. Exiting." <<
nl <<
nl;
777 label nBorderPoints =
786 if (nBorderPoints == 0)
788 Info<<
"Found no border points. Exiting." <<
nl <<
nl;
794 <<
" border edges :" << nBorderEdges <<
nl
795 <<
" border points:" << nBorderPoints <<
nl
800 nBorderPoints == nOldBorderPoints
801 && nBorderEdges == nOldBorderEdges
804 Info<<
"Stopping since number of border edges and point is same"
805 <<
" as in previous iteration" <<
nl <<
endl;
815 label startEdgeI = -1;
816 label startPointI = -1;
820 if (borderEdge[edgeI])
824 if ((borderPoint[e[0]] != -1) && (borderPoint[e[1]] == -1))
831 else if ((borderPoint[e[0]] == -1) && (borderPoint[e[1]] != -1))
841 if (startEdgeI == -1)
843 Info<<
"Cannot find starting point of splitLine\n" <<
endl;
851 label firstFaceI = eFaces[0];
855 label secondFaceI = sharedFace(surf, firstFaceI, startEdgeI);
857 Info<<
"Starting local walk from:" << endl
858 <<
" edge :" << startEdgeI << endl
859 <<
" point:" << startPointI << endl
860 <<
" face0:" << firstFaceI << endl
861 <<
" face1:" << secondFaceI << endl
869 faceToEdge.
insert(firstFaceI, startEdgeI);
885 faceToEdge.
insert(secondFaceI, startEdgeI);
901 Info<<
"Finished local walk and visited" <<
nl
902 <<
" border edges :" << faceToEdge.
size() <<
nl
903 <<
" border points(but not edges):" << faceToPoint.
size() <<
nl
908 dumpFaces(
"faceToEdge.obj", surf, faceToEdge);
909 dumpFaces(
"faceToPoint.obj", surf, faceToPoint);
921 calcPointVecs(surf, faceToEdge, faceToPoint, borderPointVec);
926 newPoints.
setSize(newPoints.size() + nBorderPoints);
928 forAll(borderPoint, pointI)
930 label newPointI = borderPoint[pointI];
934 scalar minLen = minEdgeLen(surf, pointI);
936 vector n = borderPointVec[pointI];
939 newPoints[newPointI] = newPoints[pointI] + 0.1 * minLen * n;
955 newTris[faceI].region() = surf[faceI].region();
959 renumberFaces(surf, borderPoint, faceToEdge, newTris);
961 renumberFaces(surf, borderPoint, faceToPoint, newTris);
971 const point& pt = newPoints[f[fp]];
973 if (
mag(pt) >= GREAT/2)
975 Info<<
"newTri:" << faceI <<
" verts:" << f
976 <<
" vert:" << f[fp] <<
" point:" << pt <<
endl;
984 if (debug || (iteration != 0 && (iteration % 20) == 0))
986 Info<<
"Writing surface to " << outSurfName <<
nl <<
endl;
988 surf.write(outSurfName);
990 Info<<
"Finished writing surface to " << outSurfName <<
nl <<
endl;
994 nOldBorderEdges = nBorderEdges;
995 nOldBorderPoints = nBorderPoints;
1001 Info<<
"Writing final surface to " << outSurfName <<
nl <<
endl;
1003 surf.write(outSurfName);