首先,请允许我说我是初学者,这个程序是我第一次尝试“独自飞行”,所以如果我听起来像个白痴,请耐心等待。
我有一个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是奇数还是偶数而不同。
我试图了解计算正确差异的方法,但我不知道从哪里开始实施我见过的任何变化方法。是否有一个简单的转换,我可以用于协调系统,我已经纯粹为了计算六边形之间的距离,或者我可以使用的公式?
感谢。
答案 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点尝试编码。道歉;希望这没关系。