Esempio n. 1
0
        /// <summary>
        /// (pa和pb构成的线段不与任何约束边相交,不包括顶点)
        /// </summary>
        /// <param name="linePaPb"></param>
        /// <returns></returns>
        private bool IsIntersectWithEdges(Line linePaPb)
        {
            Vector2?intersectPoint;

            for (var i = 0; i < this.edgeList.Count; i++)
            {
                Line lineTmp = this.edgeList[i];
                //两线段的关系
                Line.LineClassification lineRelation = linePaPb.Intersection(lineTmp, out intersectPoint);

                if (lineRelation == Line.LineClassification.SegmentsIntersect)                 //相交
                {
                    //排除端点相交的情况
                    if (intersectPoint.Value.EqualsEPSILON(linePaPb.pointA) ||
                        intersectPoint.Value.EqualsEPSILON(linePaPb.pointB))
                    {
                        continue;                    //两条线段不是真正相交,继续检查下一条约束边
                    }
                    return(true);                    //两条线段是真正相交
                }

                //不相交,检查下一条约束边
            }

            return(false);
        }
Esempio n. 2
0
        /// <summary>
        /// 点是否在多边形内部
        /// http://www.cnblogs.com/zhangshu/archive/2011/08/08/2130694.html
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public virtual bool Contains(Vector2 point)
        {
            int count = 0;
            //minValue+100000,因为再减去一个数,会越界
            Line L = new Line(new Vector2(float.MinValue + 100000, point.y), point);

            for (var i = 0; i < this.lineList.Count; i++)
            {
                Line S = this.lineList[i];
                if (S.ClassifyPoint(point) == PointClassification.OnSegment)
                {
                    return(true);
                }

                if (!S.GetDirection().EqualsEPSILON(Vector2.right) &&
                    !S.GetDirection().EqualsEPSILON(-Vector2.right))
                {
                    bool aOnL = L.ClassifyPoint(S.pointA) == PointClassification.OnSegment;
                    bool bOnL = L.ClassifyPoint(S.pointB) == PointClassification.OnSegment;
                    if (aOnL || bOnL)
                    {
                        if (aOnL && S.pointA.y > S.pointB.y)
                        {
                            count++;
                        }
                        if (bOnL && S.pointB.y > S.pointA.y)
                        {
                            count++;
                        }
                    }
                    else
                    {
                        Line.LineClassification lineRelation = S.Intersection(L, out _);
                        if (lineRelation == Line.LineClassification.SegmentsIntersect)
                        {
                            count++;
                        }
                    }
                }
            }

            return(count % 2 != 0);
        }