0

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

我有两个矩形:rectangle1rectangle2

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

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

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

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

矩形2是:

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

当发生碰撞时,我试图使用八个浮点值来确定矩形 1 的哪一侧撞到了矩形 2 的哪一侧。

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

矩形 1 的右侧命中矩形 2 的左侧

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

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)如果多个矩形堆叠在一起,计算会产生奇怪的结果(即,即使矩形1在右上方向移动并且应该击中左侧的两个矩形,它实际上可能会击中左侧的一个矩形底部和左侧的另一个。)

(这是因为到达碰撞代码时矩形重叠,并且在这种情况下距离 1 和距离 4 将接近或相等。)

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

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

4

1 回答 1

1

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

当它们重叠时,您可以获得 1 或 0 个交点。案例0:1个矩形完全在另一个矩形内,因此您可以决定如何确定要击中哪些边,可以选择最靠近每个中心的一个。

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

希望它不会太混乱:)

于 2013-01-10T00:30:42.427 回答