/// <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); }
/// <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); }