Delaunay.Halfedge.IsLeftOf C# (CSharp) Method

IsLeftOf() private method

private IsLeftOf ( Vector2 p ) : bool
p Vector2
return bool
        internal bool IsLeftOf(Vector2 p)
        {
            Site topSite;
            bool rightOfSite, above, fast;
            float dxp, dyp, dxs, t1, t2, t3, yl;

            topSite = edge.RightSite;
            rightOfSite = p.x > topSite.X;
            if (rightOfSite && this.leftRight == LR.LEFT)
            {
                return true;
            }
            if (!rightOfSite && this.leftRight == LR.RIGHT)
            {
                return false;
            }

            if (edge.a == 1.0)
            {
                dyp = p.y - topSite.Y;
                dxp = p.x - topSite.X;
                fast = false;
                if ((!rightOfSite && edge.b < 0.0) || (rightOfSite && edge.b >= 0.0))
                {
                    above = dyp >= edge.b * dxp;
                    fast = above;
                }
                else
                {
                    above = p.x + p.y * edge.b > edge.c;
                    if (edge.b < 0.0)
                    {
                        above = !above;
                    }
                    if (!above)
                    {
                        fast = true;
                    }
                }
                if (!fast)
                {
                    dxs = topSite.X - edge.LeftSite.X;
                    above = edge.b * (dxp * dxp - dyp * dyp) <
                            dxs * dyp * (1.0 + 2.0 * dxp / dxs + edge.b * edge.b);
                    if (edge.b < 0.0)
                    {
                        above = !above;
                    }
                }
            }
            else  /* edge.b == 1.0 */
            {
                yl = edge.c - edge.a * p.x;
                t1 = p.y - yl;
                t2 = p.x - topSite.X;
                t3 = yl - topSite.Y;
                above = t1 * t1 > t2 * t2 + t3 * t3;
            }
            return this.leftRight == LR.LEFT ? above : !above;
        }

Usage Example

コード例 #1
0
        public Halfedge EdgeListLeftNeighbor(Vector2 p)
        {
            int num = (int)((p.x - _xmin) / _deltax * (float)_hashsize);

            if (num < 0)
            {
                num = 0;
            }
            if (num >= _hashsize)
            {
                num = _hashsize - 1;
            }
            Halfedge halfedge = GetHash(num);

            if (halfedge == null)
            {
                int num2 = 1;
                while ((halfedge = GetHash(num - num2)) == null && (halfedge = GetHash(num + num2)) == null)
                {
                    num2++;
                }
            }
            if (halfedge == leftEnd || (halfedge != rightEnd && halfedge.IsLeftOf(p)))
            {
                do
                {
                    halfedge = halfedge.edgeListRightNeighbor;
                }while (halfedge != rightEnd && halfedge.IsLeftOf(p));
                halfedge = halfedge.edgeListLeftNeighbor;
            }
            else
            {
                do
                {
                    halfedge = halfedge.edgeListLeftNeighbor;
                }while (halfedge != leftEnd && !halfedge.IsLeftOf(p));
            }
            if (num > 0 && num < _hashsize - 1)
            {
                _hash[num] = halfedge;
            }
            return(halfedge);
        }