2013-01-10 115 views
0

这是一个编程问题比技术问题更多,但由于它涉及到编程和数学,我希望得到一些有用的反馈。矩形碰撞

我有两个矩形:rectangle1rectangle2

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

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将在这种情况下,接近或等于)

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

而且,在它被提及之前,这不是作业,而是我想为我的游戏解决的一个真正的问题。

+1

您可以通过查看一个开源库,比如Box2D的学到很多东西:http://code.google.com/p/box2d/。 – DuckMaestro

+0

如果矩形具有速度,这可能对检查方向更有用 –

+0

由于矩形与轴很好地平行,因此可以使用[确定两个日期范围是否重叠]中描述的重叠检测技术(http://stackoverflow.com/a/328558/15168)在x方向和y方向中的每一个上。对于你的情况,每个矩形上通常会有两边重叠。 (是的,即使该问题询问时间重叠,这些方法也适用于简单的空间重叠。) –

回答

1

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

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

情况1:矩形完全或部分在另一个内部。无论哪种情况,都要继续扩展连接中心的线,直到穿过外部(包含)矩形。如果您再次穿过包含的矩形,只需将击中的脸部更改为新交叉的脸部即可。

希望这不是太混乱了:)