我一直在研究如何搜索坐标以找到它的邻居。当你看到图片时会更有意义。
我有7个六边形,它们都有各自的坐标,其中心是(0,0)。我想创建一个方法,我可以将所有邻居六边形添加到一个arraylist,但我很难弄清楚如何确定添加的六边形实际上是一个邻居。
示例:(参考图片)
我想知道位置(0,-1)上的六边形是哪个邻居。通过查看图片,我可以看到它有(1,0),(0,0)和(-1,-1)。但是我如何循环这个并在java代码中找到它的邻居呢?
答案 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];
}
}