Java:查找起始坐标 (0,0) 的邻居
Java: Finding neighbours of a start coordinate (0,0)
我在弄清楚如何搜索坐标周围以找到它的邻居时遇到了问题。看到图片就更明白了。
我有 7 个六边形,它们都有各自的坐标,中心为 (0,0)。我希望创建一种方法,在该方法中我可以将所有相邻六边形添加到数组列表中,但我很难弄清楚如何确定添加的六边形实际上是一个相邻六边形。
图片在这里:
示例:(参考图片)
我想知道位置 (0,-1) 上的六边形有哪些邻居。通过查看图片,我可以看到它有 (1,0) 、(0,0) 和 (-1,-1)。但是我如何遍历它并在 java 代码中找到它的邻居?
我将做出一些假设并尝试给出一个答案。如果有变化或不合适,请发表评论。
从外观上看,您的网格是方形的。我的意思是,X 和 Y 坐标都在同一范围内指定。考虑以下 class:
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;
}
}
我喜欢枚举方向方法
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];
}
}
我在弄清楚如何搜索坐标周围以找到它的邻居时遇到了问题。看到图片就更明白了。
我有 7 个六边形,它们都有各自的坐标,中心为 (0,0)。我希望创建一种方法,在该方法中我可以将所有相邻六边形添加到数组列表中,但我很难弄清楚如何确定添加的六边形实际上是一个相邻六边形。
图片在这里:
示例:(参考图片)
我想知道位置 (0,-1) 上的六边形有哪些邻居。通过查看图片,我可以看到它有 (1,0) 、(0,0) 和 (-1,-1)。但是我如何遍历它并在 java 代码中找到它的邻居?
我将做出一些假设并尝试给出一个答案。如果有变化或不合适,请发表评论。
从外观上看,您的网格是方形的。我的意思是,X 和 Y 坐标都在同一范围内指定。考虑以下 class:
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;
}
}
我喜欢枚举方向方法
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];
}
}