Зарегистрировано: 331




Помощь  Карта сайта

О чем пишут?

Эти таинственные зум-окуляры

Эти таинственные зум-окуляры Наверно каждый любитель астрономии с особым трепетом вспоминает свои первые наблюдения в телескоп, когда удается увидеть Луну, усеянную кратерами, Сатурн с его кольцами, яркое шаровое скопление, которое нашлось почему-то далеко не сразу. Понимание, что каждый ..
Дальше..

Я так вижу!

Баня утром 3.jpg

Баня утром 3.jpg



Тексты. Прозариум

Тексты на сайте могут публиковаться как в составе книг, по которым они "разложены", так и по отдельности. Тексты можно публиковать на странице их владельца, в блогах, клубах или рубриках сайта, а так же в виде статей и объявлений. Вы можете публиковать на сайте не только собственные тексты, но и те, которыми хотите поделиться с читателями, соблюдая авторские права их владельцев.
Prozarium CMS | Реклама, сотрудничество | Разработка, продажа сайтов

Для добавления вашего собственного контента, а также для загрузки текстов целиком, загрузки текстов без разбиения на страницы, загрузки книг без разбиения на тексты, для работы с закладками необходима авторизация. Если вы зарегистрированы на сайте, введите свой логин и пароль. Если нет, пожалуйста, пройдите на регистрацию



Опубликовано в: Клуб: c#
<--Программирование
<--IT Информационные технологии
<--Бизнес по сферам деятельности

0





Алгоритм расчета точки пересечения диагоналей четырехугольника или пересечения прямых
/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



(c)03.2020 Eugene Trifonov, aka p.v.

Saint Petersburg, Russia
mailto: pterodactilus@rambler.ru
Skype prozarium
Telegram @EugeneTrifonov

Specialized in C#, ASP.Net, MS SQL
My CV is here