Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Чекнуть, перескается ли регион с другим регионом.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Mr_RoboMan, 19 июл 2016.

  1. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Речь только про прямоугольные параллелепипеды, или ещё и про полигонные регионы тоже?
     
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Я нашел решение без AABB.

    Код:
    package Exemple;
    
    public class Cuboid {
        private int xMin;
        private int xMax;
        private int yMin;
        private int yMax;
        private int zMin;
        private int zMax;
        public Cuboid(int x1, int y1, int z1, int x2, int y2, int z2) {
            if (x1 < x2) {
                xMin = x1;
                xMax = x2;
            } else {
                xMin = x2;
                xMax = x1;
            }
            if (y1 < y2) {
                yMin = y1;
                yMax = y2;
            } else {
                yMin = y2;
                yMax = y1;
            }
            if (z1 < z2) {
                zMin = z1;
                zMax = z2;
            } else {
                zMin = z2;
                zMax = z1;
            }
        }
     
        public boolean intersects(Cuboid cuboid) {
            return cuboid.xMin <= xMax && cuboid.xMax >= xMin
                   && cuboid.yMin <= yMax && cuboid.yMax >= yMin
                   && cuboid.zMin <= zMax && cuboid.zMax >= zMin;
        }
       
        public boolean contains(int x, int y, int z) {
            return x >= xMin && x <= xMax
                   && y >= yMin && y <= yMax
                   && z >= zMin && z <= zMax;
        }
    }
     
  4. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Секундочку, я сейчас загуглю все непонятные слова, а потом отвечу.. :D
    Ухтышка, кажется годнота!!!
    Спасибо большое, протестирую потом!!
     
  5. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    А что, Math.min(...) и Math.max(...) уже отменили? :)
     
  6. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Загуглил. И в общем речь только про прямоугольные параллелепипеды (где можно получить медаль за что я это слово сам написал, а не скопировал? :D)! А точнее только про две локации которые сораняються как границы региона (Ну как и в WE/WG там же тоже выделяешь две локации. Вот у меня тоже самое!)! [DOUBLEPOST=1469005309,1469005276][/DOUBLEPOST]
    Ох, главное чтоб оно работало, на это я уже поизменять сам смогу)
     
  7. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Да работает оно. Проверяет 2 кубоида и точку внутри кубоида.
     
  8. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Это и есть AABB, только сделан очень костыльно.
     
  9. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну главное понятный и по мин макс работает.
     
  10. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Он непонятный. Тем более вместо x1,x2... можно было бы использовать Vector из Bukkit API
     
  11. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Я переделаль вот так:
    Код:
        public static boolean isIntersects(RegionManager.Selection newRegion, RegionManager.Selection oldRegion) {
            int minX1 = Math.min(newRegion.getFirst().getBlockX(), newRegion.getSecond().getBlockX());
            int minY1 = Math.min(newRegion.getFirst().getBlockY(), newRegion.getSecond().getBlockY());
            int minZ1 = Math.min(newRegion.getFirst().getBlockZ(), newRegion.getSecond().getBlockZ());
            int maxX1 = Math.max(newRegion.getFirst().getBlockX(), newRegion.getSecond().getBlockX());
            int maxY1 = Math.max(newRegion.getFirst().getBlockY(), newRegion.getSecond().getBlockY());
            int maxZ1 = Math.max(newRegion.getFirst().getBlockZ(), newRegion.getSecond().getBlockZ());
            int minX2 = Math.min(oldRegion.getFirst().getBlockX(), oldRegion.getSecond().getBlockX());
            int minY2 = Math.min(oldRegion.getFirst().getBlockY(), oldRegion.getSecond().getBlockY());
            int minZ2 = Math.min(oldRegion.getFirst().getBlockZ(), oldRegion.getSecond().getBlockZ());
            int maxX2 = Math.max(oldRegion.getFirst().getBlockX(), oldRegion.getSecond().getBlockX());
            int maxY2 = Math.max(oldRegion.getFirst().getBlockY(), oldRegion.getSecond().getBlockY());
            int maxZ2 = Math.max(oldRegion.getFirst().getBlockZ(), oldRegion.getSecond().getBlockZ());
            return minX1 <= maxX2 && maxX1 >= minX2
                    && minY1 <= maxY2 && maxY1 >= minY2
                    && minZ1 <= maxZ2 && maxZ1 >= minZ2;
        }
    
    Вроде переделал правильно..)
    Selection - просто две локации! Первая - getFirst() Вторая - getSecond()!
    Зато это могу понять даже я :D
     
  12. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Bozhe, kakiye govnoedy, poidu molitsya emu: https://en.wikipedia.org/wiki/James_Gosling
     
    Последнее редактирование: 20 июл 2016
  13. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
  14. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ты только все запутал.

    Cuboid cuboid = new Cuboid(
    loc1.getBlockX(),loc1.getBlockY(),loc1.getBlockZ(),
    loc2.getBlockX(),loc2.getBlockY(),loc2.getBlockZ()
    );
    cuboid.intersects(cuboid2);
     
  15. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    А если ни одна угловая точка любого региона не лежит внутри второго? ))
     
  16. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    fixed.
     
  17. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Я хз, создавать отдельный клас...
    Пытаюсь понять как это может быть, но пока-что не могу..
    По идее, если не одна угловая точка не лежит внутри второго то они и не пересекаются?
    Или я не прав?
    (Ну блин, я спал на геометрии :oops::oops::cry:)[DOUBLEPOST=1469007219,1469007148][/DOUBLEPOST]
    Хотя я понял, по идее, это возожно, если первый регион больше второго, и тогда не одна его угловая точка не лежит внутри второго... Я прав?[DOUBLEPOST=1469007254][/DOUBLEPOST]Но если вся проблема в этом, то можно просто проверять два раза, сначало для первого и второго, потом для второго и первого...
    Или бред несу?
     
  18. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
  19. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    А если как скинул RSC?
     
  20. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Беглый поиск в интернетах дал простое решение, возможно оно эквивалентно тому, что приводили в теме выше.
    http://xdan.ru/how-to-check-intersect-two-rectangles.html (после "UPD").
    Извините, уже лениво разбираться.
     
  21. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Проверил такое, тоже true.
    Cuboid cuboid = new Cuboid(
    234, 10, 107,
    235, 80, 116
    );
    Cuboid cuboid2 = new Cuboid(
    232, 65, 110,
    238, 66, 112
    );
    boolean b = cuboid.intersects(cuboid2);[DOUBLEPOST=1469008206,1469007902][/DOUBLEPOST]Пока что ни одна проверка не проошибила.
     

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