Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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)));
        }
Beispiel #3
0
 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));
        }