如何存储坐标以像六边形结构一样工作?

How to store coordinates to act like a hexagon-esque structure?

我知道很多人问过关于像素和六边形的问题,但我很难理解它的某个方面。另外,我不确定它会带来多大的不同,但我在 Java.

工作

从我对这件事的理解开始,我知道笛卡尔网格可以存储在二维数组中,这样棋盘上的每个坐标都是二维数组中的一个条目。但是,我想使用六角形网格来获得更好的游戏网格,如 Amit 页面 http://www.redblobgames.com/grids/hexagons/.

中所述

我在创建六边形网格(使用 x、y、z 获取邻居)后理解了这个概念,但我很难存储我的坐标。以前,每个坐标都对应于二维数组(笛卡尔)中的一个条目。现在,我不确定如何使它对应到坐标之间的六边形关系。

按照指南,我尝试每隔一行偏移坐标(具体尝试 link 中的偶数行偏移示例),如下所示:

在此,顶部是坐标,底部是数组的可视化表示(空格是标记为 'skip' 的条目,1s 是对应于坐标的条目)。

所以,每个坐标的邻居是{ {-1, 1}, {1, 1}, {1, -1}, {-1, -1}, {0, 2}, {0 , -2} }。但是,我不认为这样做是正确的?我想到了其他实现六边形网格的方法,即使用双重 linked 列表结构并从中间开始并将坐标关联为 'nodes',或者硬编码地图(这是不可能的,因为我计划一张大地图)。但是,我宁愿坚持偏移的想法,因为它更容易使用。

我认为我的问题是每行应该移动 1/2,但我给了它 'holes'(标记条目)。也许我应该使用六边形的几何形状将坐标转换为六边形。但是我不明白当我想查找路径时如何使用这些单独的六边形,除非它们存储在某种数据结构中。任何代码或帮助将不胜感激。

        0   1   2   3   4   5
      0   1   2   3   4   5
    0   1   2   3   4   5
  0   1   2   3   4   5
0   1   2   3   4   5

如果您不介意您的地图有点像菱形,您可以将一组六边形整齐地放入一个二维数组中。在节点之间移动的数学将是一致的--

(E/W 改变 x,NE/SW 改变 y,NW/SE 两者都改变​​)。

基本上,您使用的是坐标映射作为参考。您不需要实际将地图构建到二维数组上。相反,您使用坐标映射来简化您的关系。

例如,您可以将坐标映射到哈希图中,例如

map.put("0,2", new Tile(0,2,"Green"));
map.put("0,3", new Tile(0,3,"Yellow"));
map.put("0,4", new Tile(0,4,"Green"));
map.put("0,5", new Tile(0,5,"Green"));
map.put("1,2", new Tile(1,2,"Blue"));
map.put("1,3", new Tile(1,3,"Red"));
map.put("1,4", new Tile(1,4,"Orange"));
map.put("2,1", new Tile(2,1,"Orange"));

对于任何给定的瓦片,您可以回答是否有任何给定方向可用,并通过引用 HashMap 在 O(1) 时间内检索该方向的瓦片。您的节点(例如 Tile 对象)不需要任何对相邻节点的引用。您的坐标系会处理这个问题。