在具有负坐标的三角形/六边形网格上实现A *

时间:2011-05-08 23:23:46

标签: c# grid hex a-star

遵循使用this question作为新问题基础的明显传统我也有一个问题,我希望尽可能优雅地解决:

我已经实现了六角形地图:

(想在这里插入图片..但我不允许因为是新的......请看上面的链接)

但我现在想知道如何(优雅地)为这种类型的坐标实现这种类型的地图。 我有使用A *在典型的平方网格上的经验(我认为笛卡尔网格?)和我处理它的方式似乎与这个坐标系不兼容。

通常我会生成一个2D字节数组。数组的索引将对应于网格坐标,并且所述索引处的值将给出该节点的“权重”。 (0是无法通过的,更高的数字'称重'更多,然后更低的数字)。

实施例: sbyte[,] pathGrid = new sbyte[5, 5] { {0,0,1,0,0}, {9,5,1,3,0}, {9,5,1,3,0}, {9,5,1,3,0}, {0,0,1,0,0} };

如果0是无法通行的,那么1将很容易遍历,而更高的数字会花费更多的成本来遍历。 (抱歉格式化..我是堆栈溢出newb:P) 这个数组将根据我的地图的构成生成,然后输入我的路径查找算法,该算法反过来吐出一个节点列表(路径),如果没有找到路径,则返回null。

然而,使用这种类型的网格,由于负坐标(显然在数组中不起作用)以及网格不遵循相同规则的事实,这是不可能的(至少乍一看)作为一个“典型的”网格。

有很多方法可以使用我的A *方法来解决这个问题,但是它们都很邋(转换网格坐标和使用空节点),我想知道是否有人想过这样做的优雅方法。

感谢您阅读任何情况:) (顺便说一句,我在C#/ .net中这样做是为了它的价值)

2 个答案:

答案 0 :(得分:2)

即使数组的索引从0开始,你的程序也不需要从概念上对数组进行处理。例如,如果您总是添加例如在使用它们查找数组之前,你的索引有3个,你实际上有一个索引从3开始的数组。为了简化以这种方式处理数组,你可以创建一个名为eg的类。 ArbitraryBaseArray包装数组和一个指定所需基本索引的数字。

然后,您可以创建一个HexGrid类,其中包含ArbitraryBaseArray数组,每个数组都有自己的基本索引(取决于十六进制区域左边缘的外观)。该类可以有一个索引器,可以让您根据两个十六进制坐标查找特定元素。它也可以有一个静态方法,给定六角网格中的坐标,返回一个带有六个相邻坐标的数组;这种方法可以被A *使用。 (请注意,虽然您链接的问题中的插图使用每个十六进制图块的三个坐标,但两个坐标就足够了。)

答案 1 :(得分:0)

您可以将坐标存储在字典中:

var nodes = new Dictionary<Point, Vector[]>;

这样你不仅限于正坐标,而且你也不受每个节点的路径数量的限制