/// <summary> /// halfEdge should be Upper->Lower so that the persistent half edges become: /// o halfEdge (Upper->Lower) ==> (vertex->Lower) /// o halfEdge.Twin (Lower->Upper) ==> (Lower->vertex) /// And the two newly created half edges are (vertex->Upper) and (Upper->vertex). /// </summary> private static void SplitEdge(DCEL_Subdivision subdivision, DCEL_HalfEdge halfEdge, DCEL_Vertex vertex) { Debug.Assert(VecRat2.CompareReadingOrder(halfEdge.Origin.Position, halfEdge.Destination.Position) < 0); DCEL_HalfEdge e1 = halfEdge; DCEL_HalfEdge e2 = e1.Twin; DCEL_HalfEdge e1_prev = e1.Prev; DCEL_HalfEdge e2_next = e2.Next; DCEL_Vertex e1_origin = e1.Origin; DCEL_HalfEdge e1_top = new DCEL_HalfEdge(); DCEL_HalfEdge e2_top = new DCEL_HalfEdge(); DCEL_Helper.JoinTwin(e1_top, e2_top); e1_top.IncidentFace = e1.IncidentFace; e2_top.IncidentFace = e2.IncidentFace; DCEL_Helper.JoinIncidentEdge(vertex, e2_top); DCEL_Helper.JoinIncidentEdge(vertex, e1); DCEL_Helper.JoinIncidentEdge(e1_origin, e1_top); if (e2_next == e1) { DCEL_Helper.JoinNext(e2, e2_top); DCEL_Helper.JoinNext(e2_top, e1_top); DCEL_Helper.JoinNext(e1_top, e1); } else { DCEL_Helper.JoinPrevNext(e2, e2_top, e2_next); DCEL_Helper.JoinPrevNext(e1_prev, e1_top, e1); } if (subdivision != null) { subdivision.HalfEdges.Add(new RBTreeSetNode <DCEL_HalfEdge>(e1_top)); subdivision.HalfEdges.Add(new RBTreeSetNode <DCEL_HalfEdge>(e2_top)); } }
public int CompareTo(DCEL_Vertex other) { return(VecRat2.CompareReadingOrder(this.Position, other.Position)); }