Как я могу найти первую точку вдоль курса, который находится на определенном расстоянии от отрезка? - PullRequest
1 голос
/ 02 февраля 2010

Учитывая начальную точку, курс, расстояние и отрезок, найдите первую точку вдоль этого заголовка, которая находится на указанном расстоянии от этого отрезка.

Я рассмотрел два случая, но не смог охватить последний.

Первый случай: уход от линии. Игнорируйте его, даже если начальная точка находится в пределах указанного расстояния.

Второй случай: он пересекает линию. Я решил это с помощью триггеров и треугольников. Первоначально не рассматривал следующий случай.

Третий случай: он направляется к линии, но не пересекает ее. Я думаю, что это решит и второй случай, если все сделано правильно.

Три варианта:

  1. Минимальное расстояние линии превышает указанное расстояние. Игнорировать это.

  2. Минимальное расстояние линии равно указанному расстоянию. Нашел точки уже.

  3. Минимальное расстояние линии меньше указанного расстояния. Это означает, что существует перпендикулярная линия от заголовка до конечной точки отрезка, которая меньше необходимого расстояния. Это также означает, что по обе стороны от этой перпендикулярной линии будут две линии необходимого расстояния. Один из них перпендикулярен курсу, а другой - ближе к той же конечной точке и не перпендикулярен курсу. Просто нужно найти эти точки и посмотреть, какая из них ближе к начальной точке.

Вот где я застрял сегодня. Составить его было легко, но сделать векторный расчет или еще что-то оказалось сложным.

Это можно перефразировать как:

В какое время (ы) P(t) = P0 + t*v на расстоянии D от отрезка L((x1,y1), (x2,y2))?

v=(sin(heading), -cos(heading)) в моем случае.

Ответы [ 4 ]

0 голосов
/ 16 февраля 2010

Привет, решение, которое я в конце концов придумала.

  1. Пересекает ли луч параллельные отрезки и указанное расстояние D от отрезка.Просто рисуем прямоугольник и проверяем стороны, параллельные отрезку.

  2. Пересекает ли луч окружности радиуса D в каждой конечной точке отрезка.

  3. Сведите к минимуму общее единичное время, чтобы найти первую точку вдоль луча, которая находится на расстоянии D от отрезка линии.

Возможный пограничный случай: это начальная точка в пределах D иотходит от линии?До пользователя, как обращаться с этим делом.

0 голосов
/ 05 февраля 2010

Снимайте ман ваше решение не всегда работает.Я нашел встречный пример:

Сегмент линии = (0,0) -> (0,14)

Начальная точка = (19, 6) @ заголовок -159,5 или 200,5 на западе /против часовой стрелки

Он пересечет линию в точке (2.952, 0.0), поэтому я спрашиваю, откуда она находится на расстоянии 0.0.

Полученный результат неверен.

http://img5.imageshack.us/i/failuref.png/

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

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

Я бы хотел опубликовать некоторый код для Sage, который создавал эти изображения, но теги кода принимают Pythonк сожалению.

0 голосов
/ 05 февраля 2010

Успешный результат, когда минимальное начальное расстояние между точкой и отрезком перпендикулярно отрезку:

http://img46.imageshack.us/i/success.png/

0 голосов
/ 02 февраля 2010

Спасибо, это работает. Я нашел альфа следующим образом:

heading = 45.0*pi/180. #heading 45 degrees.
if x1 > x2: #line segment (x1,y1)<->(x2,y2)
    dx = x2 - x1
    dy = y2 - y1
else:
    dx = x1 - x2
    dy = y1 - y2

segmentHeading = atan2(dx, dy)

if heading > 0:
    alpha = segmentHeading + heading
else:
    alpha = -segmentHeading + heading

t = abs( (dStart - D) / -cos(alpha) ) #-cos in python, sin in C.
...