需要帮助了解已发布的算法(计算网格上六边形之间的步距)

时间:2012-03-14 07:30:52

标签: java algorithm distance

我一直在寻找一个关于如何准确计算六边形网格上的两个六边形之间的距离作为多个十六进制或“步数”的答案。

我遇到了这个帖子,它似乎是正确的解决方案,因为我的六边形设置完全是Torben所描述的,但是我试图找出他提出的算法。具体做法是:

mydistance((x1,y1), (x2,y2))
     = if x1>x2 then mydistance((x2,y2), (x1,y1))
       else if y2>=y1 then x2-x1 + y2-y1
       else max(x2-x1, y1-y2)

我很确定他正在描述一个算法但是,我对“mydistance((x2,y2),(x1,y1))等的意思感到迷茫”。我认为他可能意味着一个公式两点之间的距离?我试过了,并没有解决这个问题:(此外,他在=之前说它在顶部,这只是让我失望。

任何人都可以准确地了解他的意思吗?

感谢!!!

编辑(重要)----这是我的六边形网格图案的图像,以便阐明:请访问 http://www.bart4president.com/test/hexGrid.jpg

以下是原始帖子的剪辑:


我更喜欢编号,其中x和y都对应于直线 然后,通过向右,使x增加(以常数y) 和y从右边向下60度增加(用常数x) (假设(0,0)是左上角)。

这样,如果你向三个“自然”方向中的一个移动,那么你 或者具有常数x,常数y或常数(x + y)。

这使得距离等的计算更容易,因为您不必这样做 奇数和偶数行上的特殊情况。

我假设您知道十六进制坐标并想要找到距离 移动边缘时的十六进制数。

如果您使用了我上面描述的替代编号,那么 距离计算如下:

mydistance((x1,y1), (x2,y2))
 = if x1>x2 then mydistance((x2,y2), (x1,y1))
   else if y2>=y1 then x2-x1 + y2-y1
   else max(x2-x1, y1-y2)

通过您选择的网页上显示的编号,您可以计算 距离如下:

yourdistance((x1,y1),(x2,y2))
 = mydistance((x1 - y1 `div` 2,y1), (x2 - y2 `div` 2,y2))

即,转换为更简单的坐标系并计算距离 在那里面。您通过减去y坐标的一半进行转换(舍入 从x坐标开始。

托本

2 个答案:

答案 0 :(得分:0)

为了比较,这是我计算两个六边形之间距离的代码:

/**
 *  Hex distance calculation
 */
public static int distance(int x1, int y1, int x2, int y2) {
    int dx=x2-x1;
    int dy=y2-y1;

    if (dx*dy>0) {
        return Maths.abs(dx)+Maths.abs(dy);
    } else {
        return Maths.max(Maths.abs(dx),Maths.abs(dy));
    }
}

(x1,y1)和(x2,y2)是要计算两者之间距离的坐标的坐标。请注意,这些坐标不是像在正方形网格上那样的直角:增加x和增加y是相隔60度。

答案 1 :(得分:0)

在六边形坐标系中,y轴与x轴成60度角。这避免了奇偶行的区别。六边形坐标系中的距离为:

dx = x1 - x0
dy = y1 - y0

if sign(dx) == sign(dy)
    abs(dx + dy)
else
    max(abs(dx), abs(dy))

您可以使用以下方法将(x', y)从您的坐标系转换为(x, y)

x = x' - floor(y/2)

所以dx变为:

dx = x1' - x0' - floor(y1/2) + floor(y0/2)

使用整数除法实现此操作时要小心舍入。在int y floor(y/2)的Java中(y%2 ? y-1 : y)/2