1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем xflyiwnl, 24 мар 2023.

  1. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

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

    Погуглил, нашёл лишь только то, как люди создают гексагоны в javafx. Но это не подходит
     
    Последнее редактирование: 24 мар 2023
  2. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Почему не подходит? Геометрия везде одна. Гуглится элементарно: https://svg-art.ru/?tag=шестиугольник

    Фактически это 6 точек на окружности, между точками 60 градусов соответственно
     
  3. 0xLairon1

    0xLairon1 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    PHP:
        public static List<LocationcalculateHexagonCoordinates(Location centerdouble size) {
            List<
    Locationcoordinates = new ArrayList<>();
            
    double angle_deg;
            
    double angle_rad;
            
    double x;
            
    double y;
            
    double z;
            
            for (
    int i 06i++) {
                
    angle_deg 60 i;
                
    angle_rad Math.PI 180 angle_deg;
                
    center.getX() + size Math.cos(angle_rad);
                
    center.getY();
                
    center.getZ() + size Math.sin(angle_rad);
                
    coordinates.add(new Location(center.getWorld(), xyz));
            }
            
            return 
    coordinates;
        }
    Сгенерировал через ChatGPT, проверь я не тестил

    Вернет 6 координат углов
     
  4. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Спасибо)) Я вчера чекнул один код, вроде работает. Но теперь мне надо сделать grid систему для гексагонов, чтобы гексагоны создавались ровно и прилипали к друг-другу, если рядом есть гексагон

    Вот думаю от 0, 0 координат создать заранее много гексагонов
     
  5. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    вроде получается, гексагоны рисуются, а вот грид система не))
    upload_2023-3-24_21-24-29.png
     
  6. 0xLairon1

    0xLairon1 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    Все очень просто:
    Для построение 1(Нечетного) ряда при постройке каждого гексагона делаешь Location * size. Таким образом ты строишь гексагоны в плотную
    Для постройки 2 ряда(Четного) Для первого гексагона делаешь Location * (size * 0.5f) Для остальных так же как и с четным рядом
    Для того чтобы найти насколько выше нужно строить ряд size * 0.5f
    И вот так строишь ряды четные и не четные
     
  7. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Понял, а если гексагон находится вообще не рядом? Далеко
     
  8. 0xLairon1

    0xLairon1 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    Посмотрел что написал, скорее всего неверно, гексагоны должны находится друг к другу на растоянии = size * 1.5f
    Если не рядом но по сетке то:
    насколько далеко * (size * 1.5f)
     
  9. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    У меня получилось сделать, но есть дефекты. Поможете как убрать?

    Код:
    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
     
  10. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Я вас наверное заежал, решил сам

    Код:
    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
     
  11. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Красава :good:
     
  12. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Ещё, сделал так, чтобы можно было создавать гекс, который не присоединён к центральной точке.

    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
     
    Последнее редактирование: 24 мар 2023
  13. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Правда ряд и колонаа расположены криво, его надо инвертировать
     
  14. 0xLairon1

    0xLairon1 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    Интересно
    стало, зачем тебе это?
     
  15. Автор темы
    xflyiwnl

    xflyiwnl Активный участник Пользователь

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

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