矩形碰撞

时间:2013-01-10 00:02:08

标签: c++ math collision-detection

这是一个编程问题而不是技术问题,但由于它与编程和数学有关,我希望得到一些有用的反馈。

我有两个矩形: rectangle1 rectangle2

两者都由四个浮点值定义:

float left;
float right;
float top;
float bottom;

为了这个例子,假设每个矩形是100 x 100,而rectangle1是:

float left = 100.0;
float right = 200.0;
float top = 500.0;
float bottom = 600.0;

而rectangle2是:

float left = 150.0;
float right = 250.0;
float top = 550.0;
float bottom = 650.0;

当发生碰撞时,我试图确定rectangle1的哪一侧使用八个浮点值命中了rectangle2的哪一侧。

如果我的问题得到解答,我可能会在发生碰撞时确定以下内容:

rectangle1的右侧命中rectangle2的左侧

到目前为止,我尝试使用简单的数学来确定每种可能性之间的距离:

float distance1 = rectangle2.left - rectangle1.right;
float distance2 = rectangle2.top - rectangle1.bottom;
float distance3 = rectangle2.right - rectangle1.left;
float distance4 = rectangle2.bottom - rectangle1.top;

然后取这些值的最小值来确定每个矩形的哪一侧涉及碰撞。但这似乎并不那么简单。这次尝试有两个基本问题:

1)到达碰撞代码时,矩形已经重叠。

2)如果多个矩形堆叠在一起,计算将产生奇怪的结果(即,即使rectangle1在右上方向移动,也应该击中左边的两个矩形实际上,它可能实际上击中了底部的一个矩形而另一个则位于左侧。)

(这是因为当达到碰撞代码时矩形重叠,因为在这种情况下distance1和distance4将接近或相等。)

使用简单的数学有没有更好的方法来回答这个问题?任何帮助将不胜感激。

而且,在提到之前,这不是家庭作业,而是我试图为我的游戏解决的一个真正的问题。

1 个答案:

答案 0 :(得分:1)

如果可以正确识别碰撞,则确定面绘制一条连接2个矩形中心的线,并检查每个矩形面的交点。在任何给定时间,只要2个矩形不重叠或者不精确,只要1的中心不在另一个的内部,该线就会与2个面相交。

当它们重叠时,您可以得到1或0个交点。 case 0:1矩形完全在另一个内部,因此您可以决定如何决定哪些边撞击,可以选择距离每个中心最近的一个。

案例1:矩形完全或部分位于另一个内部。在任何一种情况下,继续扩展连接中心的线,直到穿过外部(包含)矩形。如果您再次穿过包含的矩形,只需将命中面更改为新交叉的面。

希望它不要太混乱:)。