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

#c #geometry

#c #геометрия

Вопрос:

В качестве онлайн-графика я использовал: https://www.khanacademy.org/computer-programming/spin-off-of-rectx-y-width-height-radius/4975791745220608

Координаты прямоугольника:

прямоугольник 1: x: 180 y: 30

прямоугольник 2: x: 160 y: 30

Я заметил, что рендеринг начинается с точки и увеличивается по оси X по ширине, а по оси Y — по высоте. Итак, я вывел следующие вещи: x1 и y1 равны координатам прямоугольника (x1 и y1 — верхний левый угол), а x2, y2 — нижний правый угол / координаты, которые равны сумме квадратных координат или, другими словами, x1 и y1, а также ширине и высоте квадрата.

Это код, который я сделал:

 #include <stdio.h>
#include <iostream>

struct A
{
    int x1, x2;
    int y1, y2;
};

struct B 
{
    int x1, x2;
    int y1, y2;
};

bool doOverlap(A a, B b)
{
    if (a.x1 < b.x2 amp;amp; a.x2 > b.x1 amp;amp;
        a.y1 > b.y2 amp;amp; a.y2 < b.y1)
        return true;

    return false;
}

int main()
{
    /* 
        Rectangle 1 coords: X: 180 Y: 30
        Rectangle 2 coords: X: 160 Y: 30
    */
    
    A a;
    B b;

    /* 
        The render begins from top left corner (that's our center and
        from here begins the render with  width on x and  heigth on y
        (correct me in case i'm wrong but that's what i noticed: https://imgur.com/a/nZKBB0m
        (as can you see in that photo, the white rectangle has l1: (x,y): 0 0)

        rectangles are 40x40
    */
    a.x1 = 180;
    a.y1 = 30;
    a.x2 = a.x1   40;
    a.y2 = a.y1   40;

    b.x1 = 160;
    b.y1 = 30;
    b.x2 = b.x1   40;
    b.y2 = b.y1   40;

    if (doOverlap(a, b))
    {
        std::cout << "y";
    }
    else
        std::cout << "n";
   
    return 0;
}
  

Проблема в том, что он всегда возвращает false (проверил много кодов, но ни один из них, похоже, не работает)
Итак, что я делаю не так?

Ответ №1:

Вы только проверяете, находится ли a выше над b, а затем проверяете, находится ли a слева от b. Вам нужно проверить, перекрываются ли интервалы x для a и b, а затем проверить, перекрываются ли интервалы y. Вот способ сделать это:

 bool doOverlap(A a, B b)
{
    if (a.x1 > b.x2 || b.x1 > a.x2)
        return false;
    if (a.y1 > b.y2 || b.y1 > a.y2)
        return false;
    return true;
}
  

Первый if проверяет, перекрываются ли интервалы x для a и b, и возвращает false, если они этого не делают. Второй делает то же самое для интервалов y. Если оба интервала x и y перекрываются, прямоугольники перекрываются