【发布时间】:2012-03-14 17:19:10
【问题描述】:
我一直在寻找有关如何准确地将六边形网格上的两个六边形之间的距离计算为多个六边形或“步数”的答案。
我看到了这个帖子,这似乎是正确的解决方案,因为我的六边形设置完全符合 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))”等含义感到迷茫。我认为他可能指的是公式2点之间的距离?我试过了,但没有成功:(此外,他在=之前说它在上面,这让我很失望。
谁能准确理解他的意思?
谢谢!!!
编辑(重要)----这是我的六边形网格图案的图像,以提供一些启示:请访问 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 坐标。
托本
【问题讨论】:
-
“要了解递归,首先必须了解递归。”