わかりました、私は今問題をより明確に把握しており、@ walkytalky の提案に触発されて、より精巧な答えがあります。
あなたはそれを述べ、直線セグメントに沿っp1
て移動します。これらのセグメントが、との両方が常に新しいセグメントを同時に開始p2
するように配置されているかどうかはわかりません。ただし、いつでも線分を 2 つの線分 (勾配が同じ) に切断して、とが常に新しい線分を同時に開始できるようにすることができます。p1
p2
p1
p2
p1
が線A-B
に沿って移動し、パラメータが 0 から 1 になるのp2
に沿って (同時に) 移動すると仮定します (つまり、時間はの真ん中との真ん中にあります)。C-D
t
t=0.5
p1
A-B
p2
C-D
Ax
ポイントの x 座標とAy
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
これは、次の方程式 (2 つの方程式、2 つの未知数、および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
は実際には (延長された)線と (延長された) 線の間にあります。も 0 と 1 の間にある場合、ポイントがこれらのセグメントに沿って移動する間、頂点は実際には線によって通過します ( 1.3 などの場合、ポイントはすでに新しいセグメント上にあるため)。A-B
C-D
t
v
p1-p2
t
すべての「a-vertex-is-passing-by- between-p1-and-p2」時間が計算されると、残りを計算するのは簡単な作業です。(つまり、「見えるようになる」、「見えなくなる」、または「どちらでもない」タイプのパスかどうかを判断します):
すべてのペアt0
とt1
連続する頂点通過時間について、ラインp1((t1-t0)/2)-p2((t1-t0)/2)
にポリゴン エッジとの交差がないかどうかを確認します。交点がない場合、ポイントは全期間 ( t0-t1
) 見通し内にあります。