2010-02-02 12 views
1

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

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

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

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

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

Три подслучая:

  1. Минимальное расстояние линии больше, чем заданное расстояние. Игнорируй это.

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

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

Здесь я застрял сегодня. Рисование это было легко, но сделать векторный calc или все получилось сложным.

Можно перефразировать это так:

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

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

ответ

0

Спасибо, что работает. я нашел альфу так:

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. 
0

Shoot ман ваше решение не всегда работает. Я нашел контрпример:

Line Segment = (0,0) -> (0,14)

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

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

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

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

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

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

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

0

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

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

  2. Является ли луч пересекающим круги радиуса D в каждой конечной точке отрезка линии.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^