这是一个编程问题比技术问题更多,但由于它涉及到编程和数学,我希望得到一些有用的反馈。矩形碰撞
我有两个矩形:rectangle1和rectangle2。
两者都是由四个浮点值定义:
float left;
float right;
float top;
float bottom;
对于此示例的目的,说每个矩形是100×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;
当发生碰撞时,我试图确定矩形1的哪一侧碰到哪一侧矩形2使用八个浮点值。
如果我的问题得到回答,我也许能够确定的东西,如当碰撞发生时以下几点:
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;
然后取最小这些值,以确定哪些每个矩形的边被卷入在共llision。不过,这似乎并不那么简单。这次尝试有两个基本问题:
1)到达碰撞代码时,矩形已经重叠。
2)如果多个矩形堆叠在一起,计算会产生奇怪的结果(即,即使矩形1向右上方移动并且应该撞击左侧的两个矩形,也可能会实际上打在底部有一个矩形,而另一个在左侧。)
(这是因为当达到碰撞代码时的矩形是重叠的并且由于距离1和距离4将在这种情况下,接近或等于)
有没有更好的方法来使用简单的数学来回答这个问题?任何帮助,将不胜感激。
而且,在它被提及之前,这不是作业,而是我想为我的游戏解决的一个真正的问题。
您可以通过查看一个开源库,比如Box2D的学到很多东西:http://code.google.com/p/box2d/。 – DuckMaestro
如果矩形具有速度,这可能对检查方向更有用 –
由于矩形与轴很好地平行,因此可以使用[确定两个日期范围是否重叠]中描述的重叠检测技术(http://stackoverflow.com/a/328558/15168)在x方向和y方向中的每一个上。对于你的情况,每个矩形上通常会有两边重叠。 (是的,即使该问题询问时间重叠,这些方法也适用于简单的空间重叠。) –