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中,forint 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的问题。看看:我是如何设置的。再次感谢!它是字面上的符号:+或-
:)