遵循使用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中这样做是为了它的价值)
答案 0 :(得分:2)
即使数组的索引从0开始,你的程序也不需要从概念上对数组进行处理。例如,如果您总是添加例如在使用它们查找数组之前,你的索引有3个,你实际上有一个索引从3开始的数组。为了简化以这种方式处理数组,你可以创建一个名为eg的类。 ArbitraryBaseArray
包装数组和一个指定所需基本索引的数字。
然后,您可以创建一个HexGrid
类,其中包含ArbitraryBaseArray
数组,每个数组都有自己的基本索引(取决于十六进制区域左边缘的外观)。该类可以有一个索引器,可以让您根据两个十六进制坐标查找特定元素。它也可以有一个静态方法,给定六角网格中的坐标,返回一个带有六个相邻坐标的数组;这种方法可以被A *使用。 (请注意,虽然您链接的问题中的插图使用每个十六进制图块的三个坐标,但两个坐标就足够了。)
答案 1 :(得分:0)
您可以将坐标存储在字典中:
var nodes = new Dictionary<Point, Vector[]>;
这样你不仅限于正坐标,而且你也不受每个节点的路径数量的限制