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;
}
Exemplo n.º 3
0
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);
  }
}