首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用十六进制实现A-Star算法

用十六进制实现A-Star算法
EN

Stack Overflow用户
提问于 2011-12-22 02:13:09
回答 1查看 1.1K关注 0票数 1

首先,让我说我是一个初学者,这个程序是我第一次尝试“单飞”,所以如果我听起来像个笨蛋,请耐心等待。

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

适合80 x 80正方形的十六进制瓦片在内部存储为二维数组,并在代码中由这些二维坐标引用(即,he0,0,he1,0等)。

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

代码语言:javascript
复制
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是奇数还是偶数。

我试图阅读计算正确差异的方法,但我不确定从哪里开始实现我所见过的各种方法。有没有一个简单的转换,我可以对我已经有的坐标系进行简单的转换,纯粹为了计算十六进制之间的距离,或者一个我可以使用的公式?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-22 02:46:34

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

代码语言:javascript
复制
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;
}

假设网格是这样的:

代码语言:javascript
复制
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。这将生成以下网格:

代码语言:javascript
复制
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点开始编程很抱歉,希望这没问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8594388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档