/// <summary> /// Принадлежность точки выпуклому многоугольнику /// </summary> /// <param name="pnt">Проверяямая точка</param> /// <param name="sideIsJoint">Стороны принадлежат многоугольнику</param> /// <returns></returns> public bool JointPointConvex(PointF pnt, bool sideIsJoint) { var s = 0f; var dirs = new int[3]; var v = new Vector(); for (var i = 0; i < pnts.Count; i++) { v.Begin = pnts[i]; v.End = pnts[(i + 1) % pnts.Count]; dirs[v.LocatePointDir(pnt) + 1]++; // суммируются направления } // кол-во направлений == кол-во сторон return Math.Max(dirs[0], dirs[2]) // макс кол-во слева или справа + (sideIsJoint ? dirs[1] : 0) == pnts.Count; }
/// <summary> /// Определение факта пересечения двух векторов /// </summary> /// <param name="other"></param> /// <returns></returns> public bool IsCross(Vector other) { var pp = new[]{ LocatePointDir(other.Begin), LocatePointDir(other.End), other.LocatePointDir(Begin), other.LocatePointDir(End) }; return (Math.Abs(pp[0] + pp[1]) != 2 && Math.Abs(pp[2] + pp[3]) != 2 && pp.Any(s => s != 0)) // на случай канонического пересечения || pp[0] == 0 && IsOwnPoint(other.Begin) // начало другого вектора лежит на этом отрезке || pp[1] == 0 && IsOwnPoint(other.End) // конец другого вектора лежит на этом отрезке || pp[2] == 0 && other.IsOwnPoint(Begin) // начало этого вектора лежит на другом отрезке || pp[3] == 0 && other.IsOwnPoint(End); // конец этого вектора лежит на другом отрезке }