Помогите написать алгоритм поиска координат дерева (Minecraft)
помогите получить координаты каждого блока одного дерева, относительно срубленного. Есть функция, которая проверяет блок дерева это или нет, принимает координаты XYZ, в listOfTrees должны записаться координаты каждого блока дерева.
Что пока есть:
public boolean isWood(Location<World> blockLoc) {
BlockType type = blockLoc.getBlock().getType();
Boolean isWood = false;
if (type.equals(BlockTypes.LOG)
|| type.equals(BlockTypes.LOG2)) {
isWood = true;
}
return isWood;
}
public Location<World> getBlockAt(String worldName, int posX, int posY, int posZ) {
ArrayList[] listOfTrees;
World world = Sponge.getServer().getWorld(worldName).get();
Location<World> blockLoc = new Location<World>(world, posX, posY, posZ);
}
Ответы (1 шт):
Тебе нужна функция, принимающая на вход аккамулятор типа HashSet<Location> и начальную позицию. Реализация проста: смотришь все соседние клетки: для каждой соседней клетки проверяешь, является ли клетка деревом и есть ли она уже в аккамуляторе. Если дерево и нет в аккамуляторе, то вызываешь функцию с тем же набором + указанной клеткой для данной соседней позиции.
Реализация типа такой, но нужно обработать граничные случаи (диагонали) и протестить.
Для коректной работы лучше прописать функции hashCode() и equals() в классе Location
public boolean isWood(Location<World> blockLoc) {
BlockType type = blockLoc.getBlock().getType();
return type.equals(BlockTypes.LOG) || type.equals(BlockTypes.LOG2);
}
public Location<World> getAllWoodBlocks(HashSet<Location<World>> acc, World world, int posX, int posY, int posZ) {
Location<World> centr = new Location<World>(world, posX, posY, posZ);
if (isWood(world, centr) {
acc.push(centr);
}
for (int i=-1; i<=1; i++) {
for (int j=-1; j<=1; j++) {
for (int k=-1; k<=1; k++) {
Location<World> loc = new Location<World>(world, posX+i, posY+j, posZ+k);
if (!acc.contains(loc) && isWood(loc)) {
getAllWoodBlocks(acc, world, posX+i, posY+j, posZ+k);
}
}
}
}
}
HashSet<Location<World>> allWoodBlocks = getAllWoodBlocks(new HashSet<>(), posX, posY, posZ);