Jom*_*ity 6 math hexagonal-tiles coordinate-systems
我正在制作一个基于六边形图块的游戏,它会生成螺旋形状的六边形的蜂窝排列。我的目标是将世界位置(例如鼠标单击)转换为螺旋坐标(索引/图层/图层周围的位置)。我想不出如何做到这一点,所以我一直在寻找通过首先转换为轴坐标或从轴坐标转换来简化问题。如何才能做到这一点?
我的配置是尖顶的,如下:

这是螺旋索引:

参考轴坐标:

我已经有了这些螺旋坐标方程:
const Layer = (index: number): number => {
return Math.floor((3 + Math.sqrt(12 * index - 3)) / 6);
}
const Position = (index: number, layer: number): number => {
return index - 3 * layer * (layer - 1) - 1;
}
const Index = (layer: number, position: number): number => {
return 3 * layer * (layer - 1) + 1 + position;
}
Run Code Online (Sandbox Code Playgroud)
小智 3
我正在寻找这个问题的答案,不需要条件。我提出的解决方案基于Amit Patel 的 Hex Grid Guide中的螺旋算法。
它依赖于您可以对轴坐标求和和缩放的事实。六边形有 6 个邻居,其相对轴坐标为 [(1, 0), (1, -1), (0, -1), (-1, 0), (-1, 1), (0, 1)]。您可以将任何十六进制定义为两个相对轴坐标的总和。我不太知道如何用文字解释这一点,所以图表:
![解释如何通过对两个相邻轴向向量 [-3, 0] 和 [0, -2] 求和来找到示例六边形(在本例中为六边形 23)](https://i.stack.imgur.com/WoDcn.png)
我的图表适用于“平顶”六边形,但“点顶”六边形的逻辑是相同的。计算轴向位置的步骤是。
其 Python 实现可能是:
neighbor_vec = ((1, 0), (1, -1), (0, -1), (-1, 0), (-1, 1), (0, 1))
layer = int(3 + Math.sqrt(12 * index - 3)) // 6
position = (index - 3 * layer * (layer - 1)) % (6 * layer)
direction = position // layer
along = neighbor_vec[direction]
out_to = neighbor_vec[(direction + 4) % 6]
along_scale = position % layer
q = along[0]*along_scale + out_to[0]*layer
r = along[1]*along_scale + out_to[1]*layer
Run Code Online (Sandbox Code Playgroud)