Java: поиск соседей начальной координаты (0,0)

У меня возникла проблема с выяснением того, как я могу искать по координате, чтобы найти ее соседей. Это будет иметь больше смысла, когда вы увидите картинку.

У меня есть 7 шестиугольников, и все они имеют соответствующие координаты, где центральный (0,0). Я хочу создать метод, в котором я могу добавить все соседние шестиугольники в список массивов, но мне трудно понять, как я могу определить, что добавленный шестиугольник на самом деле является соседом.

Изображение здесь: введите здесь описание изображения

Пример: (Ссылка на картинку)

Я хочу знать, какие соседи имеет шестиугольник в позиции (0,-1). Глядя на картинку, я вижу, что она имеет (1,0), (0,0) и (-1,-1). Но как мне пройти через это и найти его соседей в java-коде?


person Ali Öztürk    schedule 04.05.2018    source источник
comment
Здесь действительно не так много информации. Если у вас всего 7 шестиугольников, просто жестко закодируйте значения и вставьте их в метод объекта шестиугольника. Сделайте несколько проверок границ сгенерированных координат, и все в порядке. Если ваша сетка сложнее, добавьте это в вопрос.   -  person Kamil Jarosz    schedule 04.05.2018
comment
На этой странице есть полезная информация.   -  person Turing85    schedule 04.05.2018


Ответы (2)


Я собираюсь сделать некоторые предположения и попытаться представить ответ. Пожалуйста, прокомментируйте, если что-то изменилось или не сидит правильно.

Судя по всему, ваша сетка квадратная. Я имею в виду, что координаты 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;
  }
}
person Kamil Jarosz    schedule 04.05.2018

Мне нравится подход 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];
    }
}
person Bogdan Lukiyanchuk    schedule 04.05.2018