42 const Foam::scalar Foam::geomCellLooper::pointEqualTol_ = 1
E-3;
46 Foam::scalar Foam::geomCellLooper::snapTol_ = 0.1;
62 Foam::scalar Foam::geomCellLooper::minEdgeLen(
const label vertI)
const
64 scalar minLen = GREAT;
70 const edge&
e =
mesh().
edges()[pEdges[pEdgeI]];
80 bool Foam::geomCellLooper::cutEdge
82 const plane& cutPlane,
91 scalar s = cutPlane.normalIntersect(pts[e.start()], e.vec(pts));
93 if ((s > -pointEqualTol_) && (s < 1 + pointEqualTol_))
110 Foam::label Foam::geomCellLooper::snapToVert
123 else if (weight > (1-tol))
140 scalar nComp = n & base;
142 if (
mag(nComp) > 0.8)
151 if (
mag(nComp) > 0.8)
164 e0 /=
mag(e0) + VSMALL;
178 bool Foam::geomCellLooper::edgeEndsCut
184 label edgeI = getEdge(loop[index]);
188 const label prevCut = loop[loop.rcIndex(index)];
189 const label nextCut = loop[loop.fcIndex(index)];
191 if (!isEdge(prevCut) && !isEdge(nextCut))
195 label v0 = getVertex(prevCut);
196 label
v1 = getVertex(nextCut);
200 (v0 == e[0] && v1 == e[1])
201 || (v0 == e[1] && v1 == e[0])
243 plane(
mesh().cellCentres()[cellI], refDir),
256 const plane& cutPlane,
293 label edgeI = cellEdges[i];
295 const edge& e = edges[edgeI];
297 bool useStart =
false;
309 scalar typStartLen = pointEqualTol_ * minEdgeLen(e.
start());
316 localLoopWeights.
append(-GREAT);
325 scalar typEndLen = pointEqualTol_ * minEdgeLen(e.
end());
328 if (cutPlane.
distance(points[e.
end()]) < typEndLen)
332 localLoopWeights.
append(-GREAT);
342 if (!useEnd && !useStart)
348 if (cutEdge(cutPlane, edgeI, cutWeight))
351 label cutVertI = snapToVert(snapTol_, edgeI, cutWeight);
356 localLoop.
append(edgeToEVert(edgeI));
357 localLoopWeights.
append(cutWeight);
364 label cut = vertToEVert(cutVertI);
368 localLoop.
append(vertToEVert(cutVertI));
369 localLoopWeights.
append(-GREAT);
376 if (localLoop.
size() <= 2)
382 localLoopWeights.
shrink();
391 loopPoints[i] = coord(localLoop[i], localLoopWeights[i]);
392 ctr += loopPoints[i];
394 ctr /= localLoop.
size();
399 getBase(cutPlane.
normal(), e0, e1);
407 vector toCtr(loopPoints[i] - ctr);
420 const labelList& indices = sortedAngles.indices();
424 loop[i] = localLoop[indices[i]];
425 loopWeights[i] = localLoopWeights[indices[i]];
430 bool filterLoop =
false;
436 if (isEdge(cut) && edgeEndsCut(loop, i))
455 if (isEdge(cut) && edgeEndsCut(loop, i))
461 filteredLoop[filterI] = loop[i];
462 filteredLoopWeights[filterI] = loopWeights[i];
467 filteredLoopWeights.setSize(filterI);
470 loopWeights.
transfer(filteredLoopWeights);
478 Pout<<
"At angle:" << sortedAngles[i] << endl
481 writeCut(
Pout, loop[i], loopWeights[i]);
483 Pout<<
" coord:" << coord(loop[i], loopWeights[i]);