internal AM_Edge(AM_Coedge coedge, int index) { Debug.Assert(coedge != null); Debug.Assert(index == 0 || index == 1); m_WingedEdge = coedge; m_Flag |= index; }
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); }
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); }