Опубликовано в:
Клуб: c#<--Программирование <--IT Информационные технологии <--Бизнес по сферам деятельности
/pterodactilus vulgaris/
16.04.2022
Для нахождения точки пересечения двух прямых создаем систему из двух линейных уравнений на основе уравнения прямой. В качестве исходных параметров выступают 4 известные точки с заданными координатами по X и Y. Начало координат внизу, слева. Точки начинаются от нижнего левого угла и идут по часовой стрелке. Первая прямая задается точками (p0,p2), вторая прямая точками (p1,p3).
Решение этой системы уравнений на C# using System; using System.Text; using System.Drawing; using System.Configuration;
namespace CrossPoint { class Program { // решение см. в readme.txt static void Main(string[] args) { StringBuilder sb = new StringBuilder(); PointF[] points = new PointF[4]; string[] coordinates = new string[4] { "4;3", "7;12", "15;13", "19;3" }; sb.Append(ConfigurationManager.AppSettings["i"] + Environment.NewLine); for (int i=0; i<=3; i++) { string[] pntXY = coordinates[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); points[i] = new PointF(float.Parse(pntXY[0]), float.Parse(pntXY[1])); sb.Append(string.Format("Point {0}({1},{2})", i.ToString(), points[i].X.ToString(), points[i].Y.ToString()) + Environment.NewLine); }
PointF crossPoint = GetCrossPoint(points); sb.Append(Environment.NewLine + string.Format("Сrosspoint : {0}; {1}", crossPoint.X, crossPoint.Y)); Console.WriteLine(sb.ToString()); Console.ReadKey(); }
static PointF GetCrossPoint(PointF[] p) { float k1 = p[2].X - p[0].X; float m1 = p[2].Y - p[0].Y; float n1 = k1 * p[0].Y - m1 * p[0].X;
float k2 = p[3].X - p[1].X; float m2 = p[3].Y - p[1].Y; float n2 = k2 * p[1].Y - m2 * p[1].X;
float y = (m2 * n1 - m1 * n2) / (m2 * k1 - m1 * k2); float x = (k1 * y - n1) / m1;
PointF crossPoint = new PointF(x, y); return crossPoint; } } }
Описание решения Уравнения прямой
(1) общий вид (2) для точек p1 и p3 (3) для точек p2 и p4 x -x1 y -y1 x1 -p1.X y1 - p1.Y x2 - p2.X y2 - p2.Y ______ = ______ ___________ = ___________ ___________ = ___________ x2 -x1 y2-y1 p3.X - p1.X p3.Y - p1.Y p4.X - p2.X p4.Y - p2.Y
раскладываем (2) для точек p1 и p3
приводим (2) к виду (4) m1*x1 - k1*y1 + n1 = 0, где
k1 = p3.X - p1.X m1 = p3.Y - p1.Y n1 = k1*p1.Y - m1*p1.X
(5) y1 = (m1*x1 + n1)/k1
для точек p2 и p4 раскладываем (3) по аналогии. для этого заменяем точки p1 на p2, p3 на p4
приводим (3) к виду (6) m2*x2 - k2*y2 + n2 = 0, где
k2 = p4.X - p2.X m2 = p4.Y - p2.Y n2 = k2*p2.Y - m2*p2.X
(7) y2 = (m2*x2 + n2)/k2
выразим x1 через y1 для (5)
k1*y1 - n1 x1 = __________ m1
выразим x2 через y2 для (6)
k2*y2 - n2 x2 = __________ m2
в точке перечечения координаты x и y обеих прямых совпадают. Приравниваем x1 и x2
k1*y1 - n1 k2*y2 - n2 (7) ___________ = ___________ m1 m2
откуда получаем y
m2*n1 - m1*n2 (8) y = _____________ m2*k1 - m1*k2
через подстановку y в (4)
x = (k1*y1 - n1)/m1
|