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; }
/*--------------------------------------------------------------------- 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; }