请花一点时间了解我的情况。如果无法理解,请在评论中告诉我。

我有一个Waypoint的ArrayList。这些路标没有任何顺序。一个航点具有以下属性:
{int type, float z, float y, float x, float rotation}

这适用于3维世界,但由于我的寻路不应关注高度(因此将世界视为2维世界),因此y值将被忽略。轮换对于这个问题并不重要。


在这个二维世界中,x代表x轴,z代表y轴。
如果x增加,则世界上的物体向东移动。如果x减小,则世界上的物体向西移动。
如果z增加,则世界上的物体向北移动。如果z减小,则世界上的物体向南移动。


因此,这些“新”航路点可以简化为: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内找到通向目标航路点的航路点有多个航路点,则应选择最接近的航路点(更好的做法是,如果稍微远一点的替代航路点会导致新路径的距离更长,也返回)。
返回的航点组合(路径)的顺序应从最短路径(最小距离)到最长路径(最大距离)


最后,请考虑以下几点:


这是我唯一需要明智地进行AI /寻路的事情,这就是为什么我不希望使用完整的寻路或AI框架的原因。我相信一个功能应该能够解决上述问题。
如果返回所有可能的航路点组合会导致过多的开销,则可以指定最大数量的组合(但仍从最远到最远排序)也可以。例如。 5条最接近的路径。


我将如何实现?任何反馈表示赞赏。

最佳答案

我认为您的解决方案是从Dijkstra's Algorithm开始首先找到最短的路径。您可以将航路点视为一个连接图,如果节点在xy平面中足够靠近,则可以在其中连接节点,然后应用Dijkstra(在线有很多示例代码清单)。

现在,您具有了从头到尾遍历图形的最短路径,该路径将由图形的N条边组成。

接下来,您需要创建N个新图形,每个图形都与第一个图形相同,但最短路径的一部分未连接。在这些修改后的图上查找从头到尾的最短路径。现在,您可以按长度对N + 1条路线进行排序。

重复此操作,直到找到满足您需求的足够路径,或者没有剩余的未排序路径为止。

我还没有找到这种技术的名称,但是它被描述为对Dijkstra here的修改。

关于java - 2D航路点寻路:WP的组合从curLocation到targetLocation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5194482/

10-09 08:27