Обнаружение прямоугольных столкновений

class Rectangle{
public:
float x, y, width, height;
// (x,y) is the lower left corner of the rectangle
};

Этот алгоритм правильный?

bool Rectangle::colidesWith(Rectangle other) {
if (x+width < other.x) return false; // "other" is on the far right
if (other.x+other.width < x) return false; //"other" is on the far left
if (y+height < other.y) return false // "other" is up
if (other.y+other.height < y) return false // "other" is down
return true;
}

3

Решение

Это если прямоугольники заполнены (т. Е. В качестве столкновения считается случай, когда один из них находится внутри другого).

5

Другие решения

Ага. Вы можете рассматривать это как частный случай теоремы о разделении гиперплоскости, которая является общей версией этой проблемы. Вы проецируете эти прямоугольники на оси X и Y и затем проверяете, что получающиеся отрезки линий имеют некоторое разделение между ними.

4

Для меня более интуитивный способ написания этого условия:

( max(r1.x, r2.x) < min(r1.x+r1.w, r2.x+r2.w) ) &&
( max(r1.y, r2.y) < min(r1.y+r1.h, r2.y+r2.h) )

И на самом деле это может быть обобщено на любую размерность.

0
По вопросам рекламы [email protected]