ENH: Change concave cell checking to be based on face centres and face
planes, rather than a vertex-by-vertex check. Assesses concavity as relevant to the tracking.
This commit is contained in:
parent
3cf4d721eb
commit
bb1a2476fd
@ -649,7 +649,7 @@ public:
|
|||||||
labelHashSet* setPtr = NULL
|
labelHashSet* setPtr = NULL
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Check for concave cells
|
//- Check for concave cells by the planes of faces
|
||||||
bool checkConcaveCells
|
bool checkConcaveCells
|
||||||
(
|
(
|
||||||
const bool report = false,
|
const bool report = false,
|
||||||
|
@ -2111,7 +2111,6 @@ bool Foam::primitiveMesh::checkConcaveCells
|
|||||||
const labelList& fOwner = faceOwner();
|
const labelList& fOwner = faceOwner();
|
||||||
const vectorField& fAreas = faceAreas();
|
const vectorField& fAreas = faceAreas();
|
||||||
const pointField& fCentres = faceCentres();
|
const pointField& fCentres = faceCentres();
|
||||||
const pointField& pts = points();
|
|
||||||
|
|
||||||
label nConcaveCells = 0;
|
label nConcaveCells = 0;
|
||||||
|
|
||||||
@ -2119,8 +2118,6 @@ bool Foam::primitiveMesh::checkConcaveCells
|
|||||||
{
|
{
|
||||||
const cell& cFaces = c[cellI];
|
const cell& cFaces = c[cellI];
|
||||||
|
|
||||||
const labelList& cPoints = cellPoints()[cellI];
|
|
||||||
|
|
||||||
bool concave = false;
|
bool concave = false;
|
||||||
|
|
||||||
forAll(cFaces, i)
|
forAll(cFaces, i)
|
||||||
@ -2134,8 +2131,6 @@ bool Foam::primitiveMesh::checkConcaveCells
|
|||||||
|
|
||||||
const point& fC = fCentres[fI];
|
const point& fC = fCentres[fI];
|
||||||
|
|
||||||
const face& f = faces()[fI];
|
|
||||||
|
|
||||||
vector fN = fAreas[fI];
|
vector fN = fAreas[fI];
|
||||||
|
|
||||||
fN /= max(mag(fN), VSMALL);
|
fN /= max(mag(fN), VSMALL);
|
||||||
@ -2147,45 +2142,42 @@ bool Foam::primitiveMesh::checkConcaveCells
|
|||||||
fN *= -1;
|
fN *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is any vertex of the cell on the wrong side of the
|
// Is the centre of any other face of the cell on the
|
||||||
// plane of this face?
|
// wrong side of the plane of this face?
|
||||||
|
|
||||||
forAll(cPoints, cPtI)
|
forAll(cFaces, j)
|
||||||
{
|
{
|
||||||
label ptI = cPoints[cPtI];
|
if (j != i)
|
||||||
|
|
||||||
// Skip points that are on this face
|
|
||||||
if (findIndex(f, ptI) > -1)
|
|
||||||
{
|
{
|
||||||
continue;
|
label fJ = cFaces[j];
|
||||||
}
|
|
||||||
|
|
||||||
const point& pt = pts[ptI];
|
const point& pt = fCentres[fJ];
|
||||||
|
|
||||||
// If the cell is concave, the point will be on the
|
// If the cell is concave, the point will be on the
|
||||||
// positive normal side of the plane of f, defined by
|
// positive normal side of the plane of f, defined by
|
||||||
// its centre and normal, and the angle between (pt -
|
// its centre and normal, and the angle between (pt -
|
||||||
// fC) and fN will be less than 90 degrees, so the dot
|
// fC) and fN will be less than 90 degrees, so the dot
|
||||||
// product will be positive.
|
// product will be positive.
|
||||||
|
|
||||||
vector pC = (pt - fC);
|
vector pC = (pt - fC);
|
||||||
|
|
||||||
pC /= max(mag(pC), VSMALL);
|
pC /= max(mag(pC), VSMALL);
|
||||||
|
|
||||||
if ((pC & fN) > -planarCosAngle_)
|
if ((pC & fN) > -planarCosAngle_)
|
||||||
{
|
|
||||||
// Concave or planar face
|
|
||||||
|
|
||||||
concave = true;
|
|
||||||
|
|
||||||
if (setPtr)
|
|
||||||
{
|
{
|
||||||
setPtr->insert(cellI);
|
// Concave or planar face
|
||||||
|
|
||||||
|
concave = true;
|
||||||
|
|
||||||
|
if (setPtr)
|
||||||
|
{
|
||||||
|
setPtr->insert(cellI);
|
||||||
|
}
|
||||||
|
|
||||||
|
nConcaveCells++;
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
nConcaveCells++;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user