Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Создание гексагона (Шестиугольника)

xflyiwnl

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
xflyiwnl
Допустим игрок ввёл команду, после которого создаётся гексагон, координаты всех углов запоминаются.

Погуглил, нашёл лишь только то, как люди создают гексагоны в javafx. Но это не подходит
 
Последнее редактирование:
Погуглил, нашёл лишь только то, как люди создают гексагоны в javafx. Но это не подходит
Почему не подходит? Геометрия везде одна. Гуглится элементарно: https://svg-art.ru/?tag=шестиугольник

Фактически это 6 точек на окружности, между точками 60 градусов соответственно
 
Допустим игрок ввёл команду, после которого создаётся гексагон, координаты всех углов запоминаются.

Погуглил, нашёл лишь только то, как люди создают гексагоны в javafx. Но это не подходит
PHP:
    public static List<Location> calculateHexagonCoordinates(Location center, double size) {
        List<Location> coordinates = new ArrayList<>();
        double angle_deg;
        double angle_rad;
        double x;
        double y;
        double z;
        
        for (int i = 0; i < 6; i++) {
            angle_deg = 60 * i;
            angle_rad = Math.PI / 180 * angle_deg;
            x = center.getX() + size * Math.cos(angle_rad);
            y = center.getY();
            z = center.getZ() + size * Math.sin(angle_rad);
            coordinates.add(new Location(center.getWorld(), x, y, z));
        }
        
        return coordinates;
    }
Сгенерировал через ChatGPT, проверь я не тестил

Вернет 6 координат углов
 
PHP:
    public static List<Location> calculateHexagonCoordinates(Location center, double size) {
        List<Location> coordinates = new ArrayList<>();
        double angle_deg;
        double angle_rad;
        double x;
        double y;
        double z;
      
        for (int i = 0; i < 6; i++) {
            angle_deg = 60 * i;
            angle_rad = Math.PI / 180 * angle_deg;
            x = center.getX() + size * Math.cos(angle_rad);
            y = center.getY();
            z = center.getZ() + size * Math.sin(angle_rad);
            coordinates.add(new Location(center.getWorld(), x, y, z));
        }
      
        return coordinates;
    }
Сгенерировал через ChatGPT, проверь я не тестил

Вернет 6 координат углов
Спасибо)) Я вчера чекнул один код, вроде работает. Но теперь мне надо сделать grid систему для гексагонов, чтобы гексагоны создавались ровно и прилипали к друг-другу, если рядом есть гексагон

Вот думаю от 0, 0 координат создать заранее много гексагонов
 
Спасибо)) Я вчера чекнул один код, вроде работает. Но теперь мне надо сделать grid систему для гексагонов, чтобы гексагоны создавались ровно и прилипали к друг-другу, если рядом есть гексагон

Вот думаю от 0, 0 координат создать заранее много гексагонов
вроде получается, гексагоны рисуются, а вот грид система не))
upload_2023-3-24_21-24-29.png
 
Все очень просто:
Для построение 1(Нечетного) ряда при постройке каждого гексагона делаешь Location * size. Таким образом ты строишь гексагоны в плотную
Для постройки 2 ряда(Четного) Для первого гексагона делаешь Location * (size * 0.5f) Для остальных так же как и с четным рядом
Для того чтобы найти насколько выше нужно строить ряд size * 0.5f
И вот так строишь ряды четные и не четные
 
Все очень просто:
Для построение 1(Нечетного) ряда при постройке каждого гексагона делаешь Location * size. Таким образом ты строишь гексагоны в плотную
Для постройки 2 ряда(Четного) Для первого гексагона делаешь Location * (size * 0.5f) Для остальных так же как и с четным рядом
Для того чтобы найти насколько выше нужно строить ряд size * 0.5f
И вот так строишь ряды четные и не четные
Понял, а если гексагон находится вообще не рядом? Далеко
 
Понял, а если гексагон находится вообще не рядом? Далеко
Посмотрел что написал, скорее всего неверно, гексагоны должны находится друг к другу на растоянии = size * 1.5f
Если не рядом но по сетке то:
насколько далеко * (size * 1.5f)
 
У меня получилось сделать, но есть дефекты. Поможете как убрать?

Код:
public void createHexagons() {

    Location center = new Location(Bukkit.getWorld("world"), 0, 0, 0);

    int numRows = 10;
    int numCols = 10;

    for (int row = 0; row < numRows; row++) {

        Location hexagonCenter = center.subtract(0, 0, calculateHexagonCoordinates(center).get(0).distance(calculateHexagonCoordinates(center).get(1)) * 0.8659);
        double distance = calculateHexagonCoordinates(hexagonCenter).get(0).distance(calculateHexagonCoordinates(hexagonCenter).get(1));
        
        for (int col = 0; col < numCols; col++) {

            if (col == 1) {
                hexagonCenter.setX(0);
            }

            if (row%2 == 0) {
                if (col == 1) {
                    hexagonCenter.subtract(distance * 4.5, 0, 0);
                } else {
                    hexagonCenter.subtract(distance * 3.0, 0, 0);
                }
            } else {
                hexagonCenter.subtract(distance * 3.0, 0, 0);
            }

            hexagons.add(hexagonCenter);
            System.out.println("Hexagons -> created hexagon: x:" + Math.round(hexagonCenter.getX()) + ", Z:" + hexagonCenter.getZ());

            hexagonDrawer.showHexagon(hexagonCenter);

        }
    }

}
upload_2023-3-25_1-8-45.png
 
Я вас наверное заежал, решил сам

Код:
public void createHexagons() {

        Location center = new Location(Bukkit.getWorld("world"), 0, 0, 0);

        int numRows = 10;
        int numCols = 10;

        double distance = calculateHexagonCoordinates(center).get(0).distance(calculateHexagonCoordinates(center).get(1));
        double yOffset = distance * 0.8659;

        for (int row = 0; row < numRows; row++) {

            Location hexagonCenter = center.clone();

            if (row % 2 != 0) {
                hexagonCenter.subtract(distance * 1.5, 0, 0);
            }

            hexagonCenter.subtract(0, 0, row * yOffset);

            for (int col = 0; col < numCols; col++) {

                if (col != 0) {
                    hexagonCenter.subtract(distance * 3, 0, 0);
                }

                hexagons.add(hexagonCenter.clone());

                hexagonDrawer.showHexagon(hexagonCenter);

            }
        }
    }

upload_2023-3-25_1-36-24.png
 
Я вас наверное заежал, решил сам

Код:
public void createHexagons() {

        Location center = new Location(Bukkit.getWorld("world"), 0, 0, 0);

        int numRows = 10;
        int numCols = 10;

        double distance = calculateHexagonCoordinates(center).get(0).distance(calculateHexagonCoordinates(center).get(1));
        double yOffset = distance * 0.8659;

        for (int row = 0; row < numRows; row++) {

            Location hexagonCenter = center.clone();

            if (row % 2 != 0) {
                hexagonCenter.subtract(distance * 1.5, 0, 0);
            }

            hexagonCenter.subtract(0, 0, row * yOffset);

            for (int col = 0; col < numCols; col++) {

                if (col != 0) {
                    hexagonCenter.subtract(distance * 3, 0, 0);
                }

                hexagons.add(hexagonCenter.clone());

                hexagonDrawer.showHexagon(hexagonCenter);

            }
        }
    }

Посмотреть вложение 64668
Красава :good:
 
Ещё, сделал так, чтобы можно было создавать гекс, который не присоединён к центральной точке.

createHexagon(new Location(Bukkit.getWorld("world"), 0, 0, 0), 15, 5);

Код:
public void createHexagon(Location center, int column, int row) {

        double xOffset = radius * 3.0;
        double yOffset = radius * 0.8659;

        double centerX = center.getX() + (column * xOffset);
        if (row % 2 == 1) {
            centerX += xOffset / 2;
        }

        double centerZ = center.getZ() + (row * yOffset);

        Location hexagonCenter = new Location(center.getWorld(), centerX, center.getY(), centerZ);
        hexagonDrawer.showHexagon(hexagonCenter);

    }

upload_2023-3-25_2-5-20.png
 
Последнее редактирование:
Ещё, сделал так, чтобы можно было создавать гекс, который не присоединён к центральной точке.

createHexagon(new Location(Bukkit.getWorld("world"), 0, 0, 0), 15, 5);

Код:
public void createHexagon(Location center, int column, int row) {

        double xOffset = radius * Math.sqrt(3);
        double yOffset = radius * 1.5;

        double centerX = center.getX() + (column * xOffset);
        if (row % 2 == 1) {
            centerX += xOffset / 2;
        }

        double centerZ = center.getZ() + (row * yOffset);

        Location hexagonCenter = new Location(center.getWorld(), centerX, center.getY(), centerZ);
        hexagonDrawer.showHexagon(hexagonCenter);

    }

Посмотреть вложение 64669
Правда ряд и колонаа расположены криво, его надо инвертировать
 
Интересно
стало, зачем тебе это?
Пишу большую альтернативу Towny, хочу дополнить его встроенными зданиями, стабилность, людской ресурс, идеологиями и т.д. В тауни ещё много не нужной мне воды. Хотелось бы ещё заменить систему чанков системой гексагонов
 

Поделиться этой страницей

Назад
Верх