Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

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

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

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

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

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

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

./32c609a0e150fedd20f28a7a6f5e2f6e.png

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

3. Первоначальная настройка

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

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. Решение

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

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

./992954cf5498e81be7987a19e9904eff.png

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

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

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

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

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