PerimeterEdge ShortcutTwoListElements(PerimeterEdge a) { var b = a.Next; Debug.Assert(a.End == b.Start); var t = new CdtTriangle(a.Start, a.End, b.End, a.Edge, b.Edge, createEdgeDelegate); Triangles.Insert(t); var newEdge = t.Edges[2]; Debug.Assert(newEdge.IsAdjacent(a.Start) && newEdge.IsAdjacent(b.End)); LegalizeEdge(a.Start, t.OppositeEdge(a.Start)); t = newEdge.CcwTriangle ?? newEdge.CwTriangle; LegalizeEdge(b.End, t.OppositeEdge(b.End)); var c = new PerimeterEdge(newEdge) { Start = a.Start, End = b.End }; a.Prev.Next = c; c.Prev = a.Prev; c.Next = b.Next; b.Next.Prev = c; return(c); }
/// <summary> /// aNode is to the left of bNode, and they are consecutive /// </summary> /// <param name="aNode"></param> /// <param name="bNode"></param> RBNode <CdtFrontElement> ShortcutTwoFrontElements(RBNode <CdtFrontElement> aNode, RBNode <CdtFrontElement> bNode) { var aElem = aNode.Item; var bElem = bNode.Item; Debug.Assert(aElem.RightSite == bElem.LeftSite); CdtTriangle t = new CdtTriangle(aElem.LeftSite, aElem.RightSite, bElem.RightSite, aElem.Edge, bElem.Edge, createEdgeDelegate); Triangles.Insert(t); front.DeleteNodeInternal(aNode); //now bNode might b not valid anymore front.Remove(bElem); var newEdge = t.Edges[2]; Debug.Assert(newEdge.IsAdjacent(aElem.LeftSite) && newEdge.IsAdjacent(bElem.RightSite)); LegalizeEdge(aElem.LeftSite, t.OppositeEdge(aElem.LeftSite)); t = newEdge.CcwTriangle ?? newEdge.CwTriangle; LegalizeEdge(bElem.RightSite, t.OppositeEdge(bElem.RightSite)); return(front.Insert(new CdtFrontElement(aElem.LeftSite, newEdge))); }
void InsertAndLegalizeTriangle(CdtSite pi, CdtFrontElement frontElement) { if (Point.GetTriangleOrientationWithNoEpsilon(pi.Point, frontElement.LeftSite.Point, frontElement.RightSite.Point) != TriangleOrientation.Collinear) { var tr = new CdtTriangle(pi, frontElement.Edge, createEdgeDelegate); Triangles.Insert(tr); LegalizeEdge(pi, tr.Edges[0]); } else //we need to split the triangle below the element in to two triangles and legalize the old edges //we also delete, that is forget, the frontElement.Edge { var e = frontElement.Edge; e.upperSite.Edges.Remove(e); var t = e.CcwTriangle ?? e.CwTriangle; var oppositeSite = t.OppositeSite(e); RemoveTriangleButLeaveEdges(triangles, t); t = new CdtTriangle(frontElement.LeftSite, oppositeSite, pi, createEdgeDelegate); var t1 = new CdtTriangle(frontElement.RightSite, oppositeSite, pi, createEdgeDelegate); triangles.Insert(t); triangles.Insert(t1); LegalizeEdge(pi, t.OppositeEdge(pi)); LegalizeEdge(pi, t1.OppositeEdge(pi)); } }
CdtEdge GetPiercedEdgeInSiteTriangle(CdtTriangle t, CdtSite site, Point target) { var e = t.OppositeEdge(site); return PiercedEdgeQuery(e, site.Point, target, t); }
void InsertAndLegalizeTriangle(CdtSite pi, CdtFrontElement frontElement) { if (Point.GetTriangleOrientationWithNoEpsilon(pi.Point, frontElement.LeftSite.Point, frontElement.RightSite.Point) != TriangleOrientation.Collinear) { var tr = new CdtTriangle(pi, frontElement.Edge, createEdgeDelegate); Triangles.Insert(tr); LegalizeEdge(pi, tr.Edges[0]); } else { //we need to split the triangle below the element in to two triangles and legalize the old edges //we also delete, that is forget, the frontElement.Edge var e = frontElement.Edge; e.upperSite.Edges.Remove(e); var t=e.CcwTriangle??e.CwTriangle; var oppositeSite = t.OppositeSite(e); RemoveTriangleButLeaveEdges(triangles, t); t=new CdtTriangle(frontElement.LeftSite, oppositeSite, pi, createEdgeDelegate); var t1 = new CdtTriangle(frontElement.RightSite, oppositeSite, pi, createEdgeDelegate); triangles.Insert(t); triangles.Insert(t1); LegalizeEdge(pi, t.OppositeEdge(pi)); LegalizeEdge(pi,t1.OppositeEdge(pi)); } }
/// <summary> /// aNode is to the left of bNode, and they are consecutive /// </summary> /// <param name="aNode"></param> /// <param name="bNode"></param> RBNode<CdtFrontElement> ShortcutTwoFrontElements(RBNode<CdtFrontElement> aNode, RBNode<CdtFrontElement> bNode) { var aElem = aNode.Item; var bElem = bNode.Item; Debug.Assert(aElem.RightSite == bElem.LeftSite); CdtTriangle t = new CdtTriangle(aElem.LeftSite, aElem.RightSite, bElem.RightSite, aElem.Edge, bElem.Edge, createEdgeDelegate); Triangles.Insert(t); front.DeleteNodeInternal(aNode); //now bNode might b not valid anymore front.Remove(bElem); var newEdge = t.Edges[2]; Debug.Assert(newEdge.IsAdjacent( aElem.LeftSite) && newEdge.IsAdjacent(bElem.RightSite)); LegalizeEdge(aElem.LeftSite, t.OppositeEdge(aElem.LeftSite)); t=newEdge.CcwTriangle ?? newEdge.CwTriangle; LegalizeEdge(bElem.RightSite, t.OppositeEdge(bElem.RightSite)); return front.Insert(new CdtFrontElement(aElem.LeftSite, newEdge)); }
PerimeterEdge ShortcutTwoListElements(PerimeterEdge a) { var b = a.Next; Debug.Assert(a.End == b.Start); var t = new CdtTriangle(a.Start, a.End, b.End, a.Edge, b.Edge, createEdgeDelegate); Triangles.Insert(t); var newEdge = t.Edges[2]; Debug.Assert(newEdge.IsAdjacent(a.Start) && newEdge.IsAdjacent(b.End)); LegalizeEdge(a.Start, t.OppositeEdge(a.Start)); t = newEdge.CcwTriangle ?? newEdge.CwTriangle; LegalizeEdge(b.End, t.OppositeEdge(b.End)); var c = new PerimeterEdge(newEdge) { Start = a.Start, End = b.End }; a.Prev.Next = c; c.Prev = a.Prev; c.Next = b.Next; b.Next.Prev = c; return c; }
CdtEdge GetPiercedEdgeInSiteTriangle(CdtTriangle t, CdtSite site, Point target) { var e = t.OppositeEdge(site); return(PiercedEdgeQuery(e, site.Point, target, t)); }