Тест, который проверяет, находится ли красный прямоугольник полностью снаружи синий прямоугольник выглядит следующим образом
bool outside =
redBotX > blueTopX || redTopX < blueBotX ||
redBotY > blueTopY || redTopY < blueBotY;
Теперь, отрицание этого скажет вам, пересекает ли красный прямоугольник синий прямоугольник
bool intersects =
!(redBotX > blueTopX || redTopX < blueBotX ||
redBotY > blueTopY || redTopY < blueBotY);
Если хотите, вы можете применить правило Де Моргана и переписать его как
bool intersects =
redBotX <= blueTopX && redTopX >= blueBotX &&
redBotY <= blueTopY && redTopY >= blueBotY;
Конечно, в приведенных выше тестах предполагается, что координаты "нормализованы *, т.е.
assert(redBotX <= redTopX && redBotY <= redTopY);
assert(blueBotX <= blueTopX && blueBotY <= blueTopY);
Кроме того, сравнение может быть строгим или не строгим в зависимости от того, считаете ли вы касание прямоугольников пересекающимися или нет.
РЕДАКТИРОВАТЬ: Я вижу, что вы используете другое соглашение для координат прямоугольника: Top
является нижней координатой и Bot
является более высокой, т.е.
assert(redTopX <= redBotX && redTopY <= redBotY);
assert(blueTopX <= blueBotX && blueTopY <= blueBotY);
Для обработки этого случая вам просто нужно поменять координаты Bot
и Top
при любых условиях. Например, последний теперь будет выглядеть следующим образом
bool intersects =
redTopX <= blueBotX && redBotX >= blueTopX &&
redTopY <= blueBotY && redBotY >= blueTopY;