Пример #1
0
        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);
        }
Пример #2
0
        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);
        }