什么是表示六边形格子的最佳方式

时间:2011-09-12 19:00:21

标签: arrays algorithm

我们有一个六角形格子:

 _   _   _
/ \_/ \_/ \_ 
\_/ \_/ \_/ \ 
/ \_/ \_/ \_/
\_/ \_/ \_/

用二维数组或其他什么

表示它的最佳方法是什么

3 个答案:

答案 0 :(得分: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)

很容易确定任何给定十六进制的最近邻居:在上面的例子中,对于给定的数组地址(r,s),你有:

(r-1, s)
(r-1, s+1)
(r, s-1)
(r, s+1)
(r+1, s-1)
(r+1, s)

另请注意,绘图位置很简单:上面的十六进制(r,s)的中心位于屏幕位置:

x= dx * (s + 0.5*r)
y= dy * r

作为替代方案,您可以将备用行偏移半个十六进制绝对值。这将为给定数组提供更加矩形的形状,但确定绘图位置和最近邻居将需要两种情况,分别用于偶数行和奇数行。

还有其他可用的坐标系,但它们不太方便且更加模糊......


由于OP需要更多,我将添加一个指向我最喜欢的模糊十六进制索引系统的链接:"spiral honeycomb mosaic"。这使用基数为7的系统来连续索引更大的“超六边形”十六进制位置组,如下所示(请注意,它标记在基数为7,而不是基数为10):

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

该链接有一些处理这个坐标系的代码,但我还没有真正尝试过评估它....

答案 1 :(得分:3)

使用2行= 1个十六进制高度,1列= 1个十六进制宽度,可以使用2d数组。

4,1,5,2,6,3
4,7,5,8,6,9
A,7,B,8,C,9
A,D,B,E,C,F
  • 每对数字都是1个六角形的瓷砖。
  • 找到12点和6点只是一个+ -Y直到你在另一个瓷砖上
  • 找到2点和4点
    • 检查Y + 1是否是同一个图块
      • 如果是,2点是X + 1& 4点是X + 1,Y + 1
      • 如果不是,2点是X + 1,Y-1& 4点是X + 1

答案 2 :(得分:2)

请注意,有四种不同的方式来表示六边形格子。我花了很多时间寻找解决方案,无法将其与另一个相匹配。然后我意识到,有4种不同的方法来构建和表示晶格。因此,在选择一个时,请确保您尝试使用的格式。下面给出了四种格式:

enter image description here 图片来自:https://www.redblobgames.com/grids/hexagons/#conversions