说在前面
- 原文地址:Hexagonal Grids,强烈建议原文体验一下
- 上一篇:【算法记录/六边形网格】(一)坐标系统
- 下一篇:【算法记录/六边形网格】(三)邻域
- 友链:kwen.page
- 其他:不说了,我就是个渣渣
引言
- 有时候我们需要在项目中使用轴向或偏移坐标,但是许多算法用立方坐标表示会更简单。因此,我们要能够来回转换这些坐标。
纵向坐标(Axial coordinates)
-
纵向坐标与立方体坐标密切相关。
-
立方体坐标→纵向坐标:去掉立方体坐标中的一维即可
-
纵向坐标→立方体坐标:使用约束条件
x+y+z=0
计算出第三维即可
-
伪代码
function cube_to_axial(cube): var q = cube.x var r = cube.z return Hex(q, r) function axial_to_cube(hex): var x = hex.q var z = hex.r var y = -x-z return Cube(x, y, z)
偏移坐标(Offset coordinates)
- 偏移坐标的转换取决于你使用哪一种偏移坐标(尖/角朝上
r
、边朝上q
) oddr
:奇数偏移&尖朝上function cube_to_oddr(cube): var col = cube.x + (cube.z - (cube.z&1)) / 2 var row = cube.z return OffsetCoord(col, row) function oddr_to_cube(hex): var x = hex.col - (hex.row - (hex.row&1)) / 2 var z = hex.row var y = -x-z return Cube(x, y, z)
evenr
:偶数偏移&尖朝上function cube_to_evenr(cube): var col = cube.x + (cube.z + (cube.z&1)) / 2 var row = cube.z return OffsetCoord(col, row) function evenr_to_cube(hex): var x = hex.col - (hex.row + (hex.row&1)) / 2 var z = hex.row var y = -x-z return Cube(x, y, z)
oddq
:奇数偏移&边朝上function cube_to_oddq(cube): var col = cube.x var row = cube.z + (cube.x - (cube.x&1)) / 2 return OffsetCoord(col, row) function oddq_to_cube(hex): var x = hex.col var z = hex.row - (hex.col - (hex.col&1)) / 2 var y = -x-z return Cube(x, y, z)
evenq
:偶数偏移&边朝上function cube_to_evenq(cube): var col = cube.x var row = cube.z + (cube.x + (cube.x&1)) / 2 return OffsetCoord(col, row) function evenq_to_cube(hex): var x = hex.col var z = hex.row - (hex.col + (hex.col&1)) / 2 var y = -x-z return Cube(x, y, z)
- 注意
这里使用a&1
来区分奇偶数是因为这对负数也管用(-3%2=-1
)
倍化坐标(Doubled coordinates)
- 伪代码
function doubleheight_to_cube(hex): var x = hex.col var z = (hex.row - hex.col) / 2 var y = -x-z return Cube(x, y, z) function cube_to_doubleheight(cube): var col = cube.x var row = 2 * cube.z + cube.x return DoubledCoord(col, row) function doublewidth_to_cube(hex): var x = (hex.col - hex.row) / 2 var z = hex.row var y = -x-z return Cube(x, y, z) function cube_to_doublewidth(cube): var col = 2 * cube.x + cube.z var row = cube.z return DoubledCoord(col, row)