Хорошо, теперь у меня есть более четкое представление о проблеме, и вдохновленный предложением @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
.)
Чтобы найти каждое время "a-vertex-is-pass-by-Между-p1-and-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, точки уже будут быть на новых сегментах).
Как только все "a-vertex-is-мимо-by-Между-между-p1-и-p2"-времена были вычислены, выяснить остальное просто. (То есть выяснение, является ли это прохождением типа «становиться в поле зрения», «исчезает из поля зрения» или «ни то, ни другое»):
Для всех пар t0
и t1
последовательных времен прохождения вершин вы проверяете, свободна ли линия p1((t1-t0)/2)-p2((t1-t0)/2)
от пересечений с ребром многоугольника. Если в нем нет пересечений, точки будут находиться в зоне прямой видимости весь период (t0-t1
), в противном случае они будут вне поля зрения в течение всего периода (поскольку в этот период времени другие вершины не передаются).