示例#1
0
        /**
         * determinates if this triangle contains the point p.
         * @param p the query point
         * @return true iff p is not null and is inside this triangle (Note: on boundary is considered inside!!).
         */
        public bool contains(Point_dt p)
        {
            bool ans = false;

            if (this.halfplane || p == null)
            {
                return(false);
            }

            if ((p.x == a.x && p.y == a.y) || (p.x == b.x && p.y == b.y) || (p.x == c.x && p.y == c.y))
            {
                return(true);
            }
            int a12 = p.pointLineTest(a, b);
            int a23 = p.pointLineTest(b, c);
            int a31 = p.pointLineTest(c, a);

            if ((a12 == Point_dt.LEFT && a23 == Point_dt.LEFT && a31 == Point_dt.LEFT) ||
                (a12 == Point_dt.RIGHT && a23 == Point_dt.RIGHT && a31 == Point_dt.RIGHT) ||
                (a12 == Point_dt.ONSEGMENT || a23 == Point_dt.ONSEGMENT || a31 == Point_dt.ONSEGMENT))
            {
                ans = true;
            }

            return(ans);
        }
示例#2
0
        //public int _id;
        /** constructs a triangle form 3 point - store it in counterclockwised order.*/
        public Triangle_dt(Point_dt A, Point_dt B, Point_dt C)
        {
            //visitflag=visitValue;
            a = A;
            int res = C.pointLineTest(A, B);

            if ((res <= Point_dt.LEFT) ||
                (res == Point_dt.INFRONTOFA) ||
                (res == Point_dt.BEHINDB))
            {
                b = B;
                c = C;
            }
            else
            {  // RIGHT
                Console.WriteLine("Warning, ajTriangle(A,B,C) " + "expects points in counterclockwise order.");
                Console.WriteLine("" + A + B + C);
                b = C;
                c = B;
            }
            circumcircle();
            //_id = _counter++;
            //_counter++;_c2++;
            //if(_counter%10000 ==0) System.out.println("Triangle: "+_counter);
        }
示例#3
0
        private Triangle_dt extendOutside(Triangle_dt t, Point_dt p)
        {
            if (p.pointLineTest(t.a, t.b) == Point_dt.ONSEGMENT)
            {
                Triangle_dt dg = new Triangle_dt(t.a, t.b, p);
                Triangle_dt hp = new Triangle_dt(p, t.b);
                t.b       = p;
                dg.abnext = t.abnext;
                dg.abnext.switchneighbors(t, dg);
                dg.bcnext        = hp;
                hp.abnext        = dg;
                dg.canext        = t;
                t.abnext         = dg;
                hp.bcnext        = t.bcnext;
                hp.bcnext.canext = hp;
                hp.canext        = t;
                t.bcnext         = hp;
                return(dg);
            }
            Triangle_dt ccT = extendcounterclock(t, p);
            Triangle_dt cT  = extendclock(t, p);

            ccT.bcnext        = cT;
            cT.canext         = ccT;
            startTriangleHull = cT;
            return(cT.abnext);
        }
示例#4
0
 private Triangle_dt treatDegeneracyInside(Triangle_dt t, Point_dt p)
 {
     if (t.abnext.halfplane &&
         p.pointLineTest(t.b, t.a) == Point_dt.ONSEGMENT)
     {
         return(extendOutside(t.abnext, p));
     }
     if (t.bcnext.halfplane &&
         p.pointLineTest(t.c, t.b) == Point_dt.ONSEGMENT)
     {
         return(extendOutside(t.bcnext, p));
     }
     if (t.canext.halfplane &&
         p.pointLineTest(t.a, t.c) == Point_dt.ONSEGMENT)
     {
         return(extendOutside(t.canext, p));
     }
     return(null);
 }
示例#5
0
        private Triangle_dt insertPointSimple(Point_dt p)
        {
            nPoints++;
            if (!allCollinear)
            {
                Triangle_dt t = find(startTriangle, p);
                if (t.halfplane)
                {
                    startTriangle = extendOutside(t, p);
                }
                else
                {
                    startTriangle = extendInside(t, p);
                }
                return(startTriangle);
            }

            if (nPoints == 1)
            {
                firstP = p;
                return(null);
            }

            if (nPoints == 2)
            {
                startTriangulation(firstP, p);
                return(null);
            }

            switch (p.pointLineTest(firstP, lastP))
            {
            case Point_dt.LEFT:
                startTriangle = extendOutside(firstT.abnext, p);
                allCollinear  = false;
                break;

            case Point_dt.RIGHT:
                startTriangle = extendOutside(firstT, p);
                allCollinear  = false;
                break;

            case Point_dt.ONSEGMENT:
                insertCollinear(p, Point_dt.ONSEGMENT);
                break;

            case Point_dt.INFRONTOFA:
                insertCollinear(p, Point_dt.INFRONTOFA);
                break;

            case Point_dt.BEHINDB:
                insertCollinear(p, Point_dt.BEHINDB);
                break;
            }
            return(null);
        }
示例#6
0
 /*
  * assumes v is NOT an halfplane!
  * returns the next triangle for find.
  */
 private static Triangle_dt findnext1(Point_dt p, Triangle_dt v)
 {
     if (p.pointLineTest(v.a, v.b) == Point_dt.RIGHT && !v.abnext.halfplane)
     {
         return(v.abnext);
     }
     if (p.pointLineTest(v.b, v.c) == Point_dt.RIGHT && !v.bcnext.halfplane)
     {
         return(v.bcnext);
     }
     if (p.pointLineTest(v.c, v.a) == Point_dt.RIGHT && !v.canext.halfplane)
     {
         return(v.canext);
     }
     if (p.pointLineTest(v.a, v.b) == Point_dt.RIGHT)
     {
         return(v.abnext);
     }
     if (p.pointLineTest(v.b, v.c) == Point_dt.RIGHT)
     {
         return(v.bcnext);
     }
     if (p.pointLineTest(v.c, v.a) == Point_dt.RIGHT)
     {
         return(v.canext);
     }
     return(null);
 }
示例#7
0
        private Triangle_dt extendclock(Triangle_dt t, Point_dt p)
        {
            t.halfplane = 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));
        }
示例#8
0
        private Triangle_dt extendcounterclock(Triangle_dt t, Point_dt p)
        {
            t.halfplane = 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));
        }