ENH: Use concavity check based on face planes.

A cell is concave if there is a face whose face-centre is outside the plane of any other face on the cell.
Another option is to check for any vertices being         outside      ,,    ,,
but this is not consistent with current tracking.
This commit is contained in:
mattijs 2010-03-31 15:53:07 +01:00
parent d947aa9c9e
commit cf5ae6d629

View File

@ -2111,7 +2111,6 @@ bool Foam::primitiveMesh::checkConcaveCells
const labelList& fOwner = faceOwner();
const vectorField& fAreas = faceAreas();
const pointField& fCentres = faceCentres();
const pointField& pts = points();
label nConcaveCells = 0;
@ -2119,8 +2118,6 @@ bool Foam::primitiveMesh::checkConcaveCells
{
const cell& cFaces = c[cellI];
const labelList& cPoints = cellPoints()[cellI];
bool concave = false;
forAll(cFaces, i)
@ -2134,8 +2131,6 @@ bool Foam::primitiveMesh::checkConcaveCells
const point& fC = fCentres[fI];
const face& f = faces()[fI];
vector fN = fAreas[fI];
fN /= max(mag(fN), VSMALL);
@ -2147,45 +2142,42 @@ bool Foam::primitiveMesh::checkConcaveCells
fN *= -1;
}
// Is any vertex of the cell on the wrong side of the
// plane of this face?
// Is the centre of any other face of the cell on the
// wrong side of the plane of this face?
forAll(cPoints, cPtI)
forAll(cFaces, j)
{
label ptI = cPoints[cPtI];
// Skip points that are on this face
if (findIndex(f, ptI) > -1)
if (j != i)
{
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
// positive normal side of the plane of f, defined by
// its centre and normal, and the angle between (pt -
// fC) and fN will be less than 90 degrees, so the dot
// product will be positive.
// If the cell is concave, the point will be on the
// positive normal side of the plane of f, defined by
// its centre and normal, and the angle between (pt -
// fC) and fN will be less than 90 degrees, so the dot
// 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_)
{
// Concave or planar face
concave = true;
if (setPtr)
if ((pC & fN) > -planarCosAngle_)
{
setPtr->insert(cellI);
// Concave or planar face
concave = true;
if (setPtr)
{
setPtr->insert(cellI);
}
nConcaveCells++;
break;
}
nConcaveCells++;
break;
}
}
}
@ -2197,8 +2189,8 @@ bool Foam::primitiveMesh::checkConcaveCells
{
if (debug || report)
{
Info<< " ***Concave cells found, number of cells: "
<< nConcaveCells << endl;
Info<< " ***Concave cells (using face planes) found,"
<< " number of cells: " << nConcaveCells << endl;
}
return true;