int IsDelaunay(Simplex* simplex, Vertex* point) { double orientation = orient3dfast(simplex->m_SimplexPoints[0]->m_Point, simplex->m_SimplexPoints[1]->m_Point, simplex->m_SimplexPoints[2]->m_Point, simplex->m_SimplexPoints[3]->m_Point); if (orientation <= 0) { printf("orientation error: %p, %lf\n",simplex,orientation); } double inSph = inspherefast( simplex->m_SimplexPoints[0]->m_Point, simplex->m_SimplexPoints[1]->m_Point, simplex->m_SimplexPoints[2]->m_Point, simplex->m_SimplexPoints[3]->m_Point, point->m_Point); if (inSph == 0) return -1; return inSph < 0; }
int SimplexContainsPoint(Simplex* simplex, Vertex* point) { int i; Vertex* p1,* p2,* p3,* p4; for (i = 0; i < 4; i++) { GetFaceVerticies(simplex, i, &p1, &p2, &p3, &p4); if (orient3dfast(p1->m_Point, p2->m_Point, p3->m_Point, point->m_Point) < 0) return 0; } return 1; }
Orient PredWrapper::doOrient3DFast( int v0, int v1, int v2, int v3 ) const { assert( ( v0 != v1 ) && ( v0 != v2 ) && ( v0 != v3 ) && ( v1 != v2 ) && ( v1 != v3 ) && ( v2 != v3 ) && "Duplicate indices in orientation!" ); const Point3 p[] = { getPoint( v0 ), getPoint( v1 ), getPoint( v2 ), getPoint( v3 ) }; RealType det = orient3dfast( p[0]._p, p[1]._p, p[2]._p, p[3]._p ); if ( (v0 == _infIdx) || (v1 == _infIdx) || (v2 == _infIdx) || (v3 == _infIdx) ) det = -det; return ortToOrient( det ); }
Simplex* FindContainingSimplex(DelaunayTriangulation* dt, Vertex* point) { ListNode* iter = TopOfLinkedList(dt->m_Simplices); Simplex* simplex = (Simplex*)NextElement(dt->m_Simplices,&iter); Vertex* v1,* v2,* v3,* v4; int i; for (i = 0; i < 4; i++) { GetFaceVerticies(simplex, i, &v1, &v2, &v3, &v4); if ((orient3dfast(v1->m_Point, v2->m_Point, v3->m_Point, point->m_Point) < 0) && simplex->m_NeighbourSimplices[i]) { simplex = simplex->m_NeighbourSimplices[i]; i = -1; } } return simplex; }
void AddPoint(Vertex* point, DelaunayTriangulation* dt) { UpdateConflictingSimplicies(point,dt); int i,j; for (j = 0; j < ArrayListSize(dt->m_Conflicts); j++) { Simplex* simplex = (Simplex*)GetFromArrayList(dt->m_Conflicts,j); for (i = 0; i < 4; i++) { Vertex* v1,* v2,* v3,* v4; GetFaceVerticies(simplex, i, &v1, &v2, &v3, &v4); if (! ArrayListContains(dt->m_Conflicts, simplex->m_NeighbourSimplices[i])) { Simplex* newS = NewSimplex(dt); newS->m_SimplexPoints[0] = v1; newS->m_SimplexPoints[1] = v2; newS->m_SimplexPoints[2] = v3; newS->m_SimplexPoints[3] = point; int attempt = 0; double o = orient3dfast(v1->m_Point, v2->m_Point, v3->m_Point, point->m_Point); if (o <= 0) { while (o <= 0) { RandomPerturbation(point, attempt); o = orient3dfast(v1->m_Point, v2->m_Point, v3->m_Point, point->m_Point); attempt ++; } UndoNeighbourUpdates(dt->m_NeighbourUpdates); int k; for (k = 0; k < ArrayListSize(dt->m_Updates); k++) { RemoveSimplexFromDelaunayTriangulation(dt, (Simplex*)GetFromArrayList(dt->m_Updates,k)); Push(dt->m_RemovedSimplices, GetFromArrayList(dt->m_Updates, k)); } EmptyArrayList(dt->m_Updates); EmptyArrayList(dt->m_Conflicts); AddPoint(point,dt); return; } newS->m_NeighbourSimplices[0] = simplex->m_NeighbourSimplices[i]; Simplex** update = SwapSimplexNeighbour(simplex->m_NeighbourSimplices[i], simplex, newS); PushNeighbourUpdate(dt->m_NeighbourUpdates, update, simplex); AddToArrayList(dt->m_Updates, newS); AddSimplexToDelaunayTriangulation(dt, newS); } } } SetNeighbours(dt->m_Updates); for (i = 0; i < ArrayListSize(dt->m_Conflicts); i++) { Simplex* simplex = (Simplex*)GetFromArrayList(dt->m_Conflicts, i); RemoveSimplexFromDelaunayTriangulation(dt,simplex); } }