Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проверка пересечения


Автор: VisualProgrammerNET 17.1.2006, 01:25
Проблема такая...

В общем виде:
Как проверить, пересекаются ли две линии или две траектории?

Конкретно:
Начерчена на форме линия. Я заставляю некий объект перемещаться по форме. Как узнать, пересечёт ли он линию? Только узнать это надо ещё в начале его пути. Иными словами, я даю команду объекту двигаться в точку, при этом строится траектория его пути (прямая линия). Как узнать, пересекутся ли траектория и линия на форме?

Автор: Exception 17.1.2006, 01:31
Дай конкретный код.

Автор: cardinal 17.1.2006, 01:33
Тут немного есть, может в тему...
http://forum.vingrad.ru/index.php?showtopic=77938

Автор: mr.DUDA 17.1.2006, 08:46
Если траектория сложная, надо разбить её на прямые отрезки и попарно искать пересечения каждого отрезка с каждым отрезком второй траектории.

Автор: VisualProgrammerNET 19.1.2006, 12:08
Пока что кода никакого нет (в том то и дело, не знаю, что писать). Вопрос в том - как узнать пересекаются ли ВООБЩЕ две прямые линии? Конечно можно поизвращаться и сделать проверку foreach для прямых на предмет совпадения двух каких-либо точек, но наверняка есть какая-нибудь функция или даже готовый метод (вот там в примере кто-то делал через Sign. стало быть, через сигнум проверять?)

Автор: cardinal 19.1.2006, 16:24
То что в примере так это веркторная графика. А Sign просто тот факт обрабатывается, что знак нам безразличен...

Автор: VisualProgrammerNET 20.1.2006, 13:10
А есть ли какая-нибудь функция, чтобы проверить, принадлежит ли указанная мной точка прямой?

Автор: Illuminaty 20.1.2006, 13:13
VisualProgrammerNET, а каким уравнением у тебя прямая задается (обычно a*x + b*y + с =0)?
Если при подстановке точки в это уравнение, равенство сохраняется, то точка принадлежит прямой

Автор: VisualProgrammerNET 20.1.2006, 17:06
Мммм... и как мне узнать уравнение моей прямой, если я создаю её по точкам?

Ну вот например:
Код

g.DrawLine(new Pen(Color.Black, 3), 0, 0, 100, 100);

И как какое тут уравнение будет? (у меня с линейной алгеброй нелады smile )

ЗЫ. Уравнение прямой: y = kx + b

Автор: Illuminaty 20.1.2006, 17:11
если у тебя две точки (x1, y1) (x2, y2), то решаешь систему линейных уравнений
ax1 + by1 + c= 0;
ax2 + by2 + c = 0;
относительно a, b, c
Добавлено @ 17:12
Цитата(VisualProgrammerNET @ 20.1.2006, 18:06 Найти цитируемый пост)

Уравнение прямой: y = kx + b

это уравнение не сможет описать прямые, перпендикулярные оси X
Добавлено @ 17:14
Цитата(VisualProgrammerNET @ 20.1.2006, 18:06 Найти цитируемый пост)

g.DrawLine(new Pen(Color.Black, 3), 0, 0, 100, 100);

уравнение прямой: x-y=0

Автор: VisualProgrammerNET 20.1.2006, 18:37
Нашёл я, кажется, способ... через синусы углов и длины прямых... если до ума доведу, выложу, что получилось smile

Автор: Akina 20.1.2006, 19:26
Цитата(VisualProgrammerNET @ 20.1.2006, 14:10 Найти цитируемый пост)

есть ли какая-нибудь функция, чтобы проверить, принадлежит ли указанная мной точка прямой?

Классика...
(x-x1)*(y2-y1) == (x2-x1)(y-y1)

Автор: VisualProgrammerNET 20.1.2006, 22:24
Цитата(Akina @ 20.1.2006, 19:26 Найти цитируемый пост)

(x-x1)*(y2-y1) == (x2-x1)(y-y1)


И что в этой формуле что? Куда подставлять координаты точки?

Автор: cardinal 21.1.2006, 03:03
Цитата(VisualProgrammerNET @ 20.1.2006, 15:06 Найти цитируемый пост)

g.DrawLine(new Pen(Color.Black, 3), 0, 0, 100, 100);

x1=0, x2=100, y1=0, y2=100
и получается:
(x-0)*(100-0)=(100-0)*(y-0)
x=y
x-y=0
см.
Цитата(Illuminaty @ 20.1.2006, 15:11 Найти цитируемый пост)

уравнение прямой: x-y=0


Автор: cardinal 23.1.2006, 03:22
Кстати вот:
http://worldcpp.vingrad.ru/alg/zdrt91.php

Автор: Empirik 23.1.2006, 12:39
посмотри еще информацию о GraphicsPath( System.Drawing.Drawing2D.GraphicsPath). В нем есть методы позволяющие проверить попадание точки в заданную область, описываемую данным графическим путем. Так же в его состав можно добавить линию, и другие фигуры, может тебе данный класс подойдет

Автор: VisualProgrammerNET 24.1.2006, 15:15
Thanx 2 Empirik. smile Как я и предполагал заранее, всё уже придумано майкрософт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)