[英]2D waypoint pathfinding: combinations of WPs to go from curLocation to targetLocation
請花一點時間了解我的情況。 如果無法理解,請在評論中告訴我。
我有一個Waypoint的ArrayList。 這些路標沒有任何順序。 一個航點具有以下屬性:
{int type, float z, float y, float x, float rotation}
這適用於3維世界,但是由於我的尋路不應關注高度(因此將世界視為2維世界),因此y值將被忽略。 輪換對於這個問題並不重要。
因此,這些“新”航路點可以簡化為: waypoint = {float x, float y}
。
現在,這些航路點代表對象的X軸(x)和Y軸(z)位置。 此外,還有一個當前位置: curLocation = {float x, float y}
和一個目標位置: tarLocation = {float x, float y}
。
這就是我想要得到的:
在以下嚴格條件下,將從curLocation
到tarLocation
所有航路點組合(aka:路徑或路線) :
(float) maxInbetweenDistance
。 這包括從curLocation
到第一個航點的初始距離以及從最后一個航點到tarLocation
的距離。 如果不可能有這樣的航點組合,則應返回null。 maxInbetweenDistance
中發現一個通向目標航路點的航路點有多個航路點,則應選擇最接近的航路點(更好的做法是,如果稍微遠一點的替代航路點會導致距離更長的新路徑,回來)。 最后,請考慮以下幾點:
我將如何實現? 任何反饋表示贊賞。
如果您的航路點具有連通性,則應查看Dijkstra的最短路徑算法。 Google的第一批熱門歌曲甚至列出了Java的實現。 (我不能從帖子中得知連通性是否已知,但是它確實包含“ graph-algorithm”標記,因此我假設是這樣)。 顧名思義,此方法為您提供了兩個節點之間的最短路徑。
您的約束具有挑戰性,在這些約束下需要所有可能的路徑組合。 再次-假設存在連接-您的節點鄰接矩陣可以強制執行您的maxInbetweenDistance規則。 同樣,您可以使用此矩陣獲得“次優”解決方案。 知道最佳路徑后,您可以將該路徑(或其元素)標記為不可用,然后重新運行Dijkstra的算法。 通過重復此過程,您可以獲得一組越來越次優的路徑。
按照慣例:在大多數計算幾何問題中,Z為高度,水平面由XY軸形成。
我認為您的解決方案是從Dijkstra的算法開始,首先找到最短的路徑。 您可以將航路點視為一個連接圖,如果節點在xy平面中足夠靠近,則可以在其中連接節點,然后應用Dijkstra(在線有很多示例代碼清單)。
現在,您具有了從頭到尾遍歷圖形的最短路徑,該路徑將由圖形的N條邊組成。
接下來,您需要創建N個新圖形,每個圖形都與第一個圖形相同,但最短路徑的一部分未連接。 在這些修改后的圖上查找從頭到尾的最短路徑。 現在,您可以按長度對N + 1條路線進行排序。
重復此過程,直到找到滿足您需求的足夠路徑,或者沒有剩余的未排序路徑為止。
我還沒有發現這種技術的名稱,但它被描述為一個修改的Dijkstra 這里 。
最容易實現的方法可能是創建路徑的ArrayList,這又將是包含所有可能路徑的路點的ArrayList,然后使用遞歸函數返回每個路徑是否有效(給定起點和終點)值和最大距離,如果路徑無效,請從列表中將其刪除。 下一步將通過剩下的每條路徑,並將它們從最短的總距離到最短的順序排序。 這將是獲取所需內容的蠻力方法,因此效率最低。 今晚回到家時,我會重新發布是否有人已經用Java進行此操作的更有效方法。
編輯:如果蠻力方法太多,則必須以某種方式對航點列表進行排序,最好的方法可能是最初根據距起點的距離對它們進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.