Example #1
0
bool ICHull::ProcessPoint()
{
    double totalVolume = 0.0;
    if (!ComputePointVolume(totalVolume, true)) {
        return false;
    }
    // Mark edges in interior of visible region for deletion.
    // Create a new face based on each border edge
    CircularListElement<TMMVertex>* v0 = m_mesh.GetVertices().GetHead();
    CircularListElement<TMMEdge>* eHead = m_mesh.GetEdges().GetHead();
    CircularListElement<TMMEdge>* e = eHead;
    CircularListElement<TMMEdge>* tmp = 0;
    int nvisible = 0;
    m_edgesToDelete.Resize(0);
    m_edgesToUpdate.Resize(0);
    do {
        tmp = e->GetNext();
        nvisible = 0;
        for (int k = 0; k < 2; k++) {
            if (e->GetData().m_triangles[k]->GetData().m_visible) {
                nvisible++;
            }
        }
        if (nvisible == 2) {
            m_edgesToDelete.PushBack(e);
        }
        else if (nvisible == 1) {
            e->GetData().m_newFace = MakeConeFace(e, v0);
            m_edgesToUpdate.PushBack(e);
        }
        e = tmp;
    } while (e != eHead);
    return true;
}
Example #2
0
/*---------------------------------------------------------------------
AddOne is passed a vertex.  It first determines all faces visible from 
that point.  If none are visible then the point is marked as not 
onhull.  Next is a loop over edges.  If both faces adjacent to an edge
are visible, then the edge is marked for deletion.  If just one of the
adjacent faces is visible then a new face is constructed.
---------------------------------------------------------------------*/
int 	AddOne( tVertex p )
{
   tFace  f; 
   tEdge  e, temp;
   int 	  vol;
   int	  vis = FALSE;

   if ( debug ) {
      fprintf(stderr, "AddOne: starting to add v%d.\n", p->vnum);
      PrintOut( vertices );
   }

   /* Mark faces visible from p. */
   f = faces;
   do {
      vol = VolumeSign( f, p );
      if (debug) fprintf(stderr, 
         "faddr: %p   paddr: %p   Vol = %d\n", f,p,vol);
      if ( vol < 0 ) {
	 f->visible = VISIBLE;  
	 vis = TRUE;                      
      }
      f = f->next;
   } while ( f != faces );

   /* If no faces are visible from p, then p is inside the hull. */
   if ( !vis ) {
     p->onhull = !ONHULL;  
      return FALSE; 
   }

   /* Mark edges in interior of visible region for deletion.
      Erect a newface based on each border edge. */
   e = edges;
   do {
      temp = e->next;
      if ( e->adjface[0]->visible && e->adjface[1]->visible )
	 /* e interior: mark for deletion. */
	 e->deleted = REMOVED;
      else if ( e->adjface[0]->visible || e->adjface[1]->visible ) 
	 /* e border: make a new face. */
	 e->newface = MakeConeFace( e, p );
      e = temp;
   } while ( e != edges );
   return TRUE;
}