Хорошо, теперь у меня есть более четкое представление о проблеме, и, вдохновленный предложением @walkytalky, вот более подробный ответ.
Вы упомянули, что p1
и p2
перемещаются по отрезкам прямой. Я не знаю, выровнены ли эти сегменты таким образом, что p1
и p2
всегда начинают новые сегменты одновременно. Однако вы всегда можете разрезать отрезок на два отрезка (с одинаковым наклоном), чтобы p1
и p2
всегда начинали новые отрезки одновременно.
Предположим, что p1
движется по линии A-B
, а p2
движется (одновременно) по C-D
, поскольку параметр t
изменяется от 0 до 1. (То есть в момент времени t=0.5
p1
находится в середине A-B
, а p2
в середине C-D
. .)
Позволив Ax
и Ay
обозначать координаты x и y точки A
(и аналогично для B
, C
и D
), мы можем выразить p1
и p2
как функции t
следующим образом:
p1(t) = (Ax + t*(Bx - Ax), Ay + t(By - Ay))
p2(t) = (Cx + t*(Dx - Cx), Cy + t(Dy - Cy))
(Например, когда t=0
, Ax + t*(Bx - Ax)
оценивается как Ax
, а когда t=1
оценивается как Bx
.)
Чтобы найти каждую «вершину-проходит-между-p1-и-p2»-время, мы делаем следующее:
Для каждой вершины препятствия v=(Vx, Vy)
нам нужно найти t
так, чтобы p1(t)
, p2(t)
и v
находились на одной линии друг с другом.
Это можно сделать, решив следующие уравнения (два уравнения и два неизвестных, t
и k
):
Vx=p1(t).x + k*(p2(t).x - p1(t).x)
Vy=p1(t).y + k*(p2(t).y - p1(t).y)`
Если k
лежит между 0 и 1, вершина многоугольника v
на самом деле между (расширенной) линией A-B
и (расширенной) линией C-D
. Если t
также находится между 0 и 1, то вершина v
фактически проходит линию p1-p2
за время прохождения точек по этим отрезкам (поскольку, когда t
будет, скажем, 1,3, точки уже будут на новых отрезках).
После того, как все времена «вершина-проходит-между-p1-и-p2» были вычислены, вычислить остальное несложно. (То есть выяснение, является ли это типом прохождения «попадание в поле зрения», «становление вне поля зрения» или «ни то, ни другое»):
Для всех пар t0
и t1
последовательных моментов прохождения вершин вы проверяете, свободна ли линия p1((t1-t0)/2)-p2((t1-t0)/2)
от пересечений с ребром полигона. Если он свободен от пересечений, то точки будут находиться на прямой видимости весь период (t0-t1
), в противном случае они будут вне поля зрения весь период (поскольку никакие другие вершины не пройдены за этот период времени).
person
aioobe
schedule
05.05.2010