|
Вопрос # 397/ вопрос решён / |
|
Здравствуйте ув. эксперты. Есть линия заданаая точками pt1 и pt2. Как определить входит, ли точка pt в окрестность линии заданной переменной Magnet (в пикселях)? Т.е. если провести перпендикуляр к линии, то окрестность слева и справа от линии равна Magnet.
 |
Вопрос задал: 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|