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