如何找到两个矩形的碰撞中心?可以旋转矩形

时间:2012-10-02 21:09:39

标签: algorithm math polygon

我刚刚使用SAT和this article实现了碰撞检测,作为我实现的参考。检测按预期工作,但我需要知道两个矩形在哪里发生碰撞。

I need the center of the intersection More examples

我需要找到交叉点的中心,上面图像上的黑点(但我没有交叉区域)。我发现了一些关于此的文章,但它们都涉及避免重叠或某种速度,我不需要这个。

我对矩形的信息是代表它们的四个点,upper rightupper leftlower rightlower left坐标。我正在尝试找到一种算法,可以给我这些点的交集。

我只需要在它上面放一个图像。就像两辆车坠毁所以我把图像放在碰撞中心的顶部。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您需要使用线对线交点方程/算法来对框的边界进行交叉。

http://en.wikipedia.org/wiki/Line-line_intersection

一旦你获得了交叉点,你可能会对这些点的平均值或者给定特定方向的中心感到满意。中间问题有点模糊。

编辑:除此之外,如果两个矩形中任何一个角落的任何一个角落在另一个角落里面,你需要弄清楚(这应该很容易解决,甚至从交叉点开始)。在计算“平均”中心点时,应将其与交叉点相加。

答案 1 :(得分:3)

还有另一种方法:通过采样点找到碰撞区域的质心。

创建以下功能:

bool IsPointInsideRectangle(Rectangle r, Point p);

将搜索矩形定义为:

TopLeft = (MIN(x), MAX(y))
TopRight = (MAX(x), MAX(y))
LowerLeft = (MIN(x), MIN(y))
LowerRight = (MAX(x), MIN(y))

其中x和y是两个矩形的坐标。

现在,您将定义一个将搜索区域划分为网格的步骤。我建议你使用AVG(W,H)/ 2,其中W和H是搜索区域的宽度和高度。

然后,如果它位于碰撞区域内,则迭代每个网格点的发现:

IsPointInsideRectangle(rectangle1, point) AND IsPointInsideRectangle(rectangle2, point) 

定义:

Xi : the ith partition of the mesh in X axis.
CXi: the count of mesh points that are inside the collision area for Xi.

然后:

enter image description here

你可以用Y做同样的事情。以下是这种方法的一个示例:

enter image description here

答案 2 :(得分:2)

这个很棘手,因为不规则多边形没有明确的中心。由于您的多边形(在矩形的情况下)保证是凸的,您可以找到构成碰撞的多边形的角(可以包括原始形状的角或边的交点)并将它们平均得到。某事它可能会模糊地接近你期望“中心”的位置,而对于普通多边形,它可能会完全匹配,但它是否意味着任何数学上的东西都是一个不同的故事。

我一直在数学上摆弄并提出以下内容,它解决了点出现和消失时的平滑问题(当撞击框的移动导致矩形变成三角形时或反之亦然)。如果没有这些额外的内容,添加和删除角将导致质心跳跃。

Here, take this fooplot.

该图显示了2个矩形,R和B(红色和蓝色)。交叉点扫出区域G(绿色)。未加权和加权中心(均为紫色)通过以下方法计算:

(0.225, -0.45):   Average of corners of G
(0.2077, -0.473): Average of weighted corners of G

多边形的加权角被定义为角的坐标,由角的角度加权。

该多边形具有两个90度角,一个59.03度角和一个120.96度角。 (两个非直角都有相同的正弦,sin(Ɵ)= 0.8574929 ......

因此加权中心的坐标为:

( (sin(Ɵ) * (0.3 + 0.6) + 1 - 1)   / (2 + 2 * sin(Ɵ)),  // x
  (sin(Ɵ) * (1.3 - 1.6) + 0 - 1.5) / (2 + 2 * sin(Ɵ)) ) // y
= (0.2077, -0.473)

使用提供的示例,差异不是很明显,但如果4gon更接近3gon,则会有明显的偏差。

答案 3 :(得分:0)

如果您不需要知道该区域的实际坐标,您可以制作两个CALayer,其框架为矩形,并使用一个来掩盖另一个。然后,如果您在被屏蔽的图像中设置图像,它将仅显示在它们重叠的区域中。