Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 397

/ вопрос решён /

Здравствуйте ув. эксперты. Есть линия заданаая точками pt1 и pt2. Как определить входит, ли точка pt в окрестность линии заданной переменной Magnet (в пикселях)? Т.е. если провести перпендикуляр к линии, то окрестность слева и справа от линии равна Magnet.

SMaks Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 11 марта 2007, 22:52
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: mvp

Немного математики: Пусть есть две точки (x1, y1) и (x2, y2). Тогда ур-ие прямой, проходящих через эти точки:
(y - y1) / (y2 - y1) = (x - x1) / (x2 - x1);

Нужно получить ур-ие в виде:
Ax + By + C = 0;
Тогда расстояние от точки (x3, y3) до прямой будет:
r = |Ax3 + By3 + C| / (A^2 + B^2)^0.5

Если r < Magnet, то входит. Естественно, это всё работает, только если Ваша система координат имеет размерность экрана(т. е. 1 пиксель соответствует 1 системы координат), иначе придётся нормировать, но это уже другой вопрос.

Попробуйте вывести ур-ие в общем виде сами. У меня получилось (могу ошибиться, поэтому и прошу проделать данную процедуру самостоятельно):

(y1 - y2)x + (x2 - x1)y + x1y2 - y1x2 = 0;
т. е. А = y1 - y2; B = x2 - x1; C = x1y2 - y1x2.
Ну, а код уже совсем приметивен.

Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 11 марта 2007, 23:49
Оценка за ответ: 5

Комментарий к оценке: То что нужно! Спасибо. Я уже думал, что нужно воспозоваться формулой для нахождения растояния от точки до прямой, но незнал как его применить.

Ответ #2. Отвечает эксперт: Вадим К

Вы сами ответили на свой вопрос. Нужно провести перпендикуляр от точки к прямой и узнать его длину. А дальше сравнить.
Но можно поступить и по другому. У нас ведь есть три точки. Значит есть треугольник. Проведём высоту (она и будет перпендикуляром) а дальше - банальная геометрия.
пусть (a1,a2) и (b1,b2) - координаты твоей линии.
(c1,c2) - координаты точки. тогда
вначеле длины
a=sqrt(sqr(a1-a2)+sqr(b1-b2));
b и c аналогично
cosa = (b*b+c*c-a*a)/(2*b*c);
sina=sqrt(1-cosa*cosa);
n = b*sina;
вот и всё. Если я геометрию за многие годы не забыл, должно работать

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 12 марта 2007, 00:08
Оценка за ответ: 5

Комментарий к оценке: Сначала хотел тоже делать через треугольники, но боялся, что все очень усложниться. Оказывается все просто, однако первый метод удобнее, но все равно спасибо!

Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:26: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.02 сек.