这样一个6边形网格地图,有没有公式计算两个格子间的距离呢?
比如(0,0)走到(1,1)需要走几步,我们看图可以发现走两步就行了,但是有公式可以计算就更好了。
下面跟群里的小伙伴讨论之后的出的结果。
我们需要借助三维坐标
像这样的坐标体系,有x,y,z三个维度,x,y,z的和始终是0,我们称之为cube坐标,距离计算公式是
distance=(abs(cubePos1.x-cubePos2.x)+abs(cubePos1.y-cubePos2.y)+abs(cubePos1.z-cubePos2.z))/2
或者
diatance=max(cubePos1.x-cubePos2.x)+abs(cubePos1.y-cubePos2.y)+abs(cubePos1.z-cubePos2.z))
上面两个公式都能算出距离,至于具体原理我就不懂了,反正可以这么用
然后要做的就是把二维坐标转成三维坐标
其实很简单
我们原来的坐标是这样的
0,0 --- 1,0 --- 2,0 --- 3,0
--- 0,1 --- 1,1 --- 2,1 --- 2,2
0,2 --- 1,2 --- 2,2 --- 3,2
--- 0,3 --- 1,3 --- 2,3 --- 3,3
如果调整成这样
0,0 --- 1,0 --- 2,0 --- 3,0
--- 0,1 --- 1,1 --- 2,1 --- 3,1
--- --- 0,2 --- 1,2 --- 2,2 --- 3,2
--- --- --- 0,3 --- 1,3 --- 2,3 --- 3,3
这样二维中的x,y就对应了三维中的x,y。至于三维的z,因为x,y,z的和始终是0,只要z=-x-y就行了
调整过程其实就是x=x-int(y/2)
最终我们得到二维坐标转三维坐标的函数
func getCubePosFromPos(pos): var x=pos.x-int(pos.y)/2 var y=pos.y var z=-x-y return Vector3(x,y,z)
计算距离的函数
func posDistance(pos1,pos2): var cubePos1=getCubePosFromPos(pos1) var cubePos2=getCubePosFromPos(pos2) var distance=(abs(cubePos1.x-cubePos2.x)+abs(cubePos1.y-cubePos2.y)+abs(cubePos1.z-cubePos2.z))/ 2 return distance
把这个公式放到游戏中试验下
黑色小圆圈里的数字表示这个格子到主角的距离,计算很准确
顺便说下从三维坐标转回到二维坐标的算法
func getPosFromCubePos(cubePos): var y=cubePos.y var x=cubePos.x+int(y)/2 return Vector2(x,y)
参考资料
https://www.redblobgames.com/grids/hexagons/