Проверьте, перекрываются ли два прямоугольника в Java

Проверьте, перекрываются ли два прямоугольника в Java

1. обзор

В этом кратком руководстве мы научимся решать алгоритмическую задачу проверки того, перекрываются ли два заданных прямоугольника.

Мы начнем с определения проблемы, а затем постепенно найдем решение.

Наконец, мы реализуем его на Java.

2. Определение проблемы

Допустим, у нас есть два заданных прямоугольника -r1 иr2. Нам нужно проверить, есть ли хотя бы одна общая точка междуr1 иr2. Если да, это просто означает, что эти два прямоугольника перекрываются.

Давайте посмотрим на несколько примеров:

image

Если мы обратим внимание на самый последний случай, прямоугольникиr1 иr2 не имеют пересекающихся границ. Тем не менее, они перекрывают прямоугольники, поскольку каждая точка вr1 также является точкой вr2.

3. Начальная настройка

Чтобы решить эту проблему, мы должны начать с определения прямоугольника программно. A rectangle can be easily represented by its bottom-left and top-right coordinates:с

public class Rectangle {
    private Point bottomLeft;
    private Point topRight;

    //constructor, getters and setters

    boolean isOverlapping(Rectangle other) {
        ...
    }
}

гдеPoint - класс, представляющий точку(x,y) в пространстве:

public class Point {
    private int x;
    private int y;

    //constructor, getters and setters
}

Позже мы определим методisOverlapping(Rectangle other) в нашем классеRectangle, чтобы проверить, не перекрывается ли он с другим заданным прямоугольником -other.

4. Решение

Выполняется дваgiven rectangles won’t overlap if любого из следующих условий:

  1. Один из двух прямоугольников находится над верхним краем другого прямоугольника

  2. Один из двух прямоугольников находится на левой стороне левого края другого прямоугольника

image

Во всех остальных случаях два прямоугольника будут перекрываться друг с другом. Чтобы убедить себя, мы всегда можем привести несколько примеров.

5. Реализация Java

Теперь, когда мы понимаем решение, давайте реализуем наш методisOverlapping():

public boolean isOverlapping(Rectangle other) {
    if (this.topRight.getY() < other.bottomLeft.getY()
      || this.bottomLeft.getY() > other.topRight.getY()) {
        return false;
    }
    if (this.topRight.getX() < other.bottomLeft.getX()
      || this.bottomLeft.getX() > other.topRight.getX()) {
        return false;
    }
    return true;
}

Наш методisOverlapping() в классеRectangle возвращаетfalse, если один из прямоугольников находится выше или слева от другого, в противном случае -true.

Чтобы узнать, находится ли один прямоугольник над другим, мы сравниваем ихy-coordinates. Точно так же мы сравниваемx-coordinates, чтобы проверить, находится ли один прямоугольник слева от другого.

6. Заключение

В этой короткой статье мы узнали, как решить алгоритмическую проблему нахождения, перекрывают ли два данных прямоугольника друг с другом. Он служит стратегией обнаружения столкновений для двух прямоугольных объектов.

Как обычно доступен весь исходный кодover on Github.