Взгляд на это с другого сайта.
Случай оказывается довольно простым, если мы посмотрим на проблему (алгоритм) с другой стороны .
Это означает, что вместо ответа на вопрос: «Прямоугольники перекрываются?», Мы ответим на вопрос: «Действительно ли прямоугольники не перекрываются?».
В конце концов, оба вопроса решают одну и ту же проблему, но ответ на второй вопрос проще реализовать , потому что прямоугольники не перекрываются, только когда один находится под другим или когда один больше слева от другого (достаточно, чтобы один из этих случаев имел место, но, конечно, может случиться, что оба будут происходить одновременно - здесь важно хорошее понимание логического условия "или" важно). Это уменьшает количество случаев, которые необходимо рассмотреть по первому вопросу.
Весь вопрос также упрощен путем использования соответствующих имен переменных :
#include<bits/stdc++.h>
struct Rectangle
{
// Coordinates of the top left corner of the rectangle and width and height
float x, y, width, height;
};
bool areRectanglesOverlap(Rectangle rect1, Rectangle rect2)
{
// Declaration and initialization of local variables
// if x and y are the top left corner of the rectangle
float left1, top1, right1, bottom1, left2, top2, right2, bottom2;
left1 = rect1.x;
top1 = rect1.y;
right1 = rect1.x + rect1.width;
bottom1 = rect1.y - rect1.height;
left2 = rect2.x;
top2 = rect2.y;
right2 = rect2.x + rect2.width;
bottom2 = rect2.y - rect2.height;
// The main part of the algorithm
// The first rectangle is under the second or vice versa
if (top1 < bottom2 || top2 < bottom1)
{
return false;
}
// The first rectangle is to the left of the second or vice versa
if (right1 < left2 || right2 < left1)
{
return false;
}
// Rectangles overlap
return true;
}
Даже , если у нас другое представление прямоугольника, легко адаптировать вышеуказанную функцию к нему, изменяя только раздел, в котором определены изменения переменных. Дальнейшая часть функции остается неизменной (конечно, комментарии здесь на самом деле не нужны, но я добавил их, чтобы все могли быстро понять этот простой алгоритм).
эквивалент , но, возможно, немного менее читабельная форма вышеуказанной функции может выглядеть следующим образом:
bool areRectanglesOverlap(Rectangle rect1, Rectangle rect2)
{
float left1, top1, right1, bottom1, left2, top2, right2, bottom2;
left1 = rect1.x;
top1 = rect1.y;
right1 = rect1.x + rect1.width;
bottom1 = rect1.y - rect1.height;
left2 = rect2.x;
top2 = rect2.y;
right2 = rect2.x + rect2.width;
bottom2 = rect2.y - rect2.height;
return !(top1 < bottom2 || top2 < bottom1 || right1 < left2 || right2 < left1);
}