用hexes实现A-Star算法

时间:2011-12-21 18:13:09

标签: c# a-star

首先,请允许我说我是初学者,这个程序是我第一次尝试“独自飞行”,所以如果我听起来像个白痴,请耐心等待。

我有一个hexes网格,我想使用A *来查找从一个到另一个的路径。

六角形瓦片适合80 x 80平方,内部存储为二维数组,并在代码中通过这些2D坐标(即十六进制[0,0],十六进制[1,0])引用等等)。

它们以“惊人的”转换显示在屏幕上:

if (X % 2 == 0)
{
    X = (X / 2) * 120;
    Y = Y * 80;
}
else
{
    X = ((X / 2) * 120);
    Y = (Y * 80) + 40;
}

我设置了A *实现,但很明显,每个十六进制相邻的6个中的两个六边形被计为2而不是1,而哪两个根据X是奇数还是偶数而不同。

我试图了解计算正确差异的方法,但我不知道从哪里开始实施我见过的任何变化方法。是否有一个简单的转换,我可以用于协调系统,我已经纯粹为了计算六边形之间的距离,或者我可以使用的公式?

感谢。

1 个答案:

答案 0 :(得分:1)

如果我没有记错的话,应该这样做:

int HexDistance(int x1, int y1, int x2, int y2) {
  int y1d = (y1 << 1) | (x1 & 1);
  int y2d = (y2 << 1) | (x2 & 1);
  int dx = Math.Abs(x2 - x1);
  int dyd = Math.Abs(y2d - y1d);
  return (dx < dyd) ? (dyd - dx) / 2 + dx : dx;
}

假设网格是这样的:

X:   0  1  2  3  4  5  6                                                    
------------------------
Y:   0     0     0     0
        0     0     0
     1     1     1     1
        1     1     1
     2     2     2     2

垂直和对角线相邻,但水平线不相邻。

基本上,首先重新编号y坐标:在偶数列中,将它们加倍;在奇数列中,加倍并添加1.这将给出以下网格:

X:   0  1  2  3  4  5  6                                                    
------------------------
Y:   0     0     0     0
        1     1     1
     2     2     2     2
        3     3     3
     4     4     4     4

现在,如果事情是在对角线上,那很容易。如果水平较大,则只计算水平差异;如果垂直较大,则计算垂直差值直到对角线,然后加上水平差值。

编辑:我又遇到了一个错误。供我在凌晨5点尝试编码。道歉;希望这没关系。