internal bool SetBoundary(AM_Boundary boundary) { AM_Edge edge; int numVertex = boundary.GetNumVertex(); // Viene marcato il flag di contorno for (int i = 0; i < boundary.GetNumVertex(); i++) { edge = boundary.Vertex(i).Edge; Point2d nextCoord = new Point2d(boundary[(i + 1) % numVertex]); // si trova lo spigolo del contorno while (!edge.DestCoord().EpsilonEquals(nextCoord, AM_Util.FLT_EPSILON)) { edge = edge.Next; } edge.Flag |= 0x02; edge.Symm().Flag |= 0x02; } // Trova lo spigolo iniziale AM_Edge pprevEdge = boundary.Vertex(numVertex - 1).Edge; while (!pprevEdge.DestCoord().EpsilonEquals(new Point2d(boundary[0]), 1e-8)) { pprevEdge = pprevEdge.Next; } pprevEdge = pprevEdge.Symm(); // viene usato come sentinella // controllo su tutti gli spigoli del contorno for (int i = 1; i <= boundary.GetNumVertex(); i++) { edge = boundary.Vertex(i - 1).Edge; Point2d nextCoord = new Point2d(boundary[i % numVertex]); // si trova lo spigolo del contorno while (edge.DestCoord() != nextCoord) { edge = edge.Next; } if (edge.CwFace() != null) { // se c'è una faccia a dx dello spigolo // ci sono spigoli da eliminare AM_Edge plookEdge = edge.Prev; while (plookEdge != pprevEdge) { AM_Edge pdeleteEdge = plookEdge; plookEdge = plookEdge.Prev; if ((pdeleteEdge.Flag & 0x02) == 0) { // Non è uno spigolo di bordo DeleteEdge(pdeleteEdge); } } } pprevEdge = edge.Symm(); } return(true); }
bool RecoverBoundary(AM_Boundary boundary) { // se viene inserito un punto per aggiustare la conformità // il flag baddFlag diventa true bool baddFlag = false; AM_Edge pbase = null; AM_Edge pprev = pbase = boundary.Vertex(0).Edge; for (int i = 1; (boundary.FlagHole ? i <= boundary.GetNumVertex() : i < boundary.GetNumVertex()); i++) { // si controlla che tutti i vertici siano in sequenza while (true) { Point3d p1 = boundary[i - 1]; Point3d p2 = boundary[i % (boundary.GetNumVertex())]; if (pbase.DestCoord() == new Point2d(p2)) { // il vertice è in sequenza: si continua con il successivo break; } else { pbase = pbase.Next; if (pbase == pprev) { // il ciclo dell'anello si è chiuso senza trovare il vertice // successivo; è necessario inserire un vertice in mezzeria del // lato mancante baddFlag = true; // si segnala l'aggiunta di un vertice Point3d mid = 0.5 * (p1 + p2); // si inserisce un vertice nel mezzo dello spigolo AM_Vertex pvertex = null; InsertPoint(new Point2d(mid), mid.Z, out pvertex); if (pvertex == null) { Debug.Assert(false); //throw 6; } boundary.InsertVertex(i, pvertex); // si ricomincia il controllo pbase = boundary.Vertex(i - 1).Edge; pprev = pbase; } } } pbase = boundary.Vertex(i % (boundary.GetNumVertex())).Edge; pprev = pbase; } return(baddFlag); }