感谢@user2709663和@jonathankoren提供的答案。我花了很多时间研究你们的答案,但发现两者都存在一些问题。或者至少对于这些答案考虑的网格类型并没有清楚地说明。然而,我找到了一个非常好的教程和解决方案的代码实现,还有一个管理六边形网格的库,网址是:
http://www.redblobgames.com/grids/hexagons/(库的代码网址是:
http://www.redblobgames.com/grids/hexagons/implementation.html)。我也写了一个matlab版本的距离代码,适用于“odd-q”垂直布局,具体如下:
function f = offset_distance(x1,y1,x2,y2)
ac = offset_to_cube(x1,y1);
bc = offset_to_cube(x2,y2);
f = cube_distance(ac, bc);
end
function f = offset_to_cube(row,col)
x = col - (row - mod(row,2)) / 2;
z = row;
y = -x-z;
f = [x,z,y];
end
function f= cube_distance(p1,p2)
a = abs( p1(1,1) - p2(1,1));
b = abs( p1(1,2) - p2(1,2));
c = abs( p1(1,3) - p2(1,3));
f = max([a,b,c]);
end
这是一个Matlab测试代码。
sx = 6;
sy = 1;
for i = 0:7
for j = 0:5
k = offset_distance(sx,sy,i,j);
disp(['(',num2str(sx),',',num2str(sy),')->(',num2str(i),',',num2str(j),')=',num2str(k)])
end
end