1

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

我已经实现了一个六边形地图:

(想在这里插入图片..但由于是新的,我不允许...请参阅上面的链接)

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

通常我会生成一个二维字节数组。数组的索引将对应于网格坐标,并且所述索引处的值将给出该节点的“权重”。(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 中这样做是为了它的价值)

4

2 回答 2

2

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

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

于 2011-05-08T23:35:44.000 回答
0

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

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

这样,您就不受正坐标的限制,也不受来自每个节点的路径数量的限制

于 2011-05-08T23:42:22.307 回答