Рубрики
Без рубрики

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

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

Автор оригинала: Shubhra Srivastava.

1. Обзор

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

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

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

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

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

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

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

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

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

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

    //constructor, getters and setters

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

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

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

    //constructor, getters and setters
}

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

4. Решение

Два заданных прямоугольника не будут перекрываться, если выполняется одно из приведенных ниже условий:

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

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

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

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

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-координаты . Аналогично, мы сравниваем x-координаты , чтобы проверить, находится ли один прямоугольник слева от другого.

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

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

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