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

时间:2017-06-04 23:05:44

标签: java data-structures coordinates storage converter

我意识到有很多关于像素和六边形的问题已被问到,但我很难理解它的某个方面。此外,我不确定它会产生多大的差别,但我正在使用Java。

从理解此事开始,我理解笛卡尔网格可以存储在2d数组中,因此板上的坐标都是2d数组中的条目。但是,我想使用六边形网格来获得更好的游戏网格,如Amit的页面http://www.redblobgames.com/grids/hexagons/所述。

我理解六角形网格创建后的概念(使用x,y,z来获取邻居),但我正努力存储我的坐标。以前,每个坐标都对应于2d数组中的条目(笛卡儿)。现在,我不确定如何使它对应于坐标之间的六边形关系。

按照指南,我试图每隔一行偏移坐标(特别是从链接中尝试偶数行偏移示例),如下所示:

enter image description here

在这里,顶部是坐标,底部是数组的直观表示(空格是带有标记'跳过'的条目,1是与坐标对应的条目。)

因此,每个坐标的邻居是{{-1,1},{1,1},{1,-1},{-1,-1},{0,2},{0, - 2}}。但是,我不认为这样做得好吗?我想到了实现六边形网格的其他方法,它们使用双向链表排列结构,从中间开始,将坐标关联为“节点”,或硬编码地图(这有点不可能,因为我计划一张大地图)。但是,我宁愿坚持使用偏移的想法,因为它更容易使用。

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

1 个答案:

答案 0 :(得分:2)

        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对象)不需要对相邻节点的任何引用。你的坐标系会处理这个问题。