Моя прямоугольника пересекаются рабочий код?


Я просто хочу, чтобы увидеть, если любая часть один "прямоугольник" перекрывает другой. Это правильный код?

 bool checkCollide(int x, int y, int oWidth, int oHeight, int x2, int y2, int o2Width, int o2Height){
    bool collide;
    collide = false;

    if(x >= x2 && x <= x2+o2Width && y >= y2 && y <= y2+o2Height){
        collide = true;
    }

    if(x+oWidth >= x2 && x+oWidth <= x2+o2Width && y >= y2 && y <= y2+o2Height){
        collide = true;
    }

    if(x >= x2 && x<= x2+o2Width && y+oHeight >= y2 && y+oHeight <= y2+o2Height){
        collide = true;
    }

    if(x+oWidth >= x2 && x+oWidth <= x2+o2Width && y+oHeight >= y2 && y+oHeight <= y2+o2Height){
        collide = true;
    }   
    return collide;
}


1588
4
c++
задан 21 мая 2011 в 03:05 Источник Поделиться
Комментарии
3 ответа

Нет, это не правильно; она только проверяет, является ли вершины одного прямоугольника внутри другого, а не наоборот. Попробуйте позвонить его со следующими параметрами:

checkCollide(2,2,4,4, 1,3,2,2);
checkCollide(1,3,2,2, 2,2,4,4);

Они должны печатать один и тот же результат, но они не. В этом случае можно увидеть на рисунке ниже.enter image description here

Обновление: даже если вы повторите проверяет изменение х/Х2, г/У2, и т. д., Это все равно не поймать все случаи: два прямоугольники могут пересекаться, даже если никто их вершины находятся внутри другого прямоугольника - см. картинку ниже.

enter image description here

Более универсального решения должны использовать пересечение рутинную сегмент, чтобы проверить, для всех ли сегментов в один прямоугольник, являются ли они пересекаются с любой отрезков на другой.

8
ответ дан 21 мая 2011 в 10:05 Источник Поделиться

Кроме того, правильность кода, так как это сайт комментарий код я также хочу заметить, что он может быть переписан, чтобы сделать его более читабельным. Я бы сказал, что ваш код (что неверно, см. Мой другой ответ), будет легче понять, если вы были явные о намерениях каждого, если заявление (т. е. это точка внутри прямоугольника). Ниже это версия кода, который ИМО гораздо более читабельным (и, случается, меньше).

    bool isInside(int pointX, int pointY, int rectX, int rectY, int rectWidth, int rectHeight)
{
return
(rectX <= pointX && pointX <= rectX + rectWidth) &&
(rectY <= pointY && pointY <= rectY + rectHeight);
}

bool checkCollide(int x, int y, int oWidth, int oHeight, int x2, int y2, int o2Width, int o2Height)
{
bool collide =
isInside(x, y, x2, y2, x2 + o2Width, y2 + o2Height) ||
isInside(x + oWidth, y, x2, y2, x2 + o2Width, y2 + o2Height) ||
isInside(x, y + oHeight, x2, y2, x2 + o2Width, y2 + o2Height) ||
isInside(x + oWidth, y + oHeight, x2, y2, x2 + o2Width, y2 + o2Height);

return collide;
}

3
ответ дан 21 мая 2011 в 11:05 Источник Поделиться

Во-первых, я предлагаю использовать Вильный структур/объектов прямоугольников, а затем пройдя целую кучу параметров.

Во-вторых, алгоритм проще то, что.

Представьте проблему в 1Д. Вы хотите знать, являются ли две линии сталкиваются:

----------------------------|
|----------------------------

Линии сталкиваться, если второй начинается после первого начинается, и первый начинается после Второй начинается.

Для того чтобы проверить для 2D столкновения просто проверить на столкновения 1D в обоих X и y. Если они оба сталкиваются, так что прямоугольники.

1
ответ дан 22 мая 2011 в 10:05 Источник Поделиться