diff --git a/contrib/hxt/tetMesh/src/hxt_tetDelaunay.c b/contrib/hxt/tetMesh/src/hxt_tetDelaunay.c index 9bfab36e6958aacbec37b2abd3d4f6e447467d6a..8238e55ac8ac1094604769101ea27f4617bd4dd6 100644 --- a/contrib/hxt/tetMesh/src/hxt_tetDelaunay.c +++ b/contrib/hxt/tetMesh/src/hxt_tetDelaunay.c @@ -65,21 +65,40 @@ static inline HXTStatus hxtTetrahedraInit(HXTMesh* mesh, HXTNodeInfo* nodeInfo, HXTVertex* vertices = (HXTVertex*) mesh->vertices.coord; // find non-coplanar vertices - double orientation = 0.0; - + int orientation = 0; uint32_t i=0, j=1, k=2, l=3; - for (i=0; orientation==0.0 && i<nToInsert-3; i++) + for (i=0; orientation==0 && i<nToInsert-3; i++) { - for (j=i+1; orientation==0.0 && j<nToInsert-2; j++) + double* d = vertices[nodeInfo[i].node].coord; + for (j=i+1; orientation==0 && j<nToInsert-2; j++) { - for (k=j+1; orientation==0.0 && k<nToInsert-1; k++) + double* c = vertices[nodeInfo[j].node].coord; + double cdx = c[0] - d[0]; + double cdy = c[1] - d[1]; + double cdz = c[2] - d[2]; + if(cdx == 0.0 && cdy == 0.0 && cdz == 0.0) + continue; + for (k=j+1; orientation==0 && k<nToInsert-1; k++) { - for (l=k+1; orientation==0.0 && l<nToInsert; l++) + double* b = vertices[nodeInfo[k].node].coord; + double bdx = b[0] - d[0]; + double bdy = b[1] - d[1]; + double bdz = b[2] - d[2]; + + double crossx = bdy * cdz - bdz * cdy; + double crossy = bdz * cdx - bdx * cdz; + double crossz = bdx * cdy - bdx * cdy; + // check for colinearity: cross product + if(crossx == 0.0 && crossy == 0.0 && crossz == 0.0) + continue; + for (l=k+1; orientation==0 && l<nToInsert; l++) { - orientation = orient3d(vertices[nodeInfo[i].node].coord, - vertices[nodeInfo[j].node].coord, - vertices[nodeInfo[k].node].coord, - vertices[nodeInfo[l].node].coord); + double* a = vertices[nodeInfo[l].node].coord; + double adx = a[0] - d[0]; + double ady = a[1] - d[1]; + double adz = a[2] - d[2]; + double det = adx * crossx + ady * crossy + adz * crossz; + orientation = (det > o3dstaticfilter) - (det < -o3dstaticfilter); } } } @@ -87,8 +106,8 @@ static inline HXTStatus hxtTetrahedraInit(HXTMesh* mesh, HXTNodeInfo* nodeInfo, l--; k--; j--; i--; - if(orientation==0.0){ - return HXT_ERROR_MSG(HXT_STATUS_FAILED, "all vertices are coplanar"); + if(orientation==0){ + return HXT_ERROR_MSG(HXT_STATUS_FAILED, "all vertices are coplanar or nearly coplanar"); } // swap 0<->i 1<->j 2<->k 3<->l @@ -119,7 +138,7 @@ static inline HXTStatus hxtTetrahedraInit(HXTMesh* mesh, HXTNodeInfo* nodeInfo, } - if(orientation > 0.0){ + if(orientation > 0){ uint32_t tmp = i; i = j; j = tmp;