Пример #1
0
 /// <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;
 }
Пример #2
0
 /// <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); // конец этого вектора лежит на другом отрезке
 }