Автор оригинала: 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. Решение
Два заданных прямоугольника не будут перекрываться, если выполняется одно из приведенных ниже условий:
- Один из двух прямоугольников находится над верхним краем другого прямоугольника
- Один из двух прямоугольников находится на левой стороне левого края другого прямоугольника
Во всех остальных случаях два прямоугольника будут перекрываться друг с другом. Чтобы убедить себя, мы всегда можем привести несколько примеров.
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.