這里的問題:
給定一個多邊形 P、一個圓 C_init 和一個方向 D,讓 C_init 沿著 D 移動,它可能會與 P(下面的 C_target)發生碰撞。如何計算 C_init 和 C_target 之間的距離?

任何幫助表示贊賞!
uj5u.com熱心網友回復:
鑒于計算點和線之間的垂直距離是一個很好的散列問題,請執行以下操作:
- 找到您正在移動的線的引數化
- 求解使您與多邊形的每條線有距離 R 的引數值
- 選擇位于相應多邊形邊的線段內的第一個解。
- 將引數轉換為線上的距離。
uj5u.com熱心網友回復:
當圓與線段相撞時,圓心位于偏移線段(線段周圍的菱形)上。

計算交點的一種簡單方法是在多邊形的每個頂點放置一個半徑為 R 的圓,將每個邊向外偏移 R,并將從移動圓的中心射出的光線與每個新圓和偏移邊相交. 最近的交點將是您的碰撞點。
如圖所示,不需要在多邊形的反射角(>2π)處放置一個圓,因為圓永遠不會與這樣的頂點發生碰撞。

uj5u.com熱心網友回復:
在與半徑相等的距離處繪制一條平行于將被擊中的一側,并取這條線和軌跡之間的交點。
您將需要一些分析/矢量幾何(我無法猜測您對這些的熟悉程度)。平行線可以通過計算邊方向的單位向量,然后將其旋轉90°并乘以半徑來構建;然后如果你把它加到邊的頂點,你會得到兩個平行點。
為了獲得交點,寫出軌跡的引數方程和平行的隱式方程。通過將第一個插入第二個,您可以獲得一個簡單的一階方程,為您提供軌跡方程的引數 t(假設在 Cinit 處為 0,在沿軌跡的單位距離處為 1)。

這不是故事的全部。如果你不知道哪一邊會先被擊中,你需要確定這一點。對所有邊重復計算,這次使用平行線的引數方程和軌跡的隱式方程。引數值必須在[0, 1]范圍內,否則無法命中對應邊。如果存在交集,請考慮像以前一樣計算的 t 值。那么將被擊中的一側是 t 值最小(正)的一側。
但這還不是全部:圓可能會碰到頂點而不是邊。要檢查這一點,請在每個頂點周圍畫一個圓圈并找到與軌跡的交點。這一次,使用圓的隱式方程,你將得到一個 t 的二次方程。如果它沒有根,則無法命中頂點。否則,取最小的根并與擊中邊時找到的最小 t 進行比較。整體最小的 t。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/496607.html
下一篇:無法理解為什么演算法作業得這么快
