44 void Foam::surfaceIntersection::writeOBJ(
const point& pt, Ostream& os)
46 os <<
"v " << pt.x() <<
' ' << pt.y() <<
' ' << pt.z() <<
endl;
52 const List<point>& pts,
53 const List<edge>& edges,
63 const edge&
e = edges[i];
65 os <<
"l " << e.start()+1 <<
' ' << e.
end()+1 <<
endl;
71 Foam::scalar Foam::surfaceIntersection::minEdgeLen
73 const triSurface& surf,
77 const labelList& pEdges = surf.pointEdges()[pointI];
79 scalar minLen = GREAT;
83 const edge& e = surf.edges()[pEdges[pEdgeI]];
85 minLen =
min(minLen, e.mag(surf.localPoints()));
93 Foam::label Foam::surfaceIntersection::getEdge
95 const triSurface& surf,
100 const labelledTri&
f = surf.localFaces()[faceI];
102 edge faceEdge(f[fp], f[(fp+1) % 3]);
104 const labelList& eLabels = surf.faceEdges()[faceI];
108 const label edgeI = eLabels[eI];
110 if (surf.edges()[edgeI] == faceEdge)
118 "surfaceIntersection::getEdge(const triSurface&"
119 ", const label, const label"
120 ) <<
"Problem:: Cannot find edge with vertices " << faceEdge
121 <<
" in face " << faceI
129 void Foam::surfaceIntersection::removeDuplicates
135 bool hasDuplicate =
false;
137 label prevVertI = -1;
141 label newVertI = map[elems[elemI]];
143 if (newVertI == prevVertI)
149 prevVertI = newVertI;
160 elems[elemI++] = map[oldElems[0]];
162 for(label vertI = 1; vertI < oldElems.size(); vertI++)
165 label newVertI = map[oldElems[vertI]];
167 if (newVertI != elems[elems.size()-1])
169 elems[elemI++] = newVertI;
172 elems.setSize(elemI);
178 void Foam::surfaceIntersection::inlineRemap
186 elems[elemI] = map[elems[elemI]];
199 HashSet<edge, Hash<edge> > uniqueEdges(10*edges.size());
210 const edge& e = edges[edgeI];
214 (e.start() != e.end())
215 && (uniqueEdges.find(e) == uniqueEdges.end())
219 uniqueEdges.insert(e);
221 map[edgeI] = newEdgeI;
223 newEdges[newEdgeI++] =
e;
251 label elem = elems[elemI];
253 if (uniqueElems.find(elem) == uniqueElems.end())
256 uniqueElems.insert(elem);
258 map[elemI] = newElemI;
260 newElems[newElemI++] = elem;
264 newElems.setSize(newElemI);
270 void Foam::surfaceIntersection::writeIntersectedEdges
272 const triSurface& surf,
284 forAll(cutPoints(), cutPointI)
286 writeOBJ(cutPoints()[cutPointI], os);
289 forAll(edgeCutVerts, edgeI)
291 const labelList& extraVerts = edgeCutVerts[edgeI];
293 if (extraVerts.size())
295 const edge& e = surf.edges()[edgeI];
298 os <<
"l " << e.start()+1 <<
' '
299 << extraVerts[0] + surf.nPoints() + 1 <<
endl;
301 for(label i = 1; i < extraVerts.size(); i++)
303 os <<
"l " << extraVerts[i-1] + surf.nPoints() + 1 <<
' '
304 << extraVerts[i] + surf.nPoints() + 1 <<
endl;
307 os <<
"l " << extraVerts[extraVerts.size()-1] + surf.nPoints() + 1
308 <<
' ' << e.end()+1 <<
endl;
315 Foam::label Foam::surfaceIntersection::classify
317 const scalar startTol,
324 if (
mag(p - points[e.start()]) < startTol)
328 else if (
mag(p - points[e.end()]) < endTol)