2

我一直在弄清楚如何在坐标周围搜索以找到其邻居时遇到问题。当你看到图片时,它会更有意义。

我有 7 个六边形,它们都有各自的坐标,中心坐标是(0,0)。我希望创建一个可以将所有相邻六边形添加到数组列表的方法,但是我很难弄清楚如何确定添加的六边形实际上是邻居。

图片在这里:在此处输入图像描述

示例:(参考图片)

我想知道位置 (0,-1) 上的六边形有哪些邻居。通过查看图片,我可以看到它有 (1,0) 、 (0,0) 和 (-1,-1)。但是我将如何循环并在 java 代码中找到它的邻居呢?

4

2 回答 2

0

我将做出一些假设并尝试给出答案。如果有什么变化或不正确,请发表评论。

从外观上看,您的网格是正方形的。我的意思是,X 和 Y 坐标都在同一范围内指定。考虑以下类:

public class HexagonalGrid {
  // Helper class Cell
  public static class Cell {
    public int x;
    public int y;

    public Cell(int x, int y) {
      this.x = x;
      this.y = y;
    }
  }


  // ranges are
  // x -> [-width, width]
  // y -> [-height, height]
  private int width;
  private int height;

  public HexagonalGrid(int width, int height) {
    this.width = width;
    this.height = height;
  }

  public ArrayList<Cell> getNeighbours(Cell target)  {
    ArrayList<Cell> neighbours = new ArrayList<>();

    // These coordinates are predictable, so let's generate them
    // Each immediate 
    for (int x_offset = -1; x_offset <= 1; x_offset++) {
      for (int y_offset = -1; y_offset <= 1; y_offset++) {
        // No offset puts us back at target cell so skip
        if (x_offset == 0 && y_offset == 0) { 
          continue;
        }

        // Generate the cell with the offset
        int x = target.x + x_offset;
        int y = target.y + y_offset;

        // Check validity against bounds
        if (isValidCoordinate(x, y)) {
          // Add valid neighbour
          Cell neighbour = new Cell(x, y);
          neighbours.add(neighbour);
        }
      }
    }

    return neighbours;
  }


  private boolean isValidCoordinate(int x, int y) {
    // Enforcing the ranges specified above
    return -width <= x && x <= width
        && -height <= y && y <= height;
  }
}
于 2018-05-04T19:50:56.673 回答
0

我喜欢枚举方向方法

public enum  Direction {
    UP(1, 0),
    RIGHT_UP(1, 1),
    RIGHT_DOWN(-1, 1),
    DOWN(-1, 0),
    LEFT_DOWN(-1, -1),
    LEFT_UP(1, -1);

    private final int dy;
    private final int dx;

    Direction(int dy, int dx) {
        this.dy = dy;
        this.dx = dx;
    }

    public int getDy() {
        return dy;
    }

    public int getDx() {
        return dx;
    }


    public Direction next() {
        return values()[(ordinal() + 1) % values().length];
    }

    public Direction opposite() {
        return values()[(ordinal() + values().length / 2) % values().length];
    }
}
于 2018-05-04T19:58:46.610 回答