예제 #1
0
        private Triangle_dt extendInside(Triangle_dt t, Point_dt p)
        {
            Triangle_dt h1 = default(Triangle_dt);
            Triangle_dt h2 = default(Triangle_dt);

            h1 = treatDegeneracyInside(t, p);
            if ((h1 != null))
            {
                return(h1);
            }
            h1  = new Triangle_dt(t.c, t.a, p);
            h2  = new Triangle_dt(t.b, t.c, p);
            t.c = p;
            t.circumcircle();
            h1.abnext = t.canext;
            h1.bcnext = t;
            h1.canext = h2;
            h2.abnext = t.bcnext;
            h2.bcnext = h1;
            h2.canext = t;
            h1.abnext.switchneighbors(t, h1);
            h2.abnext.switchneighbors(t, h2);
            t.bcnext = h2;
            t.canext = h1;
            return(t);
        }
예제 #2
0
        private void Flip(Triangle_dt t, int mc)
        {
            Triangle_dt u = t.abnext;
            Triangle_dt v = default(Triangle_dt);

            t.mc = mc;
            if ((u.isHalfplane | (!(u.circumcircle_contains(t.c)))))
            {
                return;
            }
            if ((t.a.Equals(u.a)))
            {
                v        = new Triangle_dt(u.b, t.b, t.c);
                v.abnext = u.bcnext;
                t.abnext = u.abnext;
            }
            else if ((t.a.Equals(u.b)))
            {
                v        = new Triangle_dt(u.c, t.b, t.c);
                v.abnext = u.canext;
                t.abnext = u.bcnext;
            }
            else if ((t.a.Equals(u.c)))
            {
                v        = new Triangle_dt(u.a, t.b, t.c);
                v.abnext = u.abnext;
                t.abnext = u.canext;
            }
            else
            {
                throw new Exception("Error in flip.");
            }
            v.mc     = mc;
            v.bcnext = t.bcnext;
            v.abnext.switchneighbors(u, v);
            v.bcnext.switchneighbors(t, v);
            t.bcnext = v;
            v.canext = t;
            t.b      = v.a;
            t.abnext.switchneighbors(u, t);
            t.circumcircle();
            currT = v;
            Flip(t, mc);
            Flip(v, mc);
        }
예제 #3
0
        private Triangle_dt extendclock(Triangle_dt t, Point_dt p)
        {
            t.isHalfplane = false;
            t.c           = p;
            t.circumcircle();
            Triangle_dt tbc = t.bcnext;

            if ((p.pointLineTest(tbc.a, tbc.b) >= Point_dt.RIGHT))
            {
                Triangle_dt nT = new Triangle_dt(p, t.b);
                nT.abnext  = t;
                t.bcnext   = nT;
                nT.bcnext  = tbc;
                tbc.canext = nT;
                return(nT);
            }
            return(extendclock(tbc, p));
        }
예제 #4
0
        private Triangle_dt extendcounterclock(Triangle_dt t, Point_dt p)
        {
            t.isHalfplane = false;
            t.c           = p;
            t.circumcircle();
            Triangle_dt tca = t.canext;

            if ((p.pointLineTest(tca.a, tca.b) >= Point_dt.RIGHT))
            {
                Triangle_dt nT = new Triangle_dt(t.a, p);
                nT.abnext  = t;
                t.canext   = nT;
                nT.canext  = tca;
                tca.bcnext = nT;
                return(nT);
            }
            return(extendcounterclock(tca, p));
        }