创建六边形网格图案

时间:2018-03-13 17:55:02

标签: java

My Grid
https://www.redblobgames.com/grids/hexagons/

我有这个漂亮的六边形图案,我需要以某种方式在java中实现它。我已经有一个代表一个六边形的“Tile”类和一个用于每个Tile坐标的“Vector”类。每个Tile对象都有自己的向量。

现在我只想将所有图块添加到列表中。但要做到这一点,我需要创建所有37个。这就是我现在被困住的地方。我当然可以手工创建所有内容,但这不仅乏味且容易出错,而且也不是很优雅。

你们中的任何人都可以告诉我能做些什么吗? :)

2 个答案:

答案 0 :(得分:1)

我认为您需要做的第一件事就是连接您的瓷砖。给他们六个参考,每个潜在邻居一个 - 西北,东北,东,东南,西南和西。然后,给定任何图块,您可以轻松遍历其所有邻居。在您创建Tile个对象图表后,请为其分配Vector个实例。

假设每个Vector的{​​{1}}是唯一的,下一步是创建一个函数,将每个Tile个实例映射到笛卡尔坐标。此时,您可以绘制点数,看看您是否将瓷砖放在屏幕上的正确空间中。

根据您发布的链接判断,听起来您正在尝试制作某种游戏(这很酷!)。如果是这种情况,那么在Vector功能正常工作后,您还有两件事要做:

  1. 渲染六角形瓷砖"正确",而不仅仅是点或方块。

  2. 创建反向vector2Cart()方法,该方法采用笛卡尔坐标并返回与占据屏幕该部分的cartToVector()对应的Vector。这样您就可以点击屏幕并对Tile

  3. 进行操作

答案 1 :(得分:0)

要构建网格,请利用几何/对称性。根据深度来考虑网格,其中中心是深度0,并且每个连续层具有增加的深度。上面的网格深度= 3 每个级别都有与其深度相关的恒定属性(每个级别有6个边,每边的长度与深度成正比)。

以下代码将有助于构建网格:

public class HexagonGrid {

    public static void main(String[] args) {

       int size = 3;
       buildHexagonGrid(size);
   }

    private static void buildHexagonGrid(int size) {
       int totalTiles = 0;
       int depth = 0;
       // TODO:  Build the center tile here
       totalTiles++;    // Center
       System.out.printf("Current size (after depth=%d) = %d\n", depth, totalTiles);
       for (depth=1; depth<=size; depth++) {
          for (int side=1; side<=6; side++) {
             for (int tile=1; tile<=depth; tile++)
                // TODO: Build the Tiles along current side/depth
                // There is a clear relationship between x/y/z and depth/side/tile
                totalTiles++;
          } 
             System.out.printf("Current size (after depth=%d) = %d\n", depth, totalTiles);
       }
    }
}

显示每层创建的图块数量:

Current size (after depth=0) = 1
Current size (after depth=1) = 7
Current size (after depth=2) = 19
Current size (after depth=3) = 37