我有2D世界地图,基本上是类似墨卡托的投影,(如果你向西走得足够长,你最终会向东开始)
问题我有:您是否可以使用A *来计算这些类型的地图上的路径?
我想不出你为什么不能这样做的原因(我认为你只是代表边缘地图节点,使得北,南,东,周三,“边界”节点简单地连接到对面侧)。
先谢谢,如果有人之前见过这样的东西,或者可以给我一些提示,我会很感激。
答案 0 :(得分:4)
寻路算法并不真正关心地图的全局拓扑。唯一棘手的部分是为A *获得一个好的估算器,但如果你的地图确实是一个三维空间中的一个表面并且步长是步长,那么使用3D距离应该没问题。
你的地图可以有各种奇怪的“连接”(包括例如打结的桥梁),如果你正确实现A *,这不会有问题。
答案 1 :(得分:2)
我无法想象为什么类似墨卡托的投影会导致A *出现问题,只要你的启发式函数正确地近似距离。我认为下面的功能应该可以正常工作
float heuristic(point from, point to, size mapsize) {
float x = from.x - to.x;
if (abs(x) > mapsize.x/2)
x = mapsize.x - x;
float y = from.y - to.y;
if (abs(y) > mapsize.y/2)
y = mapsize.y - y;
return sqrt(x*x+y*y);
}
答案 2 :(得分:1)
已编辑:我意识到我被非图形理论)误用了 edge 这个词(其中强烈的问题标题)提出了图算法问题:))
为什么你认为没有边缘?您可以建模许多逻辑离散位置,并且之间的连接有限(即不是墙在哪里:)。你走了:你有你的优势。 击> 子>
您可能意味着您不希望在数据中表示您的边缘(您不需要,但仍然存在连接位置/点的逻辑边缘。)
击>
Dancing Links
文章(DLX)中看到与此相关的内容,这是A *算法的一种实现技术。
该文章专门将州视为具有东/西/北/南链接的“单元格”(在网格中)。已经很长一段时间了,所以我不记得你将如何映射(没有双关语)你的算法问题。
舞步。实现算法X的一个好方法是表示算法X中的每一个 矩阵A作为具有五个字段L [x]的数据对象x; [R [X]; U [x]; d [X]; C [X]。矩阵的行 通过L和R字段(“左”和“右”)作为循环列表双重链接;列是 通过U和D字段(“向上”和“向下”)双重链接为循环列表。每一栏 list还包括一个名为list list的特殊数据对象。