Arrays 表示六边形纬度的最佳方式是什么

Arrays 表示六边形纬度的最佳方式是什么,arrays,algorithm,Arrays,Algorithm,我们有一个六边形的纬度: _ _ _ / \_/ \_/ \_ \_/ \_/ \_/ \ / \_/ \_/ \_/ \_/ \_/ \_/ 用二维数组或任何东西表示它的最佳方法是什么?用二维数组表示十六进制网格的最简单方法是扭曲轴:每行六进制的偏移量比前一行多半步。每一行是向前偏移还是向后偏移并不重要,只要你对它保持一致;下面,每个连续行向前偏移半个十六进制: (0,0) (0,1) (0,2) (0,3) (0,4) (1,0) (1,1) (1,2) (1,3)

我们有一个六边形的纬度:

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

用二维数组或任何东西表示它的最佳方法是什么?用二维数组表示十六进制网格的最简单方法是扭曲轴:每行六进制的偏移量比前一行多半步。每一行是向前偏移还是向后偏移并不重要,只要你对它保持一致;下面,每个连续行向前偏移半个十六进制:

(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想要更多,我将添加一个链接到我最喜欢的晦涩的十六进制索引系统:a。这使用了一个以7为基数的系统来索引依次较大的“超级六边形”六边形位置组,如下所示(注意,它是以7为基数标记的,而不是以10为基数):


该链接有一些处理该坐标系的代码,但我还没有真正尝试对其进行评估……

使用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

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


图片取自:

您对节点或区域感兴趣吗?您希望代表什么?无限格?矩形的有限格?顶点上的数据?边缘上的数据?请参阅并取决于@Jason列出的内容,再加上您计划如何使用它,以及您希望如何存储或访问数据。我对区域感兴趣。纬度是无限的。数据在区域中您的解决方案实际上并不代表答案中所示的晶格-它旋转了90度。问题的晶格没有直接的水平邻域,但有垂直邻域。@安德鲁·库克:真的吗?今天感觉有点挑剔,是吗?:-)用ascii码画图可能更容易。我们当然可以交换r和s的角色,然后翻转图片……我想r=行,s=倾斜列;C样式的数组约定通常是[行][列]。当然,正如菲卡勒所说,你可以随心所欲地画它…@comingstorm,谢谢你的回答!一个有趣的想法。2所有,还有其他想法吗?GameDev StackExchange上最近提出的一个问题提供了在螺旋蜂窝马赛克和斜轴系统之间转换的方法:(以及到其他索引样式的链接)。考虑这种模式的另一种方法是:取一个正方形晶格,根据奇偶性删除一半坐标(例如,只接受/使用那些坐标
(x,y)
,这样
x+y
是偶数)。当然,你不想浪费一半的数组条目——因此,上面@LastCoder的安排是这样的。
4,1,5,2,6,3
4,7,5,8,6,9
A,7,B,8,C,9
A,D,B,E,C,F