Java:查找起始坐标的邻居(0,0)

时间:2018-05-04 19:28:51

标签: java position coordinates neighbours

我一直在研究如何搜索坐标以找到它的邻居。当你看到图片时会更有意义。

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

图片来源:enter image description here

示例:(参考图片)

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

2 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:0)

我喜欢enum Direction方法

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];
    }
}