好的,我现在对问题有了更清晰的了解,并受到@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-passing-by-between-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
实际上是通过线的(从什么时候开始,例如,1.3,点将已经在新线段上)。p1-p2
t
一旦计算了所有“a-vertex-is-passing-by-between-p1-and-p2”-times,找出其余部分是一项简单的任务。(也就是说,弄清楚它是“看不见”、“看不见”还是“两者都不是”的传球类型):
对于所有对t0
和t1
连续的顶点通过时间,您检查该线p1((t1-t0)/2)-p2((t1-t0)/2)
是否与多边形边缘没有交点。如果没有交点,则这些点将在整个周期内都在视线内(t0-t1
),否则它们将在整个周期内都看不见(因为在此时间段内没有经过其他顶点)。