38 template<
class SrcPatchType,
class TgtPatchType>
41 const label patchFacei,
48 isSrc ? srcFaceTris_[patchFacei] : tgtFaceTris_[patchFacei];
50 forAll(patchFaceTris, patchFaceTrii)
52 const label trii = patchFaceTris[patchFaceTrii];
54 if (triPoints_[trii] != FixedList<label, 3>({-1, -1, -1}))
56 forAll(triEdges_[trii], triEdgei)
58 const label edgei = triEdges_[trii][triEdgei];
61 const edge
e = triEdgePoints(trii, triEdgei);
65 <<
"Tri #" << trii <<
"'s tri-edge #" << triEdgei
66 <<
" (edge #" << triEdges_[trii][triEdgei] <<
") has "
75 <<
"Tri #" << trii <<
" references edge #" << edgei
80 const label otherTrii = edgeTris_[edgei][!edgeTrii];
84 const label otherTriEdgei =
86 if (otherTriEdgei == -1)
89 <<
"Edge #" << edgei <<
" references tri #"
90 << otherTrii <<
" but the reverse is not true"
96 const edge otherE = triEdgePoints(otherTrii, otherTriEdgei);
97 if (edge::compare(
e, otherE) != -1)
100 <<
"Edge #" << edgei <<
' ' << edgePoints(edgei)
101 <<
" is not the same in adjacent tri #" << trii
102 <<
' ' << triPoints(trii) <<
" and tri #"
103 << otherTrii <<
' ' << triPoints(otherTrii)
111 if (edgeFrontEdges_[edgei] != -1)
114 const label frontEdgei = edgeFrontEdges_[edgei];
117 frontEdgeEdges_.size() <= frontEdgei
118 || frontEdgeEdges_[frontEdgei] != edgei
122 <<
"Edge #" << edgei <<
" is marked as part of the "
123 <<
"front but is not in the front edge list"
128 const label trii0 = edgeTris_[edgei][0];
129 const label trii1 = edgeTris_[edgei][1];
134 || (triSrcFace_[trii0] == -1) == (triSrcFace_[trii1] == -1)
138 <<
"Front edge #" << edgei
139 <<
" does not connect a source-tri to a target-tri"
157 template<
class SrcPatchType,
class TgtPatchType>
160 const label patchEdgei,
167 isSrc ? this->srcPatch_.edgeFaces() : this->tgtPatch_.edgeFaces();
169 const labelList patchFaceis = patchEdgePatchFaces[patchEdgei];
173 checkPatchFace(patchFaceis[i], isSrc);
180 template<
class SrcPatchType,
class TgtPatchType>
189 isSrc ? srcFaceTris_ : tgtFaceTris_;
191 forAll(patchFaceTris, patchFacei)
193 checkPatchFace(patchFacei, isSrc);
200 template<
class SrcPatchType,
class TgtPatchType>
210 && intersectEdgeFaces_[edgei] !=
labelPair(-1, -1)
214 <<
"Attempted to remove edge #" << edgei <<
" which is still "
215 <<
"connected to triangles " << edgeTris_[edgei] <<
" and faces "
216 << intersectEdgeFaces_[edgei]
221 removedEdges_.append(edgei);
223 if (edgeFrontEdges_[edgei] != -1)
225 frontEdgeEdges_[edgeFrontEdges_[edgei]] = -1;
226 edgeFrontEdges_[edgei] = -1;
231 template<
class SrcPatchType,
class TgtPatchType>
237 triPoints_[trii] =
triFace(-1, -1, -1);
240 const bool isSrc = triSrcFace_[trii] != -1;
242 const label patchFacei = isSrc ? triSrcFace_[trii] : triTgtFace_[trii];
244 DynamicList<label>& patchFaceTris =
245 isSrc ? srcFaceTris_[patchFacei] : tgtFaceTris_[patchFacei];
247 label patchFaceTrii = patchFaceTris.size() - 1;
249 for (; patchFaceTris[patchFaceTrii] != trii; -- patchFaceTrii);
251 for (; patchFaceTrii < patchFaceTris.size() - 1; ++ patchFaceTrii)
253 patchFaceTris[patchFaceTrii] = patchFaceTris[patchFaceTrii + 1];
256 patchFaceTris.resize(patchFaceTris.size() - 1);
259 triSrcFace_[trii] = -1;
260 triTgtFace_[trii] = -1;
262 if (triCandidateTris_[trii] != -1)
264 candidateTriTris_[triCandidateTris_[trii]] = -1;
265 triCandidateTris_[trii] = -1;
268 if (triMarkedTris_[trii] != -1)
270 markedTriTris_[triMarkedTris_[trii]] = -1;
271 triMarkedTris_[trii] = -1;
274 forAll(triEdges_[trii], i)
276 const label edgei = triEdges_[trii][i];
278 edgeTris_[edgei][edgeTris_[edgei][1] == trii] = -1;
283 && intersectEdgeFaces_[edgei] ==
labelPair(-1, -1)
290 triEdges_[trii] = FixedList<label, 3>({-1, -1, -1});
292 removedTris_.append(trii);
296 template<
class SrcPatchType,
class TgtPatchType>
299 if (removedTris_.size())
301 return removedTris_.remove();
305 triPoints_.append(
triFace(-1, -1, -1));
306 triEdges_.append(FixedList<label, 3>({-1, -1, -1}));
307 triSrcFace_.append(-1);
308 triTgtFace_.append(-1);
309 triCandidateTris_.append(-1);
310 triMarkedTris_.append(-1);
311 return triPoints_.size() - 1;
316 template<
class SrcPatchType,
class TgtPatchType>
319 if (removedEdges_.size())
321 return removedEdges_.remove();
325 edgeTris_.append({-1, -1});
326 intersectEdgeFaces_.append({-1, -1});
327 edgeFrontEdges_.append(-1);
328 return edgeTris_.size() - 1;
333 template<
class SrcPatchType,
class TgtPatchType>
336 const label pointi = srcPoints_.size();
338 srcPoints_.append(point::uniform(NaN));
339 srcPointNormals_.append(vector::uniform(NaN));
340 tgtPoints_.append(point::uniform(NaN));
341 pointPoints_.append(pointi);
342 this->pointSrcFaces_.append(-1);
343 this->pointTgtFaces_.append(-1);
344 this->pointSrcEdges_.append(-1);
345 this->pointTgtEdges_.append(-1);
346 this->pointSrcPoints_.append(-1);
347 this->pointTgtPoints_.append(-1);
352 template<
class SrcPatchType,
class TgtPatchType>
356 const label triPointi
359 return pointPoints_[triPoints_[trii][triPointi]];
363 template<
class SrcPatchType,
class TgtPatchType>
370 forAll(triPoints_[trii], triPointi)
372 result[triPointi] = triPoint(trii, triPointi);
378 template<
class SrcPatchType,
class TgtPatchType>
390 result[triPointi] = values[triPoint(trii, triPointi)];
396 template<
class SrcPatchType,
class TgtPatchType>
404 forAll(triEdges_[trii], triEdgei)
406 result[triEdgei] = edgeTris_[triEdges_[trii][triEdgei]][0] == trii;
412 template<
class SrcPatchType,
class TgtPatchType>
417 const label otherTrii
420 FixedList<label, 3> result({-1, -1, -1});
421 forAll(triPoints_[trii], triPointi)
423 forAll(triPoints_[otherTrii], otherTriPointi)
427 triPoint(trii, triPointi)
428 == triPoint(otherTrii, otherTriPointi)
431 result[triPointi] = otherTriPointi;
439 template<
class SrcPatchType,
class TgtPatchType>
444 const label otherTrii
447 FixedList<label, 3> result({-1, -1, -1});
448 forAll(triEdges_[trii], triEdgei)
450 forAll(triEdges_[otherTrii], otherTriEdgei)
454 triEdges_[trii][triEdgei]
455 == triEdges_[otherTrii][otherTriEdgei]
458 result[triEdgei] = otherTriEdgei;
466 template<
class SrcPatchType,
class TgtPatchType>
475 triPoint(trii, triEdgei),
476 triPoint(trii, (triEdgei + 1) % 3)
481 template<
class SrcPatchType,
class TgtPatchType>
487 const label edgeSidei = edgeTris_[edgei][0] == -1;
489 const label trii = edgeTris_[edgei][edgeSidei];
492 const edge
e = triEdgePoints(trii, triEdgei);
494 return edgeSidei == 0 ?
e :
e.reverseEdge();
498 template<
class SrcPatchType,
class TgtPatchType>
502 const label patchFacei,
503 const label patchFacePointi,
509 ? this->srcPointPoints_
511 this->srcPatch_.localFaces()[patchFacei][patchFacePointi]
513 : this->tgtPointPoints_
515 this->tgtPatch_.localFaces()[patchFacei][patchFacePointi]
520 template<
class SrcPatchType,
class TgtPatchType>
524 const label patchFacei,
529 forAll(result, patchFacePointi)
531 result[patchFacePointi] =
532 patchFacePoint(patchFacei, patchFacePointi, isSrc);
538 template<
class SrcPatchType,
class TgtPatchType>
543 const label patchFacei,
549 forAll(result, patchFacePointi)
551 result[patchFacePointi] =
552 values[patchFacePoint(patchFacei, patchFacePointi, isSrc)];
558 template<
class SrcPatchType,
class TgtPatchType>
562 const label patchFacei,
567 isSrc ? this->srcPatch_.localFaces() : this->tgtPatch_.localFaces();
569 isSrc ? this->srcPatch_.faceEdges() : this->tgtPatch_.faceEdges();
571 isSrc ? this->srcPatch_.edges() : this->tgtPatch_.edges();
575 const edge&
e = localEdges[faceEdges[patchFacei][i]];
576 const edge fe = localFaces[patchFacei].faceEdge(i);
577 result[i] = edge::compare(
e, fe) > 0;
583 template<
class SrcPatchType,
class TgtPatchType>
588 const label patchFacei,
589 const label otherPatchFacei,
593 const triFace pointis = patchFacePoints(patchFacei, isSrc);
594 const triFace otherPointis = patchFacePoints(otherPatchFacei, !isSrc);
595 FixedList<label, 3> result({-1, -1, -1});
598 forAll(otherPointis, otheri)
600 if (pointis[i] == otherPointis[otheri])
610 template<
class SrcPatchType,
class TgtPatchType>
614 const label patchFacei,
615 const label patchFacePointi,
621 ? this->srcPatch_.localFaces()[patchFacei][patchFacePointi]
622 : this->tgtPatch_.localFaces()[patchFacei][patchFacePointi];
626 template<
class SrcPatchType,
class TgtPatchType>
630 const label patchFacei,
637 result[i] = patchFacePatchPoint(patchFacei, i, isSrc);
643 template<
class SrcPatchType,
class TgtPatchType>
647 const label patchFacei,
648 const label patchFaceEdgei,
654 ? this->srcPatch_.
faceEdges()[patchFacei][patchFaceEdgei]
655 : this->tgtPatch_.faceEdges()[patchFacei][patchFaceEdgei];
659 template<
class SrcPatchType,
class TgtPatchType>
663 const label patchFacei,
670 result[i] = patchFacePatchEdge(patchFacei, i, isSrc);
676 template<
class SrcPatchType,
class TgtPatchType>
685 isSrc ? this->srcPatch_.pointEdges() : this->tgtPatch_.pointEdges();
688 isSrc ? this->pointSrcPoints_ : this->pointTgtPoints_;
690 isSrc ? this->pointSrcEdges_ : this->pointTgtEdges_;
692 auto nPointPatchEdges = [&](
const label pointi)
694 const label patchPointi = pointPatchPoints[pointi];
696 if (patchPointi == -1)
698 return pointPatchEdges[pointi] == -1 ?
label(0) :
label(1);
702 return patchPointPatchEdges[patchPointi].size();
706 auto pointPatchEdge = [&]
712 const label patchPointi = pointPatchPoints[pointi];
714 if (patchPointi == -1)
716 return pointPatchEdges[pointi];
720 return patchPointPatchEdges[patchPointi][i];
724 const edge&
e = edgePoints(edgei);
725 const label pointi0 =
e.first(), pointi1 =
e.last();
727 label patchEdgei = -1;
729 for (
label i0 = 0; i0 < nPointPatchEdges(pointi0); ++ i0)
731 for (
label i1 = 0; i1 < nPointPatchEdges(pointi1); ++ i1)
733 const label patchEdgei0 = pointPatchEdge(pointi0, i0);
734 const label patchEdgei1 = pointPatchEdge(pointi1, i1);
736 if (patchEdgei0 == patchEdgei1)
738 if (patchEdgei != -1 && patchEdgei != patchEdgei0)
741 <<
"Edge #" << edgei <<
" (points " <<
e
742 <<
") is associated with two or more different "
743 << (isSrc ?
"source" :
"target")
744 <<
" patch edges. This should not be possible."
748 patchEdgei = patchEdgei0;
757 template<
class SrcPatchType,
class TgtPatchType>
764 return labelPair(edgePatchEdge(edgei,
true), edgePatchEdge(edgei,
false));
768 template<
class SrcPatchType,
class TgtPatchType>
772 const FixedList<label, 3>& edgeis,
773 const label patchFacei,
781 const label edgei = edgeis[triEdgei];
783 if (edgei == -1)
continue;
785 const label otherTrii = edgeTris_[edgei][edgeTris_[edgei][0] == -1];
787 if (otherTrii == -1)
continue;
789 const label otherTriEdgei =
findIndex(triEdges_[otherTrii], edgei);
791 const edge eThis = pointis.faceEdge(triEdgei);
792 const edge eOther = triEdgePoints(otherTrii, otherTriEdgei);
794 if (edge::compare(eThis, eOther) != -1)
797 <<
"Edge #" << edgei <<
' ' << edgePoints(edgei)
798 <<
" is not the same in the new tri " << pointis <<
' '
799 << edgeis <<
" and the existing adjacent tri "
800 << triPoints(otherTrii) <<
' ' << triEdges_[otherTrii]
807 const label trii = newTrii();
810 triPoints_[trii] = pointis;
814 triEdges_[trii] = edgeis;
815 forAll(triEdges_[trii], triEdgei)
817 label& edgei = triEdges_[trii][triEdgei];
824 edgeTris_[edgei][edgeTris_[edgei][0] != -1] = trii;
830 triSrcFace_[trii] = patchFacei;
831 srcFaceTris_[patchFacei].append(trii);
835 triTgtFace_[trii] = patchFacei;
836 tgtFaceTris_[patchFacei].append(trii);
843 template<
class SrcPatchType,
class TgtPatchType>
850 forAll(edgeTris_[edgei], edgeTrii)
852 const label trii = edgeTris_[edgei][edgeTrii];
854 if (trii == -1)
return;
859 if (edgePatchEdges(edgei) !=
labelPair(-1, -1))
862 <<
"Flipping an original edge"
871 labelPair edgei0s(-1, -1), trii0s(-1, -1);
872 labelPair edgei1s(-1, -1), trii1s(-1, -1);
873 forAll(edgeTris_[edgei], edgeTrii)
875 const label trii = edgeTris_[edgei][edgeTrii];
878 pointi0 = triPoint(trii, (triEdgei + edgeTrii) % 3);
879 pointi1 = triPoint(trii, (triEdgei + !edgeTrii) % 3);
880 pointiOpps[edgeTrii] = triPoint(trii, (triEdgei + 2) % 3);
882 edgei0s[edgeTrii] = triEdges_[trii][(triEdgei + !edgeTrii + 1) % 3];
886 [edgeTris_[edgei0s[edgeTrii]][0] == trii];
887 edgei1s[edgeTrii] = triEdges_[trii][(triEdgei + edgeTrii + 1) % 3];
891 [edgeTris_[edgei1s[edgeTrii]][0] == trii];
896 const label trii0 = edgeTris_[edgei][0], trii1 = edgeTris_[edgei][1];
898 triPoints_[trii0] = {pointi0, pointiOpps[1], pointiOpps[0]};
899 triEdges_[trii0] = {edgei0s[1], edgei, edgei0s[0]};
900 edgeTris_[edgei0s[1]][edgeTris_[edgei0s[1]][1] == trii1] = trii0;
902 triPoints_[trii1] = {pointi1, pointiOpps[0], pointiOpps[1]};
903 triEdges_[trii1] = {edgei1s[0], edgei, edgei1s[1]};
904 edgeTris_[edgei1s[0]][edgeTris_[edgei1s[0]][1] == trii0] = trii1;
909 template<
class SrcPatchType,
class TgtPatchType>
922 triSrcFace_[trii] != -1 ? srcPoints_ : tgtPoints_;
926 const Tuple2<point, scalar> crSqr = t.circumCircleSqr();
931 :
magSqr(
points[pointi] - crSqr.first()) - crSqr.second();
935 template<
class SrcPatchType,
class TgtPatchType>
938 const label insertionTriOrEdgei,
940 const UList<label>& pointis,
941 UList<label>& insertionEdgeis,
942 const UList<label>& fixedEdgeis
946 insertionEdgeis = -1;
952 candidateTriTris_.append(insertionTriOrEdgei);
953 triCandidateTris_[insertionTriOrEdgei] = 0;
959 insertionEdgeis[0] = insertionTriOrEdgei;
966 const label trii0 = edgeTris_[insertionTriOrEdgei][0];
967 const label trii1 = edgeTris_[insertionTriOrEdgei][1];
973 && (triSrcFace_[trii0] == -1) != (triSrcFace_[trii1] == -1)
977 <<
"Attempted insertion into front edge #"
984 const label adjacentTri =
986 ? insertionTriOrEdgei
987 : edgeTris_[insertionTriOrEdgei][edgeTris_[insertionTriOrEdgei][0] == -1];
988 const bool isSrc = triSrcFace_[adjacentTri] != -1;
989 const label patchEdgei =
992 : edgePatchEdge(insertionTriOrEdgei, isSrc);
993 const label patchFacei =
996 : (isSrc ? triSrcFace_[adjacentTri] : triTgtFace_[adjacentTri]);
1000 isSrc ? this->srcEdgePoints_ : this->tgtEdgePoints_;
1001 DynamicList<label>& pointPatchEdges =
1002 isSrc ? this->pointSrcEdges_ : this->pointTgtEdges_;
1003 DynamicList<label>& pointPatchFaces =
1004 isSrc ? this->pointSrcFaces_ : this->pointTgtFaces_;
1007 const bool isClosedStar =
1008 isTri ||
findIndex(edgeTris_[insertionEdgeis[0]], -1) == -1;
1013 const label pointi = pointis[pointii];
1018 label initialTriOrEdgei = -1;
1021 label insertionCandidateTrii = -1;
1022 scalar minDistSqr = vGreat;
1023 forAll(candidateTriTris_, candidateTrii)
1025 const label trii = candidateTriTris_[candidateTrii];
1027 if (trii == -1)
continue;
1028 const scalar distSqr = circumDistSqr(trii, pointi);
1029 if (distSqr < minDistSqr)
1031 insertionCandidateTrii = candidateTrii;
1032 minDistSqr = distSqr;
1039 initialTriOrEdgei = candidateTriTris_[insertionCandidateTrii];
1043 initialTriOrEdgei = insertionEdgeis[pointii];
1047 star::context starContext = star_.populate
1058 edgePatchEdges(edgei) !=
labelPair(-1, -1)
1059 || (isSrc && triTgtFace_[trii] != -1)
1060 || (!isSrc && triSrcFace_[trii] != -1)
1072 const label edgej0 = triEdges_[trii][(triEdgei + 1) % 3];
1073 const label edgej1 = triEdges_[trii][(triEdgei + 2) % 3];
1075 edgeTris_[edgej0][edgeTris_[edgej0][0] == trii];
1077 edgeTris_[edgej1][edgeTris_[edgej1][0] == trii];
1080 (trij0 != -1 && star_.faceStarFaces()[trij0] != -1)
1081 || (trij1 != -1 && star_.faceStarFaces()[trij1] != -1)
1082 || (!isTri &&
findIndex(insertionEdgeis, edgej0) != -1)
1083 || (!isTri &&
findIndex(insertionEdgeis, edgej1) != -1)
1091 return circumDistSqr(trii, pointi) < 0;
1098 const edge insertionEdge =
1099 isTri ? edge(-1, -1) : edgePoints(insertionEdgeis[pointii]);
1103 label newTrii0 = -1, newTrii00 = -1;
1106 const bool isFirst = i == 0;
1107 const bool isLast = i == star_.starEdgeEdges().size() - 1;
1109 const bool edgeSidei =
1110 edgeTris_[edgei][0] == -1
1111 || star_.faceStarFaces()[edgeTris_[edgei][0]] == -1;
1113 const label trii = edgeTris_[edgei][edgeSidei];
1117 const label tempEdgei = newEdgei();
1118 triEdges_[trii][triEdgei] = tempEdgei;
1119 edgeTris_[tempEdgei][0] = trii;
1120 edgeTris_[edgei][edgeSidei] = -1;
1123 const label newTrii =
1128 triPoint(trii, triEdgei),
1129 triPoint(trii, (triEdgei + 1) % 3),
1132 !isFirst ? triEdges_[newTrii0][2] : -1,
1134 isClosedStar && isLast ? triEdges_[newTrii00][0] : -1
1136 isSrc ? triSrcFace_[trii] : triTgtFace_[trii],
1140 newTrii00 = isFirst ? newTrii0 : newTrii00;
1145 candidateTriTris_.append(newTrii);
1146 triCandidateTris_[newTrii] = candidateTriTris_.size() - 1;
1150 if (triPoint(newTrii, 2) == insertionEdge[0])
1152 insertionEdgeis[pointii] = triEdges_[newTrii][2];
1156 if (!isTri && triPoint(newTrii, 1) == insertionEdge[1])
1158 insertionEdgeis[pointii + 1] = triEdges_[newTrii][0];
1163 if (patchEdgei != -1)
1165 patchEdgePoints[patchEdgei].append(-1);
1166 label patchEdgePointi = patchEdgePoints[patchEdgei].size() - 1;
1167 for (; patchEdgePointi >= 0; -- patchEdgePointi)
1169 label& pointi = patchEdgePoints[patchEdgei][patchEdgePointi];
1170 pointi = patchEdgePoints[patchEdgei][patchEdgePointi - 1];
1173 pointPoints_[pointi] == insertionEdge[0]
1174 || pointPoints_[pointi] == insertionEdge[1]
1181 patchEdgePoints[patchEdgei][patchEdgePointi] = pointi;
1183 pointPatchEdges[pointi] = patchEdgei;
1187 pointPatchFaces[pointi] = patchFacei;
1191 if (patchEdgei != -1)
1193 checkPatchEdge(patchEdgei, isSrc);
1197 checkPatchFace(patchFacei, isSrc);
1204 if (edgePoints(insertionEdgeis[pointii + 1])[1] != insertionEdge[1])
1208 edgeTris_[insertionEdgeis[pointii + 1]][0],
1209 edgeTris_[insertionEdgeis[pointii + 1]][1]
1221 if (patchEdgei != -1)
1223 checkPatchEdge(patchEdgei, isSrc);
1227 checkPatchFace(patchFacei, isSrc);
1234 forAll(candidateTriTris_, candidateTrii)
1236 const label trii = candidateTriTris_[candidateTrii];
1239 triCandidateTris_[trii] = -1;
1242 candidateTriTris_.clear();
1247 template<
class SrcPatchType,
class TgtPatchType>
1255 this->pointSrcPoints_[pointi] != -1
1256 && this->pointTgtPoints_[pointi] == -1
1257 && this->pointTgtEdges_[pointi] == -1
1258 && this->pointTgtFaces_[pointi] == -1
1261 this->pointTgtPoints_[pointi] != -1
1262 && this->pointSrcPoints_[pointi] == -1
1263 && this->pointSrcEdges_[pointi] == -1
1264 && this->pointSrcFaces_[pointi] == -1
1269 template<
class SrcPatchType,
class TgtPatchType>
1277 edgePatchEdge(edgei,
true) != -1
1278 && edgePatchEdge(edgei,
false) == -1
1280 edgeTris_[edgei][0] == -1
1281 || triTgtFace_[edgeTris_[edgei][0]] == -1
1284 edgeTris_[edgei][1] == -1
1285 || triTgtFace_[edgeTris_[edgei][1]] == -1
1289 edgePatchEdge(edgei,
false) != -1
1290 && edgePatchEdge(edgei,
true) == -1
1292 edgeTris_[edgei][0] == -1
1293 || triSrcFace_[edgeTris_[edgei][0]] == -1
1296 edgeTris_[edgei][1] == -1
1297 || triSrcFace_[edgeTris_[edgei][1]] == -1
1303 template<
class SrcPatchType,
class TgtPatchType>
1307 const label srcFacei,
1308 const label tgtFacei,
1309 const scalar snapTol
1312 static const FixedList<label, 3> triNoSnap({-1, -1, -1});
1315 triPointRef(tgtPoints_, patchFacePoints(tgtFacei,
false)).normal();
1318 FixedList<barycentric2D, 3> srcFaceTgtTs(barycentric2D::uniform(-vGreat));
1319 FixedList<label, 3> srcFaceSnapTgtFacePoint(triNoSnap);
1320 FixedList<label, 3> srcFaceSnapTgtFaceEdge(triNoSnap);
1321 forAll(srcFaceSnapTgtFacePoint, srcFacePointi)
1323 const label srcPointi = patchFacePoint(srcFacei, srcFacePointi,
true);
1325 if (!pointCanIntersect(srcPointi))
continue;
1327 if ((srcPointNormals_[srcPointi] & tgtNormal) < 0)
1329 srcFaceTgtTs[srcFacePointi] =
1332 srcPoints_[srcPointi],
1333 srcPointNormals_[srcPointi],
1334 patchFacePointValues(tgtFacei,
false, tgtPoints_)
1337 for (
label tgtFacePointi = 0; tgtFacePointi < 3; ++ tgtFacePointi)
1339 const label tgtPointi =
1340 patchFacePoint(tgtFacei, tgtFacePointi,
false);
1342 const label tgtFacePointi0 = (tgtFacePointi + 2) % 3;
1343 const label tgtFacePointi1 = (tgtFacePointi + 1) % 3;
1347 pointCanIntersect(tgtPointi)
1348 &&
mag(srcFaceTgtTs[srcFacePointi][tgtFacePointi0]) < snapTol
1349 &&
mag(srcFaceTgtTs[srcFacePointi][tgtFacePointi1]) < snapTol
1352 srcFaceSnapTgtFacePoint[srcFacePointi] =
1353 srcFaceSnapTgtFacePoint[srcFacePointi] == -1
1357 srcFaceTgtTs[srcFacePointi][tgtFacePointi] = 1;
1358 srcFaceTgtTs[srcFacePointi][tgtFacePointi0] = 0;
1359 srcFaceTgtTs[srcFacePointi][tgtFacePointi1] = 0;
1363 srcFaceSnapTgtFacePoint[srcFacePointi] =
1364 max(srcFaceSnapTgtFacePoint[srcFacePointi], -1);
1366 if (srcFaceSnapTgtFacePoint[srcFacePointi] != -1)
continue;
1368 for (
label tgtFaceEdgei = 0; tgtFaceEdgei < 3; ++ tgtFaceEdgei)
1370 const label tgtFacePointi0 = tgtFaceEdgei;
1371 const label tgtFacePointi1 = (tgtFaceEdgei + 1) % 3;
1372 const label tgtFacePointiOpp = (tgtFaceEdgei + 2) % 3;
1376 srcFaceTgtTs[srcFacePointi][tgtFacePointi0] >= snapTol
1377 && srcFaceTgtTs[srcFacePointi][tgtFacePointi1] >= snapTol
1378 &&
mag(srcFaceTgtTs[srcFacePointi][tgtFacePointiOpp]) < snapTol
1381 srcFaceSnapTgtFaceEdge[srcFacePointi] =
1382 srcFaceSnapTgtFaceEdge[srcFacePointi] == -1
1387 srcFaceTgtTs[srcFacePointi][tgtFacePointiOpp];
1388 srcFaceTgtTs[srcFacePointi][tgtFacePointiOpp] = 0;
1389 srcFaceTgtTs[srcFacePointi][tgtFacePointi0] /= 1 - eps;
1390 srcFaceTgtTs[srcFacePointi][tgtFacePointi1] /= 1 - eps;
1394 srcFaceSnapTgtFaceEdge[srcFacePointi] =
1395 max(srcFaceSnapTgtFaceEdge[srcFacePointi], -1);
1400 FixedList<barycentric2D, 3> tgtFaceSrcTs(barycentric2D::uniform(-vGreat));
1401 FixedList<label, 3> tgtFaceSnapSrcFacePoint(triNoSnap);
1402 FixedList<label, 3> tgtFaceSnapSrcFaceEdge(triNoSnap);
1403 forAll(tgtFaceSnapSrcFacePoint, tgtFacePointi)
1405 const label tgtPointi = patchFacePoint(tgtFacei, tgtFacePointi,
false);
1407 if (!pointCanIntersect(tgtPointi))
continue;
1409 tgtFaceSrcTs[tgtFacePointi] =
1412 patchFacePointValues(srcFacei,
true, srcPoints_),
1413 patchFacePointValues(srcFacei,
true, srcPointNormals_),
1414 tgtPoints_[tgtPointi]
1420 tgtFaceSrcTs[tgtFacePointi],
1421 patchFacePointValues(srcFacei,
true, srcPointNormals_)
1424 if ((srcNormal & tgtNormal) < 0)
1426 for (
label srcFacePointi = 0; srcFacePointi < 3; ++ srcFacePointi)
1428 const label srcPointi =
1429 patchFacePoint(srcFacei, srcFacePointi,
true);
1431 const label srcFacePointi0 = (srcFacePointi + 2) % 3;
1432 const label srcFacePointi1 = (srcFacePointi + 1) % 3;
1436 pointCanIntersect(srcPointi)
1437 &&
mag(tgtFaceSrcTs[tgtFacePointi][srcFacePointi0]) < snapTol
1438 &&
mag(tgtFaceSrcTs[tgtFacePointi][srcFacePointi1]) < snapTol
1441 tgtFaceSnapSrcFacePoint[tgtFacePointi] =
1442 tgtFaceSnapSrcFacePoint[tgtFacePointi] == -1
1446 tgtFaceSrcTs[tgtFacePointi][srcFacePointi] = 1;
1447 tgtFaceSrcTs[tgtFacePointi][srcFacePointi0] = 0;
1448 tgtFaceSrcTs[tgtFacePointi][srcFacePointi1] = 0;
1452 tgtFaceSnapSrcFacePoint[tgtFacePointi] =
1453 max(tgtFaceSnapSrcFacePoint[tgtFacePointi], -1);
1455 if (tgtFaceSnapSrcFacePoint[tgtFacePointi] != -1)
continue;
1457 for (
label srcFaceEdgei = 0; srcFaceEdgei < 3; ++ srcFaceEdgei)
1459 const label srcFacePointi0 = srcFaceEdgei;
1460 const label srcFacePointi1 = (srcFaceEdgei + 1) % 3;
1461 const label srcFacePointiOpp = (srcFaceEdgei + 2) % 3;
1465 tgtFaceSrcTs[tgtFacePointi][srcFacePointi0] >= snapTol
1466 && tgtFaceSrcTs[tgtFacePointi][srcFacePointi1] >= snapTol
1467 &&
mag(tgtFaceSrcTs[tgtFacePointi][srcFacePointiOpp]) < snapTol
1470 tgtFaceSnapSrcFaceEdge[tgtFacePointi] =
1471 tgtFaceSnapSrcFaceEdge[tgtFacePointi] == -1
1476 tgtFaceSrcTs[tgtFacePointi][srcFacePointiOpp];
1477 tgtFaceSrcTs[tgtFacePointi][srcFacePointiOpp] = 0;
1478 tgtFaceSrcTs[tgtFacePointi][srcFacePointi0] /= 1 - eps;
1479 tgtFaceSrcTs[tgtFacePointi][srcFacePointi1] /= 1 - eps;
1483 tgtFaceSnapSrcFaceEdge[tgtFacePointi] =
1484 max(tgtFaceSnapSrcFaceEdge[tgtFacePointi], -1);
1491 srcFaceSnapTgtFacePoint == triNoSnap
1492 && srcFaceSnapTgtFaceEdge == triNoSnap
1493 && tgtFaceSnapSrcFacePoint == triNoSnap
1494 && tgtFaceSnapSrcFaceEdge == triNoSnap
1501 forAll(srcFaceSnapTgtFacePoint, srcFacePointi)
1503 const label tgtFacePointi = srcFaceSnapTgtFacePoint[srcFacePointi];
1505 if (tgtFacePointi != -1)
1507 tgtFaceSnapSrcFacePoint[tgtFacePointi] = srcFacePointi;
1510 forAll(tgtFaceSnapSrcFacePoint, tgtFacePointi)
1512 const label srcFacePointi = tgtFaceSnapSrcFacePoint[tgtFacePointi];
1514 if (srcFacePointi != -1)
1516 srcFaceSnapTgtFacePoint[srcFacePointi] = tgtFacePointi;
1521 forAll(srcFaceSnapTgtFacePoint, srcFacePointi)
1523 const label tgtFacePointi = srcFaceSnapTgtFacePoint[srcFacePointi];
1525 if (tgtFacePointi == -1)
continue;
1527 const label srcPointi = patchFacePoint(srcFacei, srcFacePointi,
true);
1528 const label tgtPointi = patchFacePoint(tgtFacei, tgtFacePointi,
false);
1530 if (!pointCanIntersect(srcPointi))
continue;
1531 if (!pointCanIntersect(tgtPointi))
continue;
1533 srcPoints_[tgtPointi] = srcPoints_[srcPointi];
1534 srcPointNormals_[tgtPointi] = srcPointNormals_[srcPointi];
1535 tgtPoints_[srcPointi] = tgtPoints_[tgtPointi];
1537 const point& srcP = srcPoints_[srcPointi];
1538 const vector& srcN = srcPointNormals_[srcPointi];
1539 const point& tgtP = tgtPoints_[tgtPointi];
1541 srcPoints_[srcPointi] += d/2;
1542 tgtPoints_[tgtPointi] -= d/2;
1546 forAll(srcFaceSnapTgtFaceEdge, srcFacePointi)
1548 const label tgtFaceEdgei = srcFaceSnapTgtFaceEdge[srcFacePointi];
1550 if (tgtFaceEdgei == -1)
continue;
1552 const label srcPointi = patchFacePoint(srcFacei, srcFacePointi,
true);
1554 if (!pointCanIntersect(srcPointi))
continue;
1556 tgtPoints_[srcPointi] =
1559 srcFaceTgtTs[srcFacePointi],
1560 patchFacePointValues(tgtFacei,
false, tgtPoints_)
1563 const point& srcP = srcPoints_[srcPointi];
1564 const vector& srcN = srcPointNormals_[srcPointi];
1565 const point& tgtP = tgtPoints_[srcPointi];
1567 srcPoints_[srcPointi] += d;
1571 forAll(tgtFaceSnapSrcFaceEdge, tgtFacePointi)
1573 const label srcFaceEdgei = tgtFaceSnapSrcFaceEdge[tgtFacePointi];
1575 if (srcFaceEdgei == -1)
continue;
1577 const label tgtPointi = patchFacePoint(tgtFacei, tgtFacePointi,
false);
1579 if (!pointCanIntersect(tgtPointi))
continue;
1581 srcPoints_[tgtPointi] =
1584 tgtFaceSrcTs[tgtFacePointi],
1585 patchFacePointValues(srcFacei,
true, srcPoints_)
1587 srcPointNormals_[tgtPointi] =
1590 tgtFaceSrcTs[tgtFacePointi],
1591 patchFacePointValues(srcFacei,
true, srcPointNormals_)
1594 const point& srcP = srcPoints_[tgtPointi];
1595 const vector& srcN = srcPointNormals_[tgtPointi];
1596 const point& tgtP = tgtPoints_[tgtPointi];
1598 tgtPoints_[tgtPointi] -= d;
1602 forAll(srcFaceSnapTgtFacePoint, srcFacePointi)
1604 const label tgtFacePointi = srcFaceSnapTgtFacePoint[srcFacePointi];
1606 if (tgtFacePointi == -1)
continue;
1608 const label srcPointi = patchFacePoint(srcFacei, srcFacePointi,
true);
1609 const label tgtPointi = patchFacePoint(tgtFacei, tgtFacePointi,
false);
1611 if (!pointCanIntersect(srcPointi))
continue;
1612 if (!pointCanIntersect(tgtPointi))
continue;
1614 srcPoints_[tgtPointi] = srcPoints_[srcPointi];
1615 srcPointNormals_[tgtPointi] = srcPointNormals_[srcPointi];
1616 tgtPoints_[srcPointi] = tgtPoints_[tgtPointi];
1618 pointPoints_[tgtPointi] = srcPointi;
1620 this->pointTgtEdges_[srcPointi] = this->pointTgtEdges_[tgtPointi];
1621 this->pointSrcEdges_[tgtPointi] = -1;
1622 this->pointTgtEdges_[tgtPointi] = -1;
1624 this->pointTgtPoints_[srcPointi] = this->pointTgtPoints_[tgtPointi];
1625 this->tgtPointPoints_[this->pointTgtPoints_[tgtPointi]] = srcPointi;
1626 this->pointSrcPoints_[tgtPointi] = -1;
1627 this->pointTgtPoints_[tgtPointi] = -1;
1631 checkPatchFace(srcFacei,
true);
1632 checkPatchFace(tgtFacei,
false);
1635 labelList insertPointis(1), insertEdgeis(2,
label(-1)), fixedEdgeis(0);
1638 forAll(srcFaceSnapTgtFaceEdge, srcFacePointi)
1640 const label tgtFaceEdgei = srcFaceSnapTgtFaceEdge[srcFacePointi];
1642 if (tgtFaceEdgei == -1)
continue;
1644 const label srcPointi = patchFacePoint(srcFacei, srcFacePointi,
true);
1646 if (!pointCanIntersect(srcPointi))
continue;
1648 const label tgtPatchEdgei =
1649 patchFacePatchEdge(tgtFacei, tgtFaceEdgei,
false);
1653 label insertTgtEdgei = -1;
1654 scalar insertDistSqr = vGreat;
1655 forAll(tgtFaceTris_[tgtFacei], tgtFaceTrii)
1657 const label tgtTrii = tgtFaceTris_[tgtFacei][tgtFaceTrii];
1659 forAll(triEdges_[tgtTrii], tgtTriEdgei)
1661 const label tgtEdgei = triEdges_[tgtTrii][tgtTriEdgei];
1665 edgeCanIntersect(tgtEdgei)
1666 && tgtPatchEdgei == edgePatchEdge(tgtEdgei,
false)
1669 const scalar distSqr = circumDistSqr(tgtTrii, srcPointi);
1671 if (distSqr < insertDistSqr)
1673 insertDistSqr = distSqr;
1674 insertTgtEdgei = tgtEdgei;
1680 if (insertTgtEdgei != -1)
1682 insertPointis[0] = srcPointi;
1695 forAll(tgtFaceSnapSrcFaceEdge, tgtFacePointi)
1697 const label srcFaceEdgei = tgtFaceSnapSrcFaceEdge[tgtFacePointi];
1699 if (srcFaceEdgei == -1)
continue;
1701 const label tgtPointi = patchFacePoint(tgtFacei, tgtFacePointi,
false);
1703 if (!pointCanIntersect(tgtPointi))
continue;
1705 const label srcPatchEdgei =
1706 patchFacePatchEdge(srcFacei, srcFaceEdgei,
true);
1708 srcPoints_[tgtPointi] =
1711 tgtFaceSrcTs[tgtFacePointi],
1712 patchFacePointValues(srcFacei,
true, srcPoints_)
1714 srcPointNormals_[tgtPointi] =
1717 tgtFaceSrcTs[tgtFacePointi],
1718 patchFacePointValues(srcFacei,
true, srcPointNormals_)
1723 label insertSrcEdgei = -1;
1724 scalar insertDistSqr = vGreat;
1725 forAll(srcFaceTris_[srcFacei], srcFaceTrii)
1727 const label srcTrii = srcFaceTris_[srcFacei][srcFaceTrii];
1729 forAll(triEdges_[srcTrii], srcTriEdgei)
1731 const label srcEdgei = triEdges_[srcTrii][srcTriEdgei];
1735 edgeCanIntersect(srcEdgei)
1736 && srcPatchEdgei == edgePatchEdge(srcEdgei,
true)
1739 const scalar distSqr = circumDistSqr(srcTrii, tgtPointi);
1741 if (distSqr < insertDistSqr)
1743 insertDistSqr = distSqr;
1744 insertSrcEdgei = srcEdgei;
1750 if (insertSrcEdgei != -1)
1752 insertPointis[0] = tgtPointi;
1765 checkPatchFace(srcFacei,
true);
1766 checkPatchFace(tgtFacei,
false);
1770 template<
class SrcPatchType,
class TgtPatchType>
1773 const label srcTrii,
1778 const label srcFacei = triSrcFace_[srcTrii];
1779 const label tgtFacei = triTgtFace_[tgtTrii];
1780 if (srcFacei == -1 || tgtFacei == -1)
1783 <<
"Tri-intersections must be between a tri associated with the "
1784 <<
"source patch and one associated with the target patch"
1789 DynamicList<point> ictSrcPoints;
1790 DynamicList<vector> ictSrcPointNormals;
1791 DynamicList<point> ictTgtPoints;
1792 DynamicList<triIntersect::location> ictPointLocations;
1795 triPointValues(srcTrii, srcPoints_),
1796 triPointValues(srcTrii, srcPointNormals_),
1798 triOtherTriPoints(srcTrii, tgtTrii),
1799 triPointValues(tgtTrii, tgtPoints_),
1801 triOtherTriPoints(tgtTrii, srcTrii),
1808 ?
"srcTrii##tgtTrii=" +
name(srcTrii) +
name(tgtTrii)
1813 if (!ictPointLocations.size())
1821 forAll(ictPointLocations, ictPointi)
1823 const triIntersect::location& l = ictPointLocations[ictPointi];
1825 if (l.isSrcPoint() && !l.isTgtPoint())
1827 const label pointi = triPoint(srcTrii, l.srcPointi());
1831 this->pointTgtPoints_[pointi] != -1
1832 || this->pointTgtEdges_[pointi] != -1
1833 || this->pointTgtFaces_[pointi] != -1
1839 if (!l.isSrcPoint() && l.isTgtPoint())
1841 const label pointi = triPoint(tgtTrii, l.tgtPointi());
1845 this->pointSrcPoints_[pointi] != -1
1846 || this->pointSrcEdges_[pointi] != -1
1847 || this->pointSrcFaces_[pointi] != -1
1853 if (l.isIntersection())
1855 const label srcEdgei = triEdges_[srcTrii][l.srcEdgei()];
1856 const label tgtEdgei = triEdges_[tgtTrii][l.tgtEdgei()];
1858 const labelPair srcPatchEdges = edgePatchEdges(srcEdgei);
1859 const labelPair tgtPatchEdges = edgePatchEdges(tgtEdgei);
1863 (srcPatchEdges[0] != -1 && tgtPatchEdges[1] != -1)
1864 && (srcPatchEdges[1] != -1 || tgtPatchEdges[0] != -1)
1870 const label srcTrij =
1871 edgeTris_[srcEdgei][edgeTris_[srcEdgei][0] == srcTrii];
1872 const label tgtTrij =
1873 edgeTris_[tgtEdgei][edgeTris_[tgtEdgei][0] == tgtTrii];
1877 (srcTrij != -1 && triTgtFace_[srcTrij] != -1)
1878 || (tgtTrij != -1 && triSrcFace_[tgtTrij] != -1)
1887 bool insertPointsIntoTri =
false;
1888 bool insertPointsIntoEdges =
false;
1894 labelList ictPointiToPointi(ictPointLocations.size(), -1);
1895 forAll(ictPointLocations, ictPointi)
1897 const triIntersect::location& l = ictPointLocations[ictPointi];
1899 if (l.isSrcPoint() && !l.isTgtPoint())
1901 const label pointi = triPoint(srcTrii, l.srcPointi());
1903 ictPointiToPointi[ictPointi] = pointi;
1906 tgtPoints_[pointi] = ictTgtPoints[ictPointi];
1908 insertPointsIntoTri =
true;
1910 if (!l.isSrcPoint() && l.isTgtPoint())
1912 const label pointi = triPoint(tgtTrii, l.tgtPointi());
1914 ictPointiToPointi[ictPointi] = pointi;
1917 srcPoints_[pointi] = ictSrcPoints[ictPointi];
1918 srcPointNormals_[pointi] = ictSrcPointNormals[ictPointi];
1920 insertPointsIntoTri =
true;
1922 if (l.isIntersection())
1924 const label srcPatchEdgei =
1925 edgePatchEdge(triEdges_[srcTrii][l.srcEdgei()],
true);
1926 const label tgtPatchEdgei =
1927 edgePatchEdge(triEdges_[tgtTrii][l.tgtEdgei()],
false);
1929 if (srcPatchEdgei != -1 && tgtPatchEdgei != -1)
1931 ictPointiToPointi[ictPointi] = srcPoints_.size();
1935 srcPoints_[pointi] = ictSrcPoints[ictPointi];
1936 srcPointNormals_[pointi] = ictSrcPointNormals[ictPointi];
1937 tgtPoints_[pointi] = ictTgtPoints[ictPointi];
1939 insertPointsIntoEdges =
true;
1945 const FixedList<label, 3> srcTriEdges = triEdges_[srcTrii];
1946 const FixedList<bool, 3> srcTriOwns = triOwns(srcTrii);
1947 const FixedList<label, 3> tgtTriEdges = triEdges_[tgtTrii];
1948 const FixedList<bool, 3> tgtTriOwns = triOwns(tgtTrii);
1957 DynamicList<label> fixedSrcEdgeis, fixedTgtEdgeis;
1958 #ifdef OVERCONSTRAIN
1959 forAll(srcTriEdges, srcTriEdgei)
1961 fixedSrcEdgeis.append(srcTriEdges[srcTriEdgei]);
1963 forAll(tgtTriEdges, tgtTriEdgei)
1965 fixedTgtEdgeis.append(tgtTriEdges[tgtTriEdgei]);
1970 if (insertPointsIntoTri)
1972 DynamicList<label> insertSrcPointis(3), insertTgtPointis(3);
1973 DynamicList<label> insertEdgeis;
1974 forAll(ictPointLocations, ictPointi)
1976 const label pointi = ictPointiToPointi[ictPointi];
1978 if (pointi == -1)
continue;
1980 const triIntersect::location& l = ictPointLocations[ictPointi];
1982 if (l.isSrcPoint() && !l.isTgtPoint())
1984 insertSrcPointis.append(pointi);
1986 if (!l.isSrcPoint() && l.isTgtPoint())
1988 insertTgtPointis.append(pointi);
1992 if (insertSrcPointis.size())
2004 if (insertTgtPointis.size())
2017 checkPatchFace(srcFacei,
true);
2018 checkPatchFace(tgtFacei,
false);
2022 if (insertPointsIntoEdges)
2024 DynamicList<label> insertPointis(2), insertEdgeis(3);
2025 forAll(ictPointLocations, ictPointi0)
2027 const label ictPointi1 = ictPointLocations.fcIndex(ictPointi0);
2029 const label pointi0 = ictPointiToPointi[ictPointi0];
2030 const label pointi1 = ictPointiToPointi[ictPointi1];
2032 const triIntersect::location& l0 = ictPointLocations[ictPointi0];
2033 const triIntersect::location& l1 = ictPointLocations[ictPointi1];
2035 insertPointis.clear();
2036 insertEdgeis.clear();
2037 insertEdgeis.append(-1);
2044 && l0.srcEdgei() != (l1.srcPointi() + 1) % 3
2048 && l1.isIntersection()
2049 && (l0.srcPointi() + 1) % 3 != l1.srcEdgei()
2053 && l1.isIntersection()
2054 && l0.srcEdgei() == l1.srcEdgei()
2058 const label srcTriEdgei =
2059 l0.isIntersection() ? l0.srcEdgei() : l1.srcEdgei();
2061 if (!l0.isSrcPoint() && pointi0 != -1)
2063 insertPointis.append(pointi0);
2064 insertEdgeis.append(-1);
2066 if (!l1.isSrcPoint() && pointi1 != -1)
2068 insertPointis.append(pointi1);
2069 insertEdgeis.append(-1);
2071 if (!srcTriOwns[srcTriEdgei])
2076 if (insertPointis.size())
2080 srcTriEdges[srcTriEdgei],
2088 #ifdef OVERCONSTRAIN
2089 fixedSrcEdgeis[srcTriEdgei] = insertEdgeis.remove();
2090 fixedSrcEdgeis.append(insertEdgeis);
2099 && l0.tgtEdgei() != (l1.tgtPointi() + 1) % 3
2103 && l1.isIntersection()
2104 && (l0.tgtPointi() + 1) % 3 != l1.tgtEdgei()
2109 && l1.isIntersection()
2110 && l0.tgtEdgei() == l1.tgtEdgei()
2114 const label tgtTriEdgei =
2115 l0.isIntersection() ? l0.tgtEdgei() : l1.tgtEdgei();
2117 if (!l0.isTgtPoint() && pointi0 != -1)
2119 insertPointis.append(pointi0);
2120 insertEdgeis.append(-1);
2122 if (!l1.isTgtPoint() && pointi1 != -1)
2124 insertPointis.append(pointi1);
2125 insertEdgeis.append(-1);
2127 if (tgtTriOwns[tgtTriEdgei])
2132 if (insertPointis.size())
2136 tgtTriEdges[tgtTriEdgei],
2144 #ifdef OVERCONSTRAIN
2145 fixedTgtEdgeis[tgtTriEdgei] = insertEdgeis.remove();
2146 fixedTgtEdgeis.append(insertEdgeis);
2152 checkPatchFace(srcFacei,
true);
2153 checkPatchFace(tgtFacei,
false);
2160 template<
class SrcPatchType,
class TgtPatchType>
2164 const label srcFacei,
2165 const label tgtFacei
2169 const DynamicList<label>& srcFaceTris = srcFaceTris_[srcFacei];
2170 forAll(srcFaceTris, srcFaceTrii)
2172 const label srcTrii = srcFaceTris[srcFaceTrii];
2174 if (triMarkedTris_[srcTrii] != -1)
2176 markedTriTris_[triMarkedTris_[srcTrii]] = -1;
2177 triMarkedTris_[srcTrii] = -1;
2182 label srcFaceTrii = 0;
2183 while (srcFaceTrii < srcFaceTris.size())
2186 const label srcTrii = srcFaceTris[srcFaceTrii];
2187 markedTriTris_.append(srcTrii);
2188 triMarkedTris_[srcTrii] = markedTriTris_.size() - 1;
2191 const DynamicList<label>& tgtFaceTris = tgtFaceTris_[tgtFacei];
2192 forAll(tgtFaceTris, tgtFaceTrii)
2194 const label tgtTrii = tgtFaceTris[tgtFaceTrii];
2196 if (triMarkedTris_[tgtTrii] != -1)
2198 markedTriTris_[triMarkedTris_[tgtTrii]] = -1;
2199 triMarkedTris_[tgtTrii] = -1;
2204 label tgtFaceTrii = 0;
2205 while (tgtFaceTrii < tgtFaceTris.size())
2208 const label tgtTrii = tgtFaceTris[tgtFaceTrii];
2209 markedTriTris_.append(tgtTrii);
2210 triMarkedTris_[tgtTrii] = markedTriTris_.size() - 1;
2224 if (triMarkedTris_[tgtFaceTris[tgtFaceTrii]] != -1)
2230 if (triMarkedTris_[srcFaceTris[srcFaceTrii]] == -1)
break;
2236 && triMarkedTris_[tgtFaceTris[tgtFaceTrii]] == -1
2250 && triMarkedTris_[srcFaceTris[srcFaceTrii]] == -1
2261 forAll(markedTriTris_, markedTrii)
2263 const label trii = markedTriTris_[markedTrii];
2266 triMarkedTris_[trii] = -1;
2269 markedTriTris_.clear();
2273 template<
class SrcPatchType,
class TgtPatchType>
2277 const label patchFacei,
2278 const label otherPatchFacei,
2283 isSrc ? srcFaceTris_[patchFacei] : tgtFaceTris_[patchFacei];
2285 isSrc ? tgtFaceTris_[otherPatchFacei] : srcFaceTris_[otherPatchFacei];
2288 isSrc ? triTgtFace_ : triSrcFace_;
2292 const vector& patchFaceN =
2294 ? this->srcPatch_.faceNormals()[patchFacei]
2295 : this->tgtPatch_.faceNormals()[patchFacei];
2297 auto pointIntersectsPatchFace = [&]
2300 const label patchFacei,
2305 isSrc ? this->pointSrcPoints_ : this->pointTgtPoints_;
2307 isSrc ? this->pointSrcEdges_ : this->pointTgtEdges_;
2309 isSrc ? this->pointSrcFaces_ : this->pointTgtFaces_;
2311 const triFace patchFacePatchPoints
2313 this->patchFacePatchPoints(patchFacei, isSrc)
2315 const triFace patchFacePatchEdges
2317 this->patchFacePatchEdges(patchFacei, isSrc)
2323 patchFacePatchPoints,
2324 pointPatchPoints[pointi]
2328 patchFacePatchEdges,
2329 pointPatchEdges[pointi]
2331 || pointPatchFaces[pointi] == patchFacei;
2334 auto edgeIntersectsPatchFace = [&]
2337 const label patchFacei,
2341 const edge
e = edgePoints(edgei);
2343 pointIntersectsPatchFace(
e[0], patchFacei, isSrc)
2344 && pointIntersectsPatchFace(
e[1], patchFacei, isSrc);
2348 DynamicList<label> conformEdgeis;
2349 forAll(otherPatchFaceTris, otherPatchFaceTrii)
2351 const label trii = otherPatchFaceTris[otherPatchFaceTrii];
2353 forAll(triEdges_[trii], triEdgei)
2355 const label edgei = triEdges_[trii][triEdgei];
2358 edgeTris_[edgei][edgeTris_[edgei][0] == trii];
2360 const label otherPatchFacej =
2361 trij == -1 ? -1 : triOtherPatchFaces[trij];
2365 otherPatchFacei != otherPatchFacej
2366 && edgeIntersectsPatchFace(edgei, patchFacei, isSrc)
2369 conformEdgeis.append(edgei);
2375 auto isConformed = [&](
const label edgei)
2377 const edge
e = edgePoints(edgei);
2379 forAll(patchFaceTris, patchFaceTrii)
2381 const label trii = patchFaceTris[patchFaceTrii];
2383 forAll(triEdges_[trii], triEdgei)
2385 const label edgei = triEdges_[trii][triEdgei];
2387 if (edge::compare(
e, edgePoints(edgei)) != 0)
2398 forAll(conformEdgeis, conformj)
2400 if (!isConformed(conformEdgeis[conformj]))
2402 conformEdgeis[conformi] = conformEdgeis[conformj];
2406 conformEdgeis.resize(conformi);
2410 if (conformEdgeis.empty())
return true;
2413 auto nextConnectedPatchFaceTri = [&]
2416 const label patchFaceTrii0 = 0
2421 label patchFaceTrii = patchFaceTrii0;
2422 patchFaceTrii < patchFaceTris.size();
2426 const label trii = patchFaceTris[patchFaceTrii];
2428 if (
findIndex(triPoints(trii), pointi) != -1)
2430 return patchFaceTrii;
2439 auto trackToEdge = [&]
2454 const vector ab = t.b() - t.a();
2455 const vector ac = t.c() - t.a();
2456 const vector bc = t.c() - t.b();
2457 const scalar detA = (ab ^ ac) & patchFaceN;
2468 scalar lambdaByDetAH =
2469 !std::isnormal(detA) || detA < 0 ? vGreat : 1/detA;
2473 if (TDp[i] < - detA*small)
2475 const scalar lambdaByDetA = -
y[i]/TDp[i];
2477 if (0 <= lambdaByDetA && lambdaByDetA < lambdaByDetAH)
2480 lambdaByDetAH = lambdaByDetA;
2485 y += lambdaByDetAH*TDp;
2488 y.replace(i, i == iH ? 0 :
max(0,
y[i]));
2495 triEdgei = iH == -1 ? -1 : (iH + 1) % 3;
2503 if (triEdgei == -1)
return false;
2505 const label edgei = triEdges_[trii][triEdgei];
2507 if (edgePatchEdges(edgei) !=
labelPair(-1, -1))
return false;
2509 const label trij = edgeTris_[edgei][edgeTris_[edgei][0] == trii];
2511 if (trij == -1)
return false;
2513 if (triSrcFace_[trii] != triSrcFace_[trij])
return false;
2514 if (triTgtFace_[trii] != triTgtFace_[trij])
return false;
2524 scalar temp =
y.a();
2532 scalar temp =
y.c();
2539 inplaceRotate(
y, triEdgei - 1 + 3);
2541 inplaceRotate(
y, 1 - triEdgej + 3);
2544 triEdgei = triEdgej;
2553 forAll(conformEdgeis, conformi)
2555 const label edgei = conformEdgeis[conformi];
2559 if (isConformed(edgei))
continue;
2562 const edge
e = edgePoints(edgei);
2563 const label pointi0 =
e[0], pointi1 =
e[1];
2566 const label patchFaceTrii0 = nextConnectedPatchFaceTri(pointi0);
2567 const label patchFaceTrii1 = nextConnectedPatchFaceTri(pointi1);
2571 if (patchFaceTrii0 == -1 || patchFaceTrii1 == -1)
continue;
2575 DynamicList<label> routeTriis;
2576 DynamicList<label> routeEdgeis;
2577 label routePatchFaceTrii0 = -1;
2581 routeEdgeis.clear();
2583 routePatchFaceTrii0 =
2584 nextConnectedPatchFaceTri(pointi0, routePatchFaceTrii0 + 1);
2586 if (routePatchFaceTrii0 == -1)
break;
2588 label trii = patchFaceTris[routePatchFaceTrii0];
2589 label triEdgei = -1;
2593 forAll(patchFaceTris, iter)
2595 if (
findIndex(triPoints(trii), pointi0) != -1)
2598 routeEdgeis.clear();
2601 routeTriis.append(trii);
2603 if (
findIndex(triPoints(trii), pointi1) != -1)
break;
2605 trackToEdge(trii, triEdgei,
y, pointi1);
2607 if (triEdgei == -1)
break;
2609 routeEdgeis.append(triEdges_[trii][triEdgei]);
2611 if (!crossEdge(trii, triEdgei,
y))
break;
2614 if (
findIndex(triPoints(trii), pointi1) != -1)
break;
2618 if (routeEdgeis.size() == 0)
2622 if (this->debug > 1)
2625 <<
indent <<
"Failed to route edge " <<
e
2626 <<
" through the triangulation of "
2627 << (isSrc ?
"source" :
"target") <<
" face #"
2628 << patchFacei <<
endl;
2629 writePatchFace(patchFacei, isSrc);
2633 else if (routeEdgeis.size() == 1)
2636 flipEdge(routeEdgeis.first());
2649 DynamicList<label> leftPolyPointis, rightPolyPointis;
2650 DynamicList<label> leftPolyEdgeis, rightPolyEdgeis;
2651 DynamicList<label> leftPolyTriis, rightPolyTriis;
2654 leftPolyPointis.append(pointi0);
2655 rightPolyPointis.append(pointi0);
2659 const label trii = routeTriis.first();
2660 const label edgei1 = routeEdgeis.first();
2662 const label triEdgeiLeft = (triEdgei1 + 2) % 3;
2663 const label triEdgeiRight = (triEdgei1 + 1) % 3;
2664 leftPolyEdgeis.append(triEdges_[trii][triEdgeiLeft]);
2665 rightPolyEdgeis.append(triEdges_[trii][triEdgeiRight]);
2666 leftPolyTriis.append(trii);
2667 rightPolyTriis.append(trii);
2668 leftPolyPointis.append(triPoint(trii, triEdgei1));
2669 rightPolyPointis.append(triPoint(trii, triEdgeiRight));
2675 label routeTrii = 1;
2676 routeTrii < routeTriis.size() - 1;
2680 const label trii = routeTriis[routeTrii];
2681 const label edgei0 = routeEdgeis[routeTrii - 1];
2682 const label edgei1 = routeEdgeis[routeTrii];
2685 if ((triEdgei0 + 2) % 3 == triEdgei1)
2687 const label triEdgeiLeft = (triEdgei1 + 2) % 3;
2688 leftPolyEdgeis.append(triEdges_[trii][triEdgeiLeft]);
2689 leftPolyTriis.append(trii);
2690 leftPolyPointis.append(triPoint(trii, triEdgei1));
2694 const label triEdgeiRight = (triEdgei1 + 1) % 3;
2695 rightPolyEdgeis.append(triEdges_[trii][triEdgeiRight]);
2696 rightPolyTriis.append(trii);
2697 rightPolyPointis.append(triPoint(trii, triEdgeiRight));
2703 const label trii = routeTriis.last();
2704 const label edgei0 = routeEdgeis.last();
2706 const label triEdgeiLeft = (triEdgei0 + 1) % 3;
2707 const label triEdgeiRight = (triEdgei0 + 2) % 3;
2708 leftPolyEdgeis.append(triEdges_[trii][triEdgeiLeft]);
2709 rightPolyEdgeis.append(triEdges_[trii][triEdgeiRight]);
2710 leftPolyTriis.append(trii);
2711 rightPolyTriis.append(trii);
2712 leftPolyPointis.append(pointi1);
2713 rightPolyPointis.append(pointi1);
2718 auto disconnect = [&]
2726 const label edgei = edgeis[i];
2727 const label trii = triis[i];
2729 const label edgeTrii = edgeTris_[edgei][0] != trii;
2732 const label tempEdgei = newEdgei();
2733 triEdges_[trii][triEdgei] = tempEdgei;
2734 edgeTris_[tempEdgei][0] = trii;
2735 edgeTris_[edgei][edgeTrii] = -1;
2738 disconnect(leftPolyEdgeis, leftPolyTriis);
2739 disconnect(rightPolyEdgeis, rightPolyTriis);
2740 forAll(routeTriis, routeTrii)
2742 removeTri(routeTriis[routeTrii]);
2746 const label middleEdgei = newEdgei();
2747 leftPolyEdgeis.append(middleEdgei);
2748 rightPolyEdgeis.append(middleEdgei);
2751 SubList<label> subRightPolyPointis
2754 rightPolyPointis.size() - 1,
2764 DynamicList<label>& polyPointis,
2765 DynamicList<label>& polyEdgeis
2769 polyEdgeis.resize(2*polyPointis.size() - 3, -1);
2770 for (
label i = polyPointis.size(); i < polyEdgeis.size(); ++ i)
2772 polyEdgeis[i] = newEdgei();
2776 polygonTriangulate_.triangulate
2778 UIndirectList<point>(
points, polyPointis)
2782 forAll(polygonTriangulate_.triPoints(), trii)
2786 polygonTriangulate_.triPoints(trii, polyPointis),
2787 polygonTriangulate_.triEdges(trii, polyEdgeis),
2793 insert(leftPolyPointis, leftPolyEdgeis);
2794 insert(rightPolyPointis, rightPolyEdgeis);
2799 checkPatchFace(patchFacei, isSrc);
2805 template<
class SrcPatchType,
class TgtPatchType>
2809 const label srcFacei,
2810 const label tgtFacei
2814 conformPatchFaceTris(srcFacei, tgtFacei,
true)
2815 && conformPatchFaceTris(tgtFacei, srcFacei,
false);
2819 template<
class SrcPatchType,
class TgtPatchType>
2823 const label srcFacei,
2824 const label tgtFacei
2829 auto triIsIntersected = [&]
2832 const label otherPatchFacei,
2833 const triFace& otherPatchFacePatchPoints,
2834 const triFace& otherPatchFacePatchEdges,
2838 const labelList& pointOtherPatchPoints =
2839 isSrc ? this->pointTgtPoints_ : this->pointSrcPoints_;
2841 isSrc ? this->pointTgtEdges_ : this->pointSrcEdges_;
2843 isSrc ? this->pointTgtFaces_ : this->pointSrcFaces_;
2845 forAll(triPoints_[trii], triPointi)
2847 const label pointi = triPoint(trii, triPointi);
2854 otherPatchFacePatchPoints,
2855 pointOtherPatchPoints[pointi]
2860 otherPatchFacePatchEdges,
2861 pointOtherPatchEdges[pointi]
2864 && pointOtherPatchFaces[pointi] != otherPatchFacei
2877 auto getIntersectionPolygon = [&]
2879 const label patchFacei,
2880 const label otherPatchFacei,
2882 DynamicList<label>& triis,
2883 DynamicList<label>& edgeis
2887 isSrc ? srcFaceTris_[patchFacei] : tgtFaceTris_[patchFacei];
2889 isSrc ? triSrcFace_ : triTgtFace_;
2891 const triFace otherPatchFacePatchPoints
2893 patchFacePatchPoints(otherPatchFacei, !isSrc)
2895 const triFace otherPatchFacePatchEdges
2897 patchFacePatchEdges(otherPatchFacei, !isSrc)
2902 forAll(patchFaceTris, patchFaceTrii)
2904 const label trii = patchFaceTris[patchFaceTrii];
2911 otherPatchFacePatchPoints,
2912 otherPatchFacePatchEdges,
2921 if (trii0 == -1)
return;
2924 star::context starContext = star_.populate
2931 triPatchFaces[trii] == patchFacei
2936 otherPatchFacePatchPoints,
2937 otherPatchFacePatchEdges,
2954 edgeis.append(edgei);
2957 DynamicList<label> srcPolyTris, srcPolyEdges;
2958 DynamicList<label> tgtPolyTris, tgtPolyEdges;
2959 getIntersectionPolygon
2967 getIntersectionPolygon
2977 if (srcPolyEdges.size() == 0 && tgtPolyEdges.size() == 0)
2983 if (srcPolyEdges.size() && tgtPolyEdges.size())
2987 label tgtPolyEdgei0 = 0;
2988 forAll(tgtPolyEdges, tgtPolyEdgei)
2990 const edge srcE = edgePoints(srcPolyEdges[0]);
2991 const edge tgtE = edgePoints(tgtPolyEdges[tgtPolyEdgei]);
2993 if (edge::compare(srcE, tgtE) != 0)
2995 tgtPolyEdgei0 = tgtPolyEdgei;
3007 if (srcPolyEdges.size() == tgtPolyEdges.size())
3010 forAll(srcPolyEdges, polyEdgei)
3012 const edge srcE = edgePoints(srcPolyEdges[polyEdgei]);
3013 const edge tgtE = edgePoints(tgtPolyEdges[polyEdgei]);
3015 if (edge::compare(srcE, tgtE) == 0)
3028 if (this->debug > 1)
3031 <<
indent <<
"Failed to combine intersected parts of source "
3032 <<
"face #" << srcFacei <<
" and target face #" << tgtFacei
3034 writePatchFace(srcFacei,
true);
3035 writePatchFace(tgtFacei,
false);
3041 forAll(srcPolyTris, srcPolyTrii)
3043 const label srcTrii = srcPolyTris[srcPolyTrii];
3044 markedTriTris_.append(srcTrii);
3045 triMarkedTris_[srcTrii] = markedTriTris_.size() - 1;
3047 forAll(tgtPolyTris, tgtPolyTrii)
3049 const label tgtTrii = tgtPolyTris[tgtPolyTrii];
3050 markedTriTris_.append(tgtTrii);
3051 triMarkedTris_[tgtTrii] = markedTriTris_.size() - 1;
3062 forAll(srcPolyEdges, polyEdgei)
3064 const label srcEdgei = srcPolyEdges[polyEdgei];
3065 const label tgtEdgei = tgtPolyEdges[polyEdgei];
3067 if (srcEdgei == tgtEdgei)
continue;
3069 const label srcEdgeTrii =
3070 edgeTris_[srcEdgei][0] == -1
3071 || triMarkedTris_[edgeTris_[srcEdgei][0]] == -1
3072 || triSrcFace_[edgeTris_[srcEdgei][0]] == -1;
3073 const label tgtEdgeTrii =
3074 edgeTris_[tgtEdgei][0] == -1
3075 || triMarkedTris_[edgeTris_[tgtEdgei][0]] == -1
3076 || triTgtFace_[edgeTris_[tgtEdgei][0]] == -1;
3078 const label tgtTrii = edgeTris_[tgtEdgei][tgtEdgeTrii];
3079 const label srcTrij = edgeTris_[srcEdgei][!srcEdgeTrii];
3080 const label tgtTrij = edgeTris_[tgtEdgei][!tgtEdgeTrii];
3082 edgeTris_[srcEdgei][!srcEdgeTrii] = tgtTrii;
3083 edgeTris_[tgtEdgei][tgtEdgeTrii] = srcTrij;
3085 const label tgtTriEdgei =
findIndex(triEdges_[tgtTrii], tgtEdgei);
3086 triEdges_[tgtTrii][tgtTriEdgei] = srcEdgei;
3090 const label srcTriEdgej =
findIndex(triEdges_[srcTrij], srcEdgei);
3091 triEdges_[srcTrij][srcTriEdgej] = tgtEdgei;
3094 if (srcTrij != -1 && tgtTrij != -1)
3096 edgeFrontEdges_[tgtEdgei] = frontEdgeEdges_.size();
3097 frontEdgeEdges_.append(tgtEdgei);
3102 const label facei = this->faces().size();
3103 this->faces_.append(
face(srcPolyEdges.size()));
3104 faceEdges_.append(
labelList(srcPolyEdges.size()));
3105 this->srcFaceFaces_[srcFacei].append(facei);
3106 this->tgtFaceFaces_[tgtFacei].append(facei);
3107 this->faceSrcFaces_.append(srcFacei);
3108 this->faceTgtFaces_.append(tgtFacei);
3109 forAll(srcPolyEdges, polyEdgei)
3111 const label srcEdgei = srcPolyEdges[polyEdgei];
3112 const label srcEdgeTrii =
3113 edgeTris_[srcEdgei][0] == -1
3114 || triMarkedTris_[edgeTris_[srcEdgei][0]] == -1
3115 || triSrcFace_[edgeTris_[srcEdgei][0]] == -1;
3117 const label srcTrii = edgeTris_[srcEdgei][srcEdgeTrii];
3118 const label srcTriEdgei =
findIndex(triEdges_[srcTrii], srcEdgei);
3120 this->faces_.last()[polyEdgei] =
3121 triEdgePoints(srcTrii, srcTriEdgei).start();
3123 const label tgtEdgei = tgtPolyEdges[polyEdgei];
3125 faceEdges_.last()[polyEdgei] = tgtEdgei;
3126 intersectEdgeFaces_[tgtEdgei][intersectEdgeFaces_[tgtEdgei][0] != -1] =
3131 forAll(markedTriTris_, candidateTrii)
3133 const label trii = markedTriTris_[candidateTrii];
3136 triMarkedTris_[trii] = -1;
3139 markedTriTris_.clear();
3142 checkPatchFace(srcFacei,
true);
3143 checkPatchFace(tgtFacei,
false);
3146 forAll(srcPolyTris, srcPolyTrii)
3148 removeTri(srcPolyTris[srcPolyTrii]);
3150 forAll(tgtPolyTris, tgtPolyTrii)
3152 removeTri(tgtPolyTris[tgtPolyTrii]);
3156 checkPatchFace(srcFacei,
true);
3157 checkPatchFace(tgtFacei,
false);
3160 forAll(tgtPolyEdges, polyEdgei)
3162 const label edgei = tgtPolyEdges[polyEdgei];
3164 const label trii0 = edgeTris_[edgei][0];
3165 const label trii1 = edgeTris_[edgei][1];
3167 const bool isFront =
3170 && (triSrcFace_[trii0] == -1) != (triSrcFace_[trii1] == -1);
3172 if (isFront && edgeFrontEdges_[edgei] == -1)
3174 edgeFrontEdges_[edgei] = frontEdgeEdges_.size();
3175 frontEdgeEdges_.append(edgei);
3178 if (!isFront && edgeFrontEdges_[edgei] != -1)
3180 frontEdgeEdges_[edgeFrontEdges_[edgei]] = -1;
3181 edgeFrontEdges_[edgei] = -1;
3186 checkPatchFace(srcFacei,
true);
3187 checkPatchFace(tgtFacei,
false);
3193 template<
class SrcPatchType,
class TgtPatchType>
3201 this->points_.clear();
3203 this->srcPointPoints_ = -1;
3204 this->tgtPointPoints_ = -1;
3205 this->pointSrcPoints_.clear();
3206 this->pointTgtPoints_.clear();
3208 forAll(this->srcEdgePoints_, srcEdgei)
3210 this->srcEdgePoints_[srcEdgei].clear();
3212 forAll(this->tgtEdgePoints_, tgtEdgei)
3214 this->tgtEdgePoints_[tgtEdgei].clear();
3216 this->pointSrcEdges_.clear();
3217 this->pointTgtEdges_.clear();
3219 this->pointSrcFaces_.clear();
3220 this->pointTgtFaces_.clear();
3222 this->faces_.clear();
3224 forAll(this->srcFaceFaces_, srcFacei)
3226 this->srcFaceFaces_[srcFacei].clear();
3228 forAll(this->tgtFaceFaces_, tgtFacei)
3230 this->tgtFaceFaces_[tgtFacei].clear();
3232 this->faceSrcFaces_.clear();
3233 this->faceTgtFaces_.clear();
3239 this->srcPatch_.nPoints() + this->tgtPatch_.nPoints();
3240 srcPoints_.resize(
nPoints, point::uniform(NaN));
3241 srcPointNormals_.resize(
nPoints, vector::uniform(NaN));
3242 tgtPoints_.resize(
nPoints, point::uniform(NaN));
3243 pointPoints_.resize(
nPoints, -1);
3244 this->pointSrcPoints_.resize(
nPoints, -1);
3245 this->pointTgtPoints_.resize(
nPoints, -1);
3246 this->pointSrcEdges_.resize(
nPoints, -1);
3247 this->pointTgtEdges_.resize(
nPoints, -1);
3248 this->pointSrcFaces_.resize(
nPoints, -1);
3249 this->pointTgtFaces_.resize(
nPoints, -1);
3250 forAll(this->srcPatch_.localPoints(), srcPointi)
3252 const label pointi = srcPointi;
3254 srcPoints_[pointi] = this->srcPatch_.localPoints()[srcPointi];
3255 tgtPoints_[pointi] = this->srcPatch_.localPoints()[srcPointi];
3256 srcPointNormals_[pointi] = srcPointNormals[srcPointi];
3257 pointPoints_[pointi] = pointi;
3258 this->srcPointPoints_[srcPointi] = pointi;
3259 this->pointSrcPoints_[pointi] = srcPointi;
3261 forAll(this->tgtPatch_.localPoints(), tgtPointi)
3263 const label pointi = this->srcPatch_.nPoints() + tgtPointi;
3265 srcPoints_[pointi] = this->tgtPatch_.localPoints()[tgtPointi];
3266 tgtPoints_[pointi] = this->tgtPatch_.localPoints()[tgtPointi];
3267 pointPoints_[pointi] = pointi;
3268 this->tgtPointPoints_[tgtPointi] = pointi;
3269 this->pointTgtPoints_[pointi] = tgtPointi;
3273 const label nEdges = this->srcPatch_.nEdges() + this->tgtPatch_.nEdges();
3274 edgeTris_.resize(nEdges,
labelPair(-1, -1));
3275 intersectEdgeFaces_.resize(nEdges,
labelPair(-1, -1));
3276 forAll(this->srcPatch_.faceEdges(), srcFacei)
3278 const label trii = srcFacei;
3280 forAll(this->srcPatch_.faceEdges()[srcFacei], srcFaceEdgei)
3282 const label srcEdgei =
3283 this->srcPatch_.faceEdges()[srcFacei][srcFaceEdgei];
3284 const label edgei = srcEdgei;
3286 const edge&
e = this->srcPatch_.edges()[srcEdgei];
3288 this->srcPatch_.localFaces()[srcFacei].faceEdge(srcFaceEdgei);
3290 edgeTris_[edgei][edge::compare(
e, fe) < 0] = trii;
3293 forAll(this->srcPatch_.edges(), srcEdgei)
3295 const edge&
e = this->srcPatch_.edges()[srcEdgei];
3297 this->srcEdgePoints_[srcEdgei].append(this->srcPointPoints_[
e[0]]);
3298 this->srcEdgePoints_[srcEdgei].append(this->srcPointPoints_[
e[1]]);
3300 forAll(this->tgtPatch_.faceEdges(), tgtFacei)
3302 const label trii = this->srcPatch_.size() + tgtFacei;
3304 forAll(this->tgtPatch_.faceEdges()[tgtFacei], tgtFaceEdgei)
3306 const label tgtEdgei =
3307 this->tgtPatch_.faceEdges()[tgtFacei][tgtFaceEdgei];
3308 const label edgei = this->srcPatch_.nEdges() + tgtEdgei;
3310 const edge&
e = this->tgtPatch_.edges()[tgtEdgei];
3312 this->tgtPatch_.localFaces()[tgtFacei].faceEdge(tgtFaceEdgei);
3314 edgeTris_[edgei][edge::compare(
e, fe) < 0] = trii;
3317 forAll(this->tgtPatch_.edges(), tgtEdgei)
3319 const edge&
e = this->tgtPatch_.edges()[tgtEdgei];
3321 this->tgtEdgePoints_[tgtEdgei].append(this->tgtPointPoints_[
e[0]]);
3322 this->tgtEdgePoints_[tgtEdgei].append(this->tgtPointPoints_[
e[1]]);
3326 const label nTris = this->srcPatch_.size() + this->tgtPatch_.size();
3327 triPoints_.resize(nTris);
3328 triEdges_.resize(nTris);
3329 triSrcFace_.resize(nTris, -1);
3330 triTgtFace_.resize(nTris, -1);
3331 forAll(this->srcPatch_.localFaces(), srcFacei)
3333 const label trii = srcFacei;
3335 forAll(this->srcPatch_.localFaces()[srcFacei], i)
3337 triPoints_[trii][i] = this->srcPatch_.localFaces()[srcFacei][i];
3338 triEdges_[trii][i] = this->srcPatch_.faceEdges()[srcFacei][i];
3340 triSrcFace_[trii] = srcFacei;
3341 srcFaceTris_[srcFacei].resize(1, trii);
3343 forAll(this->tgtPatch_.localFaces(), tgtFacei)
3345 const label trii = this->srcPatch_.size() + tgtFacei;
3347 forAll(this->tgtPatch_.localFaces()[tgtFacei], i)
3349 triPoints_[trii][i] =
3350 this->srcPatch_.nPoints()
3351 + this->tgtPatch_.localFaces()[tgtFacei][i];
3352 triEdges_[trii][i] =
3353 this->srcPatch_.nEdges()
3354 + this->tgtPatch_.faceEdges()[tgtFacei][i];
3356 triTgtFace_[trii] = tgtFacei;
3357 tgtFaceTris_[tgtFacei].resize(1, trii);
3361 removedEdges_.clear();
3362 removedTris_.clear();
3365 frontEdgeEdges_.clear();
3366 edgeFrontEdges_ = DynamicList<label>(edgeTris_.size(), -1);
3369 candidateTriTris_.clear();
3370 triCandidateTris_ = DynamicList<label>(triPoints_.size(), -1);
3373 markedTriTris_.clear();
3374 triMarkedTris_ = DynamicList<label>(triPoints_.size(), -1);
3376 checkPatchFaces(
true);
3377 checkPatchFaces(
false);
3381 template<
class SrcPatchType,
class TgtPatchType>
3392 labelList oldPointNewPoints(pointPoints_.size(), -1);
3394 forAll(pointPoints_, pointj)
3396 if (pointPoints_[pointj] == pointj)
3398 oldPointNewPoints[pointj] = pointi;
3399 srcPoints_[pointi] = srcPoints_[pointj];
3400 srcPointNormals_[pointi] = srcPointNormals_[pointj];
3401 tgtPoints_[pointi] = tgtPoints_[pointj];
3402 pointPoints_[pointi] = pointi;
3403 this->pointSrcPoints_[pointi] = this->pointSrcPoints_[pointj];
3404 this->pointTgtPoints_[pointi] = this->pointTgtPoints_[pointj];
3405 this->pointSrcEdges_[pointi] = this->pointSrcEdges_[pointj];
3406 this->pointTgtEdges_[pointi] = this->pointTgtEdges_[pointj];
3407 this->pointSrcFaces_[pointi] = this->pointSrcFaces_[pointj];
3408 this->pointTgtFaces_[pointi] = this->pointTgtFaces_[pointj];
3412 srcPoints_.resize(pointi);
3413 srcPointNormals_.resize(pointi);
3414 tgtPoints_.resize(pointi);
3415 pointPoints_.resize(pointi);
3416 this->pointSrcPoints_.resize(pointi);
3417 this->pointTgtPoints_.resize(pointi);
3418 this->pointSrcEdges_.resize(pointi);
3419 this->pointTgtEdges_.resize(pointi);
3420 this->pointSrcFaces_.resize(pointi);
3421 this->pointTgtFaces_.resize(pointi);
3424 labelList oldEdgeNewEdges(edgeTris_.size(), -1);
3431 || intersectEdgeFaces_[edgej] !=
labelPair(-1, -1)
3434 oldEdgeNewEdges[edgej] = edgei;
3435 edgeTris_[edgei] = edgeTris_[edgej];
3436 intersectEdgeFaces_[edgei] = intersectEdgeFaces_[edgej];
3437 edgeFrontEdges_[edgei] = edgeFrontEdges_[edgej];
3441 edgeTris_.resize(edgei);
3442 intersectEdgeFaces_.resize(edgei);
3443 edgeFrontEdges_.resize(edgei);
3446 labelList oldTriNewTris(triPoints_.size(), -1);
3450 if (triPoints_[trij] != FixedList<label, 3>({-1, -1, -1}))
3452 oldTriNewTris[trij] = trii;
3453 triPoints_[trii] = triPoints_[trij];
3454 triEdges_[trii] = triEdges_[trij];
3455 triSrcFace_[trii] = triSrcFace_[trij];
3456 triTgtFace_[trii] = triTgtFace_[trij];
3460 triPoints_.resize(trii);
3461 triEdges_.resize(trii);
3462 triSrcFace_.resize(trii);
3463 triTgtFace_.resize(trii);
3480 removedEdges_.clear();
3481 removedTris_.clear();
3484 candidateTriTris_.clear();
3485 triCandidateTris_ = DynamicList<label>(triPoints_.size(), -1);
3488 markedTriTris_.clear();
3489 triMarkedTris_ = DynamicList<label>(triPoints_.size(), -1);
3491 checkPatchFaces(
true);
3492 checkPatchFaces(
false);
3496 template<
class SrcPatchType,
class TgtPatchType>
3503 const label nFaces = this->faces_.size();
3505 this->faces_.resize(nFaces + triPoints_.size());
3506 faceEdges_.resize(nFaces + triPoints_.size());
3507 this->faceSrcFaces_.resize(nFaces + triPoints_.size());
3508 this->faceTgtFaces_.resize(nFaces + triPoints_.size());
3512 const label facei = nFaces + trii;
3514 if (triSrcFace_[trii] != -1)
3516 this->faces_[facei] = triPoints(trii);
3517 faceEdges_[facei] =
labelList(triEdges_[trii]);
3518 this->srcFaceFaces_[triSrcFace_[trii]].append(facei);
3519 this->faceSrcFaces_[facei] = triSrcFace_[trii];
3520 this->faceTgtFaces_[facei] = -1;
3524 this->faces_[facei] = triPoints(trii).reverseFace();
3526 this->tgtFaceFaces_[triTgtFace_[trii]].append(facei);
3527 this->faceSrcFaces_[facei] = -1;
3528 this->faceTgtFaces_[facei] = triTgtFace_[trii];
3532 nonIntersectEdgeFaces_.resize(edgeTris_.size());
3535 forAll(edgeTris_[edgei], edgeTrii)
3537 nonIntersectEdgeFaces_[edgei][edgeTrii] =
3538 edgeTris_[edgei][edgeTrii] + nFaces;
3542 checkPatchFaces(
true);
3543 checkPatchFaces(
false);
3547 template<
class SrcPatchType,
class TgtPatchType>
3557 nFaces < this->faces_.size()
3558 && this->faceSrcFaces_[nFaces] != -1
3559 && this->faceTgtFaces_[nFaces] != -1
3565 this->faces_.resize(nFaces);
3566 faceEdges_.resize(nFaces);
3567 this->faceSrcFaces_.resize(nFaces);
3568 this->faceTgtFaces_.resize(nFaces);
3572 DynamicList<label>& faceis =
3573 triSrcFace_[trii] != -1
3574 ? this->srcFaceFaces_[triSrcFace_[trii]]
3575 : this->tgtFaceFaces_[triTgtFace_[trii]];
3578 while (
n < faceis.size() && faceis[
n] < nFaces)
3586 nonIntersectEdgeFaces_.clear();
3588 checkPatchFaces(
true);
3589 checkPatchFaces(
false);
3593 template<
class SrcPatchType,
class TgtPatchType>
3596 if (this->debug > 2)
3601 this->report(
name(writei_));
3606 const fileName frontFileName =
3607 type() +
"_front_" +
name(writei_) +
".vtk";
3610 DynamicList<point> writePoints(frontEdgeEdges_.size()*2);
3611 DynamicList<labelPair> writeLines(frontEdgeEdges_.size()*2);
3612 forAll(frontEdgeEdges_, frontEdgei)
3614 const label edgei = frontEdgeEdges_[frontEdgei];
3616 if (edgei == -1)
continue;
3618 const edge
e = edgePoints(edgei);
3619 writePoints.append(tgtPoints_[
e.start()]);
3620 writePoints.append(tgtPoints_[
e.end()]);
3622 const label i = writePoints.size() - 2;
3642 template<
class SrcPatchType,
class TgtPatchType>
3645 const label patchFacei,
3651 word(isSrc ?
"src" :
"tgt") +
"Face_" +
name(patchFacei) +
".obj"
3656 word(isSrc ?
"src" :
"tgt") +
"FaceTris_" +
name(patchFacei) +
".obj"
3660 <<
" and patch face triangulation to " << tos.
name()
3663 forAll(patchFacePatchPoints(patchFacei, isSrc), patchFacePatchPointi)
3665 const label patchPointi =
3666 patchFacePatchPoints(patchFacei, isSrc)[patchFacePatchPointi];
3669 ? this->srcPatch_.localPoints()[patchPointi]
3670 : this->tgtPatch_.localPoints()[patchPointi];
3671 os <<
"v " <<
p.x() <<
' ' <<
p.y() <<
' ' <<
p.z() <<
nl;
3673 os <<
"f 1 2 3" <<
nl;
3676 isSrc ? srcFaceTris_[patchFacei] : tgtFaceTris_[patchFacei];
3678 forAll(patchFaceTris, patchFaceTrii)
3680 const label trii = patchFaceTris[patchFaceTrii];
3682 Info<<
indent <<
"tri #" << trii <<
" points=" << triPoints(trii)
3683 <<
" edges=" << triEdges_[trii] <<
endl;
3685 forAll(triPoints_[trii], triPointi)
3687 const label pointi = triPoint(trii, triPointi);
3688 const point&
p = isSrc ? srcPoints_[pointi] : tgtPoints_[pointi];
3689 tos <<
"v " <<
p.x() <<
' ' <<
p.y() <<
' ' <<
p.z() <<
nl;
3692 forAll(triPoints_[trii], triPointi)
3694 tos <<
" " << 1 + 3*patchFaceTrii + triPointi;
3705 template<
class SrcPatchType,
class TgtPatchType>
3708 const SrcPatchType& srcPatch,
3709 const TgtPatchType& tgtPatch,
3710 const scalar snapTol
3717 template<
class SrcPatchType,
class TgtPatchType>
3720 const SrcPatchType& srcPatch,
3722 const TgtPatchType& tgtPatch,
3723 const scalar snapTol
3730 tgtPoints_(this->points_),
3734 intersectEdgeFaces_(),
3735 nonIntersectEdgeFaces_(),
3741 srcFaceTris_(srcPatch.size()),
3742 tgtFaceTris_(tgtPatch.size()),
3752 candidateTriTris_(),
3753 triCandidateTris_(),
3758 polygonTriangulate_(),
3767 << this->
srcPatch_.size() <<
" source tri faces and "
3809 srcFaceSpheres[srcFacei] =
3813 {srcFace[0], srcFace[1], srcFace[2], -1},
3816 srcFaceSpheres[srcFacei].inflate(snapTol);
3821 tgtFaceSpheres[tgtFacei] =
3825 {tgtFace[0], tgtFace[1], tgtFace[2], -1},
3828 tgtFaceSpheres[tgtFacei].inflate(snapTol);
3834 12*(this->
srcPatch_.size() + this->tgtPatch_.size())
3838 label nIntersections = 0, nIntersectionFailures = 0;
3841 auto intersect = [&](
const label srcFacei,
const label tgtFacei)
3853 forAll(srcLocalFaces[srcFacei], srcFacePointi)
3855 const label srcPointi =
3856 srcLocalFaces[srcFacei][srcFacePointi];
3858 forAll(srcPointFaces[srcPointi], srcPointFacei)
3860 const label srcFacej =
3861 srcPointFaces[srcPointi][srcPointFacei];
3863 forAll(tgtLocalFaces[tgtFacei], tgtFacePointi)
3865 const label tgtPointi =
3866 tgtLocalFaces[tgtFacei][tgtFacePointi];
3868 forAll(tgtPointFaces[tgtPointi], tgtPointFacei)
3870 const label tgtFacej =
3871 tgtPointFaces[tgtPointi][tgtPointFacei];
3877 srcFaceSpheres[srcFacej],
3878 tgtFaceSpheres[tgtFacej]
3880 && !srcFaceTgtFaceSnaps.
found({srcFacej, tgtFacej})
3883 srcFaceTgtFaceSnaps.
insert({srcFacej, tgtFacej});
3884 snapPatchFaceTris(srcFacej, tgtFacej, snapTol);
3891 intersectPatchFaceTris(srcFacei, tgtFacei);
3895 const bool conformFailure = !conformPatchFaceTris(srcFacei, tgtFacei);
3897 const bool combineFailure = !combinePatchFaceTris(srcFacei, tgtFacei);
3900 nIntersectionFailures += conformFailure || combineFailure;
3923 initialise(srcPointNormals);
3943 const point& srcP = srcPoints_[pointi];
3947 const label srcEdgei =
3948 this->
srcPatch_.pointEdges()[srcPointi][srcPointEdgei];
3955 srcL /= this->
srcPatch_.pointEdges()[srcPointi].size();
3959 const labelList tgtFaceis = tgtTree.findSphere(srcP,
sqr(srcL));
3962 if (tgtFaceis.
empty())
continue;
3968 const label srcFacei =
3969 this->
srcPatch_.pointFaces()[srcPointi][srcPointFacei];
3973 intersect(srcFacei, tgtFaceis[i]);
3975 if (frontEdgeEdges_.
size())
break;
3978 if (frontEdgeEdges_.
size())
break;
3982 while (frontEdgeEdges_.
size())
3986 if (edgei == -1)
continue;
3988 edgeFrontEdges_[edgei] = -1;
3990 label srcTrii = edgeTris_[edgei][0];
3991 label tgtTrii = edgeTris_[edgei][1];
3993 if (triSrcFace_[srcTrii] == -1)
3995 Swap(srcTrii, tgtTrii);
3998 intersect(triSrcFace_[srcTrii], triTgtFace_[tgtTrii]);
4009 if (nIntersectionFailures)
4011 Info<<
indent <<
"*** Topology could not be generated in "
4012 << nIntersectionFailures <<
"/" << nIntersections <<
" cases"
4013 <<
endl <<
indent <<
" The intersection may be incomplete"
4026 template<
class SrcPatchType,
class TgtPatchType>
#define forAll(list, i)
Loop across all elements in list.
T remove()
Remove and return the top element.
A HashTable with keys but without contents.
bool insert(const Key &key)
Insert a new entry.
bool found(const Key &) const
Return true if hashedEntry is found in table.
virtual const fileName & name() const
Return the name of the stream.
void size(const label)
Override size to be inconsistent with allocated storage.
Base class for patch intersections. Provides storage and access to the intersection points and faces ...
const SrcPatchType & srcPatch_
Reference to the source patch.
const TgtPatchType & tgtPatch_
Reference to the target patch.
Patch intersection based on triangular faces. Intersects and combines two triangulated patches increm...
virtual ~TriPatchIntersection()
Destructor.
TriPatchIntersection(const SrcPatchType &srcPatch, const TgtPatchType &tgtPatch, const scalar snapTol)
Construct from a source and a target patch.
const DynamicList< labelList > & faceEdges() const
...
virtual word type() const
bool empty() const
Return true if the UList is empty (ie, size() is zero)
static bool overlap(const boundSphere &a, const boundSphere &b)
Return whether two spheres overlap.
static boundSphere trivial(const PointList &ps, const FixedList< label, 4 > &pis, const label nPs)
Return the sphere bounding the given set of up to four points.
Starts timing CPU usage and return elapsed time from start.
double cpuTimeIncrement() const
Return CPU time (in seconds) since last call to cpuTimeIncrement()
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
A class for handling file names.
word name() const
Return file name (part beyond last /)
Non-pointer based hierarchical recursive searching.
DynamicList< label > pointTgtFaces_
The intersection points' target faces, or -1 if the point.
DynamicField< point > points_
The intersection points.
DynamicList< label > pointTgtPoints_
The intersection points' corresponding target points, or -1.
void report(const word &writeSuffix=word::null)
Report properties of the intersection process.
DynamicList< label > pointSrcPoints_
The intersection points' corresponding source points, or -1.
DynamicList< face > faces_
The intersection faces.
DynamicList< label > pointTgtEdges_
The intersection points' target edges, or -1 if the point.
Motion of the mesh specified as a list of pointMeshMovers.
Standard boundBox + extra functionality for use in octree.
treeBoundBox extend(const scalar s) const
Return asymmetrically extended bounding box, with guaranteed.
Encapsulation of data needed to search on PrimitivePatches.
A triangular face using a FixedList of labels corresponding to mesh vertices.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
volVectorField vectorField(fieldObject, mesh)
#define WarningInFunction
Report a warning using Foam::Warning.
const dimensionedScalar e
Elementary charge.
static const coefficient A("A", dimPressure, 611.21)
barycentric2D srcPointTgtTriIntersection(const point &srcP, const vector &srcN, const FixedList< point, 3 > &tgtPs)
Calculate the intersection of a projected source point with a target.
barycentric2D srcTriTgtPointIntersection(const FixedList< point, 3 > &srcPs, const FixedList< vector, 3 > &srcNs, const point &tgtP)
Calculate the intersection of a target point with a source triangle's.
Type tgtTriInterpolate(const barycentric2D &y, const FixedList< Type, 3 > &tgtPsis)
Use the coordinates obtained from srcPointTgtTriIntersection to interpolate.
Type srcTriInterpolate(const barycentric2D &y, const FixedList< Type, 3 > &tgtPsis)
Use the coordinates obtained from srcTriTgtPointIntersection to interpolate.
void intersectTris(const FixedList< point, 3 > &srcPs, const FixedList< vector, 3 > &srcNs, const FixedList< bool, 3 > &srcOwns, const FixedList< label, 3 > &srcTgtPis, const FixedList< point, 3 > &tgtPs, const FixedList< bool, 3 > &tgtOwns, const FixedList< label, 3 > &tgtSrcPis, DynamicList< point > &srcPoints, DynamicList< vector > &srcPointNormals, DynamicList< point > &tgtPoints, DynamicList< location > &pointLocations, const bool debug, const word &writePrefix=word::null)
Construct the intersection of a source triangle's projected volume and a.
void insert(const scalar, DynamicList< floatScalar > &)
Append scalar to given DynamicList.
void write(std::ostream &os, const bool binary, List< floatScalar > &fField)
Write floats ascii or binary.
void write(const fileName &file, const word &title, const bool binary, const PointField &points, const VertexList &vertices, const LineList &lines, const FaceList &faces, const wordList &fieldNames, const boolList &fieldIsPointValues, const UPtrList< const Field< label >> &fieldLabelValues #define FieldTypeValuesConstArg(Type, nullArg))
Write VTK polygonal data to a file. Takes a PtrList of fields of labels and.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Pair< label > labelPair
Label pair.
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
List< label > labelList
A List of labels.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Ostream & endl(Ostream &os)
Add newline and flush stream.
ListType reverseList(const ListType &list)
Reverse a list. First element becomes last element etc.
void inplaceReverseList(ListType &list)
Inplace reversal of a list using Swap.
void inplaceRotateList(ListType< DataType > &list, label n)
Inplace reversal of a list using the Reversal Block Swapping algorithm.
vectorField pointField
pointField is a vectorField.
static const Identity< scalar > I
Barycentric2D< scalar > barycentric2D
A scalar version of the templated Barycentric2D.
Ostream & incrIndent(Ostream &os)
Increment the indent level.
vector point
Point is a vector.
tmp< DimensionedField< typename outerProduct< Type, Type >::type, GeoMesh, Field >> sqr(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
Vector< scalar > vector
A scalar version of the templated Vector.
BarycentricTensor2D< scalar > barycentricTensor2D
A scalar version of the templated BarycentricTensor2D.
List< labelList > labelListList
A List of labelList.
void inplaceRenumber(const labelUList &oldToNew, ListType &)
Inplace renumber the values of a list.
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
triangle< point, const point & > triPointRef
tmp< DimensionedField< scalar, GeoMesh, Field > > mag(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
Cmpt cmptSum(const VectorSpace< Form, Cmpt, Ncmpts > &vs)
tmp< DimensionedField< scalar, GeoMesh, Field > > magSqr(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
UList< label > labelUList
Ostream & indent(Ostream &os)
Indent stream.
void T(GeometricField< Type, GeoMesh, PrimitiveField1 > &gf, const GeometricField< Type, GeoMesh, PrimitiveField2 > &gf1)
dimensioned< Type > max(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
#define forAllStarFaces(star, starFacei, facei)
#define forAllStarEdges(star, i, starEdgei, edgei)
Functions with which to perform an intersection of a pair of triangles; the source and target....