Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要帮助了解张贴算法(计算网格上六边形之间的步长距离)_Java_Algorithm_Distance - Fatal编程技术网

Java 需要帮助了解张贴算法(计算网格上六边形之间的步长距离)

Java 需要帮助了解张贴算法(计算网格上六边形之间的步长距离),java,algorithm,distance,Java,Algorithm,Distance,我一直在寻找一个答案,关于如何准确地计算六边形网格上两个六边形之间的距离,作为一个六边形或“步数” 我看到了这篇文章,它似乎是正确的解决方案,因为我的六边形设置正是托本所描述的,然而我正试图找出他提出的算法。具体而言: mydistance((x1,y1), (x2,y2)) = if x1>x2 then mydistance((x2,y2), (x1,y1)) else if y2>=y1 then x2-x1 + y2-y1 else ma

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

我看到了这篇文章,它似乎是正确的解决方案,因为我的六边形设置正是托本所描述的,然而我正试图找出他提出的算法。具体而言:

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)
我很确定他在描述一个算法,但是,我不明白他所说的“我的距离((x2,y2),(x1,y1))等等。我想他可能是指两点之间的距离公式?我试过了,但没有成功:(此外,他在=之前在顶部说了这句话,这让我很反感

有人能准确地理解他的意思吗

谢谢

编辑(重要)--这是我的六边形网格图案的一张图片,有助于了解:请访问

以下是原始帖子的剪辑:


我更喜欢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))
根据网站上显示的编号,您可以计算 距离如下:

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坐标向下)


Torben

为了进行比较,下面是我计算两个六角之间距离的代码:

/**
 *  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度。

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

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)
在使用整数除法实现此操作时,请注意舍入。在Java中,for
int y
floor(y/2)
(y%2?y-1:y)/2
您编写:

我很确定他在描述一个算法,然而,我得到了 我不明白他所说的“我的距离((x2,y2),(x1,y1))等的意思 他可能是指两点之间的距离公式

我想谈谈这一点,正如对你问题的评论所暗示的,但两个答案似乎都没有提到:


语句
mydistance((x2,y2),(x1,y1))
是对正在定义的函数的递归调用。在这种情况下,如果使用
x1>x2
调用函数,则在交换点的情况下再次调用函数。

“要理解递归,必须首先理解递归。”我将试一试..待机!P.S.如果你想直接使用它,那么你可能需要将
Math
转换为
java.util.Math
:上面的代码实际上使用的是不同的数学库(但我认为在这种情况下函数是相同的).明白了Mikera..不过我想我的网格可能会有点不同..它在某些情况下工作..但在其他情况下不会。这很难解释,但如果我无法让它工作,那么我会发布一张我的板是如何设置的图像。Mikera看看,看看你的逻辑是否会对齐?如果你的x轴和y轴相距120度,我想你可以交换if语句的两个分支。如果你有交错的六角列(即x方向在60到120度之间交替),那么公式会变得复杂得多…请原谅noob问题,但你所说的符号(dx)==符号(dy)是什么意思…具体地说是“符号”?谢谢你的回复。事实上,你的公式似乎和mikera给我的一样。我想这只是我如何设置hexes的问题。看看:我是如何设置的。再次感谢!它是字面上的符号:
+或-
:)