Пример #1
0
 internal AM_Edge(AM_Coedge coedge, int index)
 {
     Debug.Assert(coedge != null);
     Debug.Assert(index == 0 || index == 1);
     m_WingedEdge = coedge;
     m_Flag      |= index;
 }
Пример #2
0
        AM_Edge AddEdge(AM_Vertex org, AM_Vertex dest)
        {
            AM_Coedge pwEdge = new AM_Coedge(org, dest);

            if (pwEdge == null)
            {
                Debug.Assert(false);
                //throw -1;
            }

            pwEdge.Index = m_ArrayWEdges.Count;
            m_ArrayWEdges.Add(pwEdge);

            AM_Edge edge = pwEdge.Edge();

            //edge.m_pArrayVertex = &m_ArrayVertexes;
            //edge.Symm().m_pArrayVertex = &m_ArrayVertexes;
            return(edge);
        }
Пример #3
0
        internal bool DeleteEdge(AM_Edge edge, bool bDelIsolatedVertex = false)
        {
            Debug.Assert(edge != null);
            // Cancella le facce collegate allo spigolo
            DeleteFace(edge.CwFace());
            DeleteFace(edge.CcwFace());

            AM_Coedge pwEdge        = edge.WingedEdge;
            AM_Coedge pdeletingEdge = m_ArrayWEdges[pwEdge.Index];
            int       nlast         = m_ArrayWEdges.Count - 1;

            Debug.Assert(pdeletingEdge == pwEdge);

            // La cancellazione dall'array globale degli spigoli avviene
            // spostando l'ultimo spigolo dell'array al posto di quello da cancellare
            m_ArrayWEdges[pwEdge.Index]       = m_ArrayWEdges[nlast];
            m_ArrayWEdges[pwEdge.Index].Index = pwEdge.Index;
            m_ArrayWEdges.RemoveAt(nlast);

            AM_Vertex pIsolated1 = null;
            AM_Vertex pIsolated2 = null;

            // ripristina le connessioni
            edge.Next.Prev = edge.Prev;
            edge.Prev.Next = edge.Next;
            if (edge.Next == edge && edge.Prev == edge)
            {
                // rimane un vertice isolato
                pIsolated1      = edge.Origin();
                pIsolated1.Edge = null;
            }
            else
            {
                edge.Origin().Edge = edge.Next;
            }

            // ripristina le connessioni del duale
            edge           = edge.Symm();
            edge.Next.Prev = edge.Prev;
            edge.Prev.Next = edge.Next;
            if (edge.Next == edge && edge.Prev == edge)
            {
                // rimane un vertice isolato
                pIsolated2      = edge.Origin();
                pIsolated2.Edge = null;
            }
            else
            {
                edge.Origin().Edge = edge.Next;
            }

            //delete pwEdge;

            if (bDelIsolatedVertex)
            {
                if (pIsolated1 != null)
                {
                    DeleteVertex(pIsolated1, true);
                }

                if (pIsolated2 != null)
                {
                    DeleteVertex(pIsolated2, true);
                }
            }

            edge.Next = null;
            edge.Prev = null;

            return(true);
        }