矩形碰撞检测

3
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;
}

正Y轴向上吗?如果是,看起来没问题。 - JasonD
3个回答

5
如果矩形被填充了(即您将其中一个矩形在另一个矩形内部的情况视为碰撞),那么就会发生碰撞。

你的意思是如果它们没有被填充,而且其中一个在另一个内部,那么我的算法就无法工作?它在所有其他情况下都能正常工作吗? - Maria Ines Parnisari
据我所知,是的。同样,第一个问题也是肯定的。 - Boris Strandjev
@l19 - 你的矩形已经被填充了。如果其中一个矩形在另一个矩形内部,那么这将被视为碰撞。如果这正是你想要的,那么一切都很好。只有当这种行为不符合你的期望时,你才需要进行更改。 - Dennis

4

是的。你可以将其视为超平面分离定理的特殊情况,这是此问题的一般版本。你将这些矩形投影到X轴和Y轴上,然后检查结果线段之间是否有一些分离。


0

对我来说,更直观的编写此条件的方式是:

( 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) )

实际上,这可以推广到任何维度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接