Почему программа продолжает выводить «Прямоугольники не перекрываются»? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь понять, почему программа продолжает выводить Rectangles Do Not Overlap независимо от вида введенных значений int.

Я пытался исправить свои операторы if в функции isRectangleOverlap(), но все еще дляпо какой-то причине выходные данные остаются прежними.

Прямоугольник представлен в виде списка [x1, y1, x2, y2], где (x1, y1) - координаты его нижнего левого угла, и (x2, y2) - координаты его верхнего правого угла.

Не выводятся следующие примеры:

Пример 1: Ввод: rec1 = [0,0,2,2],rec2 = [1,1,3,3] Выход: перекрытие прямоугольников

Пример 2: Вход: rec1 = [0,0,1,1], rec2 = [1,0,2,1] Выход: Прямоугольники не перекрываются

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

#include <iostream>
#include <vector>
using namespace std;

struct Point{
    int x, y;
};

bool isRectangleOverlap(Point t1, Point b1, Point t2, Point b2){

    if ((t1.x <= t2.x && b2.x <= b1.x) && (t1.y >= t2.y && b2.y >= b1.y)) {
        return true;
    }
    else if ((t2.x <= t1.x && b1.x <= b2.x) && (t2.y >= t1.y && b1.y >= b2.y)) {
        return true;
    }
    else {
        return false;
    }
}

int main() {

    Point top1, top2, bottom1, bottom2;
    cout << "First Top Point: ";
    cin >> top1.x;
    cin >> top1.y;

    cout << endl;

    cout << "First Bottom Point: ";
    cin >> bottom1.x;
    cin >> bottom1.y;

    cout << endl;

    cout << "Second Top Point: ";
    cin >> top2.x;
    cin >> top2.y;

    cout << endl;

    cout << "Second Bottom Point: ";
    cin >> bottom2.x;
    cin >> bottom2.y;

    cout << endl;

    if (isRectangleOverlap(top1, bottom1, top2, bottom2)){
        cout << "Rectangles Overlap" << endl;
    }
    else
    {
        cout << "Rectangles Do Not Overlap" << endl;
    };

    return 0;
}

Я ожидал, что результат будет таким, как указано в примере выше.

1 Ответ

0 голосов
/ 07 ноября 2019

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

#include <iostream>
#include <vector>
using namespace std;

struct Rectangle {
    int x1;
    int y1;
    int x2;
    int y2;
};

bool isOverlap(Rectangle a, Rectangle b)
{
    bool overlap;

    if (b.y1 >= a.y2)
        overlap = false;
    else if (b.x1 >= a.x2)
        overlap = false;
    else if (a.y1 >= b.y2)
        overlap = false;
    else if (a.x1 >= b.x2)
        overlap = false;
    else 
        overlap = true;

    return overlap;
}

void printPoints(Rectangle &rect)
{
    cout << "Rectangle bottom-left: (" << rect.x1 << ", " << rect.y1 << ")" << endl;
    cout << "Rectangle top-right: (" << rect.x2 << ", " << rect.y2 << ")" << endl;
}

void getInput(Rectangle &rect)
{
    cout << "Enter rectangle. x1: "<< endl;
    cin >> rect.x1;
    cout << "Enter rectangle. y1: "<< endl;
    cin >> rect.y1;
    cout << "Enter rectangle. x2: "<< endl;
    cin >> rect.x2;
    cout << "Enter rectangle. y2: "<< endl;
    cin >> rect.y2;
}

void testRectangleOverlap()
{
    Rectangle a;
    Rectangle b;

    getInput(a);
    getInput(b);

    printPoints(a);
    printPoints(b);

    if (isOverlap(a, b)){
        cout << "Rectangles Overlap" << endl;
    }
    else
    {
        cout << "Rectangles Do Not Overlap" << endl;
    }
}

int main() {

    testRectangleOverlap();

    return 0;
}

Здесь вы можете поиграть с кодом: живой код

...