.

Статус
Закрыто для дальнейших ответов.
Речь только про прямоугольные параллелепипеды, или ещё и про полигонные регионы тоже?
 
А как Location преоброзовать в AABB то?..
Но я конечно до сих пор надеюсь на более легкий способ..
Я нашел решение без AABB.

Java:
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;
    }
}
 
Речь только про прямоугольные параллелепипеды, или ещё и про полигонные регионы тоже?
Секундочку, я сейчас загуглю все непонятные слова, а потом отвечу.. :D
Я нашел решение без AABB.

Java:
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;
    }
}
Ухтышка, кажется годнота!!!
Спасибо большое, протестирую потом!!
 
А что, Math.min(...) и Math.max(...) уже отменили? :)
 
Речь только про прямоугольные параллелепипеды, или ещё и про полигонные регионы тоже?
Загуглил. И в общем речь только про прямоугольные параллелепипеды (где можно получить медаль за что я это слово сам написал, а не скопировал? :D)! А точнее только про две локации которые сораняються как границы региона (Ну как и в WE/WG там же тоже выделяешь две локации. Вот у меня тоже самое!)!
А что, Math.min(...) и Math.max(...) уже отменили? :)
Ох, главное чтоб оно работало, на это я уже поизменять сам смогу)
 
Загуглил. И в общем речь только про прямоугольные параллелепипеды (где можно получить медаль за что я это слово сам написал, а не скопировал? :D)! А точнее только про две локации которые сораняються как границы региона (Ну как и в WE/WG там же тоже выделяешь две локации. Вот у меня тоже самое!)!

Ох, главное чтоб оно работало, на это я уже поизменять сам смогу)
Да работает оно. Проверяет 2 кубоида и точку внутри кубоида.
 
Я нашел решение без AABB.

Java:
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;
    }
}
Это и есть AABB, только сделан очень костыльно.
 
Я переделаль вот так:
Код:
    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()!
Это и есть AABB, только сделан очень костыльно.
Зато это могу понять даже я :D
 
Я переделаль вот так:
Код:
    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
Bozhe, kakiye govnoedy, poidu molitsya emu: https://en.wikipedia.org/wiki/James_Gosling
 
Последнее редактирование:
Я переделаль вот так:
Код:
    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
Ты только все запутал.

Cuboid cuboid = new Cuboid(
loc1.getBlockX(),loc1.getBlockY(),loc1.getBlockZ(),
loc2.getBlockX(),loc2.getBlockY(),loc2.getBlockZ()
);
cuboid.intersects(cuboid2);
 
А если ни одна угловая точка любого региона не лежит внутри второго? ))
 
Ты только все запутал.

Cuboid cuboid = new Cuboid(
loc1.getBlockX(),loc1.getBlockY(),loc1.getBlockZ(),
loc2.getBlockX(),loc2.getBlockY(),loc2.getBlockZ()
);
cuboid.intersects(cuboid2);
Я хз, создавать отдельный клас...
А если ни одна угловая точка любого региона не лежит внутри второго? ))
Пытаюсь понять как это может быть, но пока-что не могу..
По идее, если не одна угловая точка не лежит внутри второго то они и не пересекаются?
Или я не прав?
(Ну блин, я спал на геометрии :oops::oops::cry:)
А если ни одна угловая точка любого региона не лежит внутри второго? ))
Хотя я понял, по идее, это возожно, если первый регион больше второго, и тогда не одна его угловая точка не лежит внутри второго... Я прав?
Но если вся проблема в этом, то можно просто проверять два раза, сначало для первого и второго, потом для второго и первого...
Или бред несу?
 
Беглый поиск в интернетах дал простое решение, возможно оно эквивалентно тому, что приводили в теме выше.
http://xdan.ru/how-to-check-intersect-two-rectangles.html (после "UPD").
Извините, уже лениво разбираться.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх