【算法记录/六边形网格/翻译】(一)坐标系统

@

说在前面

引言

  • 现在让我们将一个个的六边形组成网格。对于方形来说,我们只有一种方式。
    在这里插入图片描述

但是对于正六边形来说,我们有很多种方式。就个人而言,我习惯于使用立方体(三维)坐标(Cube coordinates)来处理算法问题、使用纵向坐标(Axial coordinates)/倍化坐标(Doubled coordinates)来存储。

  • 补充
    在这里插入图片描述

偏移坐标(Offset coordinates)

  • 最常见的方法是将每一行(或列)进行偏移。每一列被命名为col(q),每一行被称为row(r)。我们可以选择偏移奇数行或者偶数行,也可以选择偏移奇数列或者偶数列。

  • 偏移奇数行(这里的偏移是相对而言的,奇数行相对于偶数行向右偏移)
    在这里插入图片描述

  • 偏移偶数行(这里的偏移是相对而言的,偶数行相对于奇数行向右偏移)
    在这里插入图片描述

  • 偏移奇数列
    在这里插入图片描述

  • 偏移偶数列
    在这里插入图片描述

立方体坐标(Cube coordinates)

  • 另一种标定正六边形网格的方法是使用三个基本坐标轴,这种方法有着很强的对称性。

  • 考虑如下立方体,选择一个斜切面(满足x+y+z=0)。虽然这种方式看起来十分怪异,但是却能够让我们的正六边形网格算法更加简单。并且在这样的坐标系下,我们能够重复使用一些标准的操作:加、减、乘、除、缩放、距离等
    在这里插入图片描述
    在这里插入图片描述

  • 这个斜切面上的所有立方体就是我们的正六边形网格,由于是个平面,所以这个斜切面上的所有立方体的坐标都满足x+y+z=n(取n=0)
    在这里插入图片描述

  • 虽然有时候没有适合正六边形网格的算法,但是在立方体网格中却存在。立方体坐标可以让我们将立方体网格中的算法转移到正六边形网格中。通常,我们可以先将坐标转换到另一种坐标系中,在执行算法之后再将结果转换到原坐标系中。

  • 现在让我们来看看立方体坐标系是怎样在正六边形网格中运作的。如下图,当我们往着+z移动时,除了z坐标改变之外,y坐标也在改变。(在原文中尝试一下)同时我们可以发现,在我们往任意相邻格子移动时,一定会有两个坐标发生改变
    在这里插入图片描述

  • 立方体坐标是正六边形网格的一个合理选择,并且所有的算法也必须满足约束条件x+y+z=0

纵向坐标(Axial coordinates)

  • 虽然立方体(三维)坐标方便了算法,但是却不适合存储。

  • 纵向坐标去掉了立方体(三维)坐标中的一维,因为约束条件是x+y+z=0,存在一维冗余(只要知道其中两个,就可以计算出剩下的一个),因此我们可以只保留两个维度来存储数据。
    在这里插入图片描述

  • 相对于偏移坐标来说,纵向坐标可以方便的进行运算(加减乘除),但是在存储一个矩形地图的时候就显得有些奇怪。

倍化坐标(Doubled coordinates)

  • 虽然我推荐使用纵向坐标(Axial coordinates),但是如果你依然坚持使用偏移坐标(Offset coordinates)的话,可以考虑下倍化坐标(Doubled coordinates),这个坐标也可以简化一些运算。
  • 在倍化坐标下,行距(或者列距)是原来的两倍,这样就可以产生一个约束:(col+row)%2=0
  • 倍化x坐标
    在这里插入图片描述
  • 倍化y坐标
    在这里插入图片描述
  • 倍化坐标这个名字并不正式,其实还存在许多别称,例如在tri-bit.com里被称为interlaced

对比

偏移 倍化 纵向 立方体
pointy rotation evenr, oddr doublewidth axial cube
flat rotation evenq, oddq doubleheight
other rotation no yes
向量运算 no yes
数组存储 方形 棱形
哈希存储 任意形状
Hexagonal symmetry no yes
基础运算 较少 大部分 所有
  • 建议:如果你只打算使用矩形地图,并且不需要旋转地图,那么可以考虑倍化坐标或偏移坐标,因为与纵向或立方体相比,它们可以更好地对齐。在其他情况下,使用纵向坐标作为主系统,并且可以转换成立方体坐标来处理一些复杂的算法。
posted @ 2020-09-18 21:33  嘿咻&比丢  阅读(913)  评论(0编辑  收藏  举报