曼哈顿六角形网格中瓷砖之间的距离

Coy*_*yod 21 algorithm distance path hexagonal-tiles

对于正方形网格,图块A和B之间的欧氏距离为:

distance = sqrt(sqr(x1-x2)) + sqr(y1-y2))
Run Code Online (Sandbox Code Playgroud)

对于被限制沿着正方形网格移动的演员,曼哈顿距离是我们必须行进的实际距离的更好度量:

manhattanDistance = abs(x1-x2) + abs(y1-y2))
Run Code Online (Sandbox Code Playgroud)

如何在六边形网格中获得两个瓷砖之间的曼哈顿距离,如下面的红色和蓝色线所示?

在此输入图像描述

aaz*_*aaz 44

我曾经在游戏中设置了一个六边形坐标系,这样y轴与x轴呈60度角.这避免了奇偶行的区别.

六角网格http://althenia.net/svn/stackoverflow/hexgrid.png?usemime=1&rev=3

该坐标系中的距离为:

dx = x1 - x0
dy = y1 - y0

if sign(dx) == sign(dy)
    abs(dx + dy)
else
    max(abs(dx), abs(dy))
Run Code Online (Sandbox Code Playgroud)

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

x = x' - floor(y/2)
Run Code Online (Sandbox Code Playgroud)

所以dx就变成了:

dx = x1' - x0' - floor(y1/2) + floor(y0/2)
Run Code Online (Sandbox Code Playgroud)

使用整数除法实现此操作时要小心舍入.在C for int y floor(y/2)is (y%2 ? y-1 : y)/2.

  • @SorenJohnson改变abs(dx + dy)是不够的,你还需要将if语句更改为sign(dx)!= sign(dy)(这只是我的位置,这就是我所知道的...)另外,如果有人想知道,sign()是一个函数,如果数字是负数则返回-1,如果它是零则返回0,如果是正数则返回1. (3认同)