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:
graham 2010-03-31 18:10:05 +01:00
parent 3cf4d721eb
commit bb1a2476fd
2 changed files with 27 additions and 35 deletions

View File

@ -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,

View File

@ -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;
} }
} }
} }