Помогите написать алгоритм поиска координат дерева (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 шт):

Автор решения: Mikhail Ionkin

Тебе нужна функция, принимающая на вход аккамулятор типа 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);
→ Ссылка