我有一個圓形(我的遊戲中的Striker),它沿着我的2D平面從一點移動到另一點沿着一條直線。我在同一架飛機上還有其他一些圈子沒有移動。尋找在運動過程中與運動圓相交的圓圈列表的最佳算法是什麼?如果我想在python中編寫這個代碼,最好的辦法是什麼(內存效率,因爲我想爲許多不同的狀態執行此操作來解決我的問題)?什麼是用於此目的的最佳圖書館?算法來檢測靜止的圓形列表是否與另一個圓弧從起點到終點沿同一平面上的直線相交
回答
你問了一個算法,而不是代碼,所以這是主意。您可能需要使用math
模塊,但如果您知道基本的美國11年級分析幾何,則不需要其他任何東西。
固定圓可以通過兩種方式與您的移動圓相交:它可以與路徑開始或結束處的移動圓相交(紅色圓圈集中在下圖中的A
和B
),或者它可以與由移動圓形成的矩形(圖中標記爲EGHF
的藍色矩形)相交。
與端圈檢查相交很簡單:圓相交如果它們的中心之間的距離不小於其半徑之和更大。
檢查矩形的交點有點困難。如果滿足兩個要求,則I處的圓與矩形EGHF相交。首先,中心I必須在構成矩形末端的GH和EF線之間。其次,從I到AB線的距離(包圍動圈中心的路徑的線)必須不大於I處靜止圓的半徑和動圈的半徑之和。
檢查與矩形交點的交替,更一致的方法是檢查從靜止圓的中心到運動圓的起點和終點的垂直平分線(品紅色線標記爲p)的距離,它必須至少是A點和B點之間距離的一半,AB線的距離必須至多是移動和固定圓的半徑之和。
所有這些計算(兩點之間的距離,諸如GH,EF,AB和垂直平分線之類的線的方程,查看點是否在兩條平行線之間,以及點與線之間的距離)在分析幾何中是標準的。這些計算中的大部分僅取決於運動圓 - 每個靜止圓的計算很少且很快。讓我知道你是否需要這些公式的幫助。這樣的公式可能有一個模塊,但我不知道其中的一個。
涉及該方法中的存儲器是最小的,假設半徑和起點和終點中心移動圓,以及半徑和中心座標的靜止圈的座標是已經在存儲器中。如果您選擇我的替代方法,則可以通過預先計算移動圓的某些值來節省執行時間。如果圓的圓心開始座標是(X1,Y1)和終點座標是(x2,y2),你會預先計算:
dx = x2 - x1
dy = y2 - y1
d = math.hypot(dx, dy)
det = x2 * y1 - x1 * y2
c = (x1 * x1 + y1 * y1 - x2 * x2 - y2 * y2)/2
(注意這五個值存儲只有一次,對於)然後,對於每個靜止圓,找出從該圓的中心到垂直平分線(我的圖中的p)的有符號距離,然後使用該距離查找到起始圓,結束圓或移動線的距離。如果您有很多固定圓圈,並且與運動場相比運動圓圈的路徑很小,則可以使用路徑的邊界矩形快速消除大部分靜止圓圈。
非常感謝回覆。但我忘了添加一個約束。在結束點有一個垂直於x軸的邊界線(壁)。所以當這個圓圈向這個點移動並撞擊牆壁時。所以終點不僅僅是點,而是一條線。由於障礙,圓圈不會穿過這條線。你能修改你的答案來適應這個嗎? –
這不是一個額外的約束。如果牆是x = a的直線並且運動圓的半徑是r,則該圓會在x = a-r處碰撞牆的中心。這可以讓您快速找到圓心的停止點的y座標,並繼續如我的主要答案。 –
這是否會成爲內存有效的解決方案,因爲我將對此進行編程?或者有沒有像使用方程式/微積分這樣的計算方法?我將不得不尋找800 * 360 * 4(800個起始點,在所有方向上最多4個交點)這樣的計算。 –
- 1. 計算圓上一點的座標,沿圓的中心與另一點之間的一條直線?
- 2. 我有一條線從一個圓的中心點到另一個點。我想找到線與圓的圓周相交的點
- 3. 確定線段是否與圓形相交的公式(平面)
- 4. 計算兩個圓上兩點之間的切線圓弧
- 5. Douglas-Peucker-從一個點到一個圓的最短圓弧,在一個球體的表面上
- 6. 旋轉一個圓形的方形,在圓頂上有圓點
- 7. 如何檢測橢圓是否與另一個橢圓/矩形碰撞
- 8. 計算一個圓上兩個切線的交點?
- 9. 檢查點是一個圓
- 10. 圓弧上的繪圖點
- 11. SVG - 將一個圓沿動畫直線
- 12. 需要來自圓心的一條直線的交點?
- 13. SVG圓弧不是沿着橢圓
- 14. 沿着圓周上的一個點生成隨機形狀
- 15. 圓線交點
- 16. 矩形和圓(或圓弧)的交集
- 17. 指定起點以在用戶點擊時在圓弧上插入圓形
- 18. 如何檢測可拖動的圓形與KineticJS重疊的另一個圓形?
- 19. 從點到橢圓弧的最短距離的算法
- 20. 如何計算「沿着」單位圓的弧度點
- 21. 如何計算從另一個靜態圓彈起的圓的速度方向?
- 22. 從圓上的點計算切線?
- 23. 從圓上的一個點到相反的切線繪製一條線? AS3中的錐體/楔形形狀
- 24. 弧相切於結束點的圓弧,以及線
- 25. 給定一個起點和終點,和距離,計算點沿着一條線
- 26. 沿着橢圓移動一個點
- 27. 垂直和水平線的線圓交點
- 28. 計算圓弧和直線之間的圓角
- 29. 檢查圖像點是否與圓相交
- 30. 使用Python測試一個隨機點是否屬於一個圓的圓周
查找一條直線的正常方程以及如何使用它來確定到這條直線的距離。 – LutzL