我们有一个六角形的latice:
_ _ _
/ \_/ \_/ \_
\_/ \_/ \_/ \
/ \_/ \_/ \_/
\_/ \_/ \_/
Run Code Online (Sandbox Code Playgroud)
用二维数组或其他什么来表示它的最佳方法是什么
com*_*orm 15
使用2D数组表示十六进制网格的最简单方法是使轴倾斜:每行的六边形比前一行偏移半步.只要你对它保持一致,每行是向前还是向后偏移都无关紧要; 在下面,每个连续的行偏移半个十六进制前进:
(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
Run Code Online (Sandbox Code Playgroud)
很容易确定任何给定十六进制的最近邻居:在上面的例子中,对于给定的数组地址(r,s),您有:
(r-1, s)
(r-1, s+1)
(r, s-1)
(r, s+1)
(r+1, s-1)
(r+1, s)
Run Code Online (Sandbox Code Playgroud)
另请注意,绘图位置很简单:(r,s)上面的十六进制中心位于屏幕位置:
x= dx * (s + 0.5*r)
y= dy * r
Run Code Online (Sandbox Code Playgroud)
作为替代方案,您可以将交替行偏移半个十六进制绝对值.这将为给定数组提供更矩形的形状,但确定绘图位置和最近邻居将需要两种情况,分别用于偶数行和奇数行.
还有其他可用的坐标系,但它们不太方便且更加模糊......
由于OP需要更多,我将添加一个链接到我最喜欢的模糊十六进制索引系统:一个"螺旋蜂窝马赛克".这使用基数为7的系统来连续索引更大的"超六边形"十六进制位置组,如下所示(注意它标记在base-7中,而不是base-ten):
7 elements: 49 elements:
2 3
22 23
1 0 4 -->
12 13 21 20 24
6 5
11 10 14 26 25 32 33
16 15 02 03 31 30 34 --> [3 base-7 digits
-> 343 elements...]
62 63 01 00 04 36 35
61 60 64 06 05 42 43
66 65 52 53 41 40 44
51 50 54 46 45
56 55
Run Code Online (Sandbox Code Playgroud)
该链接有一些处理这个坐标系的代码,但我还没有真正尝试过评估它....