【算法记录/六边形网格】(二)坐标转换

说在前面

引言

  • 有时候我们需要在项目中使用轴向或偏移坐标,但是许多算法用立方坐标表示会更简单。因此,我们要能够来回转换这些坐标。

纵向坐标(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)
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值