我刚刚使用SAT和this article实现了碰撞检测,作为我实现的参考。检测按预期工作,但我需要知道两个矩形在哪里发生碰撞。
我需要找到交叉点的中心,上面图像上的黑点(但我没有交叉区域)。我发现了一些关于此的文章,但它们都涉及避免重叠或某种速度,我不需要这个。
我对矩形的信息是代表它们的四个点,upper right
,upper left
,lower right
和lower left
坐标。我正在尝试找到一种算法,可以给我这些点的交集。
我只需要在它上面放一个图像。就像两辆车坠毁所以我把图像放在碰撞中心的顶部。有什么想法吗?
答案 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.
然后:
你可以用Y做同样的事情。以下是这种方法的一个示例:
答案 2 :(得分:2)
这个很棘手,因为不规则多边形没有明确的中心。由于您的多边形(在矩形的情况下)保证是凸的,您可以找到构成碰撞的多边形的角(可以包括原始形状的角或边的交点)并将它们平均得到。某事它可能会模糊地接近你期望“中心”的位置,而对于普通多边形,它可能会完全匹配,但它是否意味着任何数学上的东西都是一个不同的故事。
我一直在数学上摆弄并提出以下内容,它解决了点出现和消失时的平滑问题(当撞击框的移动导致矩形变成三角形时或反之亦然)。如果没有这些额外的内容,添加和删除角将导致质心跳跃。
该图显示了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
,其框架为矩形,并使用一个来掩盖另一个。然后,如果您在被屏蔽的图像中设置图像,它将仅显示在它们重叠的区域中。