예제 #1
0
        private Site NeighborSite(Edge e)
        {
            if (this == e.GetLeftSite())
            {
                return(e.GetRightSite());
            }
            if (this == e.GetRightSite())
            {
                return(e.GetLeftSite());
            }

            return(null);
        }
예제 #2
0
        public bool IsLeftOf(Point p)
        {
            Site   top;
            bool   rightOfSite;
            bool   above;
            bool   fast;
            double dXP;
            double dYP;
            double dXS;
            double t1;
            double t2;
            double t3;
            double y1;

            top         = e.GetRightSite();
            rightOfSite = p.x > top.coord.x;

            if (rightOfSite && this.orientation == Orientation.LEFT)
            {
                return(true);
            }
            if (!rightOfSite && this.orientation == Orientation.RIGHT)
            {
                return(false);
            }

            if (e.a == 1.0)
            {
                dYP  = p.y - top.coord.y;
                dXP  = p.x - top.coord.x;
                fast = false;

                if ((!rightOfSite && e.b < 0.0) || (rightOfSite && (e.b >= 0.0)))
                {
                    above = dYP >= (e.b * dXP);
                    fast  = above;
                }
                else
                {
                    above = (p.x + (p.y * e.b)) > e.c;
                    if (e.b < 0.0)
                    {
                        above = !above;
                    }
                    if (!above)
                    {
                        fast = true;
                    }
                }

                if (!fast)
                {
                    dXS   = top.coord.x - e.GetLeftSite().coord.x;
                    above = (e.b * ((dXP * dXP) - (dYP * dYP))) < (dXS * dYP * (1.0 + ((2.0 * dXP) / dXS) + (e.b * e.b)));
                    if (e.b < 0.0)
                    {
                        above = !above;
                    }
                }
            }
            else
            {
                y1    = e.c - (e.a * p.x);
                t1    = p.y - y1;
                t2    = p.x - top.coord.x;
                t3    = y1 - top.coord.y;
                above = (t1 * t1) > ((t2 * t2) + (t3 * t3));
            }

            return((this.orientation == Orientation.LEFT) ? above : (!above));
        }