Exemplo n.º 1
0
        /// <summary>
        /// Нахождение точки пересечения двух отрезков (если есть)
        /// </summary>
        /// <param name="b"> </param>
        /// <param name="crs">Точка пересечения</param>
        /// <returns>Пересекаются или нет</returns>
        public bool JointVectors(Vector b, out PointF crs)
        {
            crs = new PointF(float.NaN, float.NaN);

            var w = (End.Y - Begin.Y) * (b.End.X - b.Begin.X) - (b.End.Y - b.Begin.Y) * (End.X - Begin.X);
            if (Math.Abs(w) > EPSILON)
            {
                var w1 = (b.Begin.Y - Begin.Y) * (b.End.X - b.Begin.X) * (End.X - Begin.X)
                    + Begin.X * (End.Y - Begin.Y) * (b.End.X - b.Begin.X)
                    - b.Begin.X * (b.End.Y - b.Begin.Y) * (End.X - Begin.X);
                var w2 = (b.Begin.X - Begin.X) * (b.End.Y - b.Begin.Y) * (End.Y - Begin.Y)
                    + Begin.Y * (End.X - Begin.X) * (b.End.Y - b.Begin.Y)
                    - b.Begin.Y * (b.End.X - b.Begin.X) * (End.Y - Begin.Y);
                crs.X = w1 / w;
                crs.Y = -w2 / w;
                return IsOwnPoint(crs) && b.IsOwnPoint(crs);
            }
            else
                return false;
        }
Exemplo n.º 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); // конец этого вектора лежит на другом отрезке
 }