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

Algorithm 如何找到两个矩形的碰撞中心?矩形可以旋转,algorithm,math,polygon,Algorithm,Math,Polygon,我刚刚使用SAT和作为我实现的参考实现了碰撞检测。检测按预期工作,但我需要知道两个矩形碰撞的位置 我需要找到交点的中心,上面图像上的黑点(但我也没有交点区域)。我找到了一些关于这方面的文章,但它们都涉及避免重叠或某种速度,我不需要这些 关于矩形的信息是代表它们的四个点,右上,左上,右下和左下坐标。我正试图找到一个算法,可以给我这些点的交点 我只需要在上面放一张图片。就像两辆汽车相撞一样,我在碰撞中心上方放了一张图片。有什么想法吗?这是个棘手的问题,因为不规则多边形没有确定的中心。由于多边形(

我刚刚使用SAT和作为我实现的参考实现了碰撞检测。检测按预期工作,但我需要知道两个矩形碰撞的位置


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

关于矩形的信息是代表它们的四个点,
右上
左上
右下
左下
坐标。我正试图找到一个算法,可以给我这些点的交点


我只需要在上面放一张图片。就像两辆汽车相撞一样,我在碰撞中心上方放了一张图片。有什么想法吗?

这是个棘手的问题,因为不规则多边形没有确定的中心。由于多边形(在矩形的情况下)保证是凸的,因此您可能会找到包含碰撞的多边形的角点(可能包括原始形状的角点或边的交点),并对它们进行平均以获得。。。某物它可能会模糊地接近你期望的“中心”,而对于正多边形,它可能会精确匹配,但它在数学上是否意味着什么,则有点不同

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

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

(0.225, -0.45):   Average of corners of G
(0.2077, -0.473): Average of weighted corners of G
多边形的加权角点定义为角点坐标,由角点角度的sin加权

该多边形有两个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更接近3边形,则会出现显著偏差。

如果不需要知道区域的实际坐标,可以制作两个帧为矩形的
CALayer
并使用一个来遮罩另一个。然后,如果设置im在被遮罩的框中,它只会显示在它们重叠的区域。

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

一旦你有了交叉点,你可能对这些点的平均值或者给定一个特定方向的中心没有意见。中间部分在这个问题上有点模糊


编辑:除此之外,您还需要计算两个矩形中任何一个的角是否在另一个矩形内(这应该很容易计算,即使是从交点处)。在计算“平均值”时,这应该与交点一起添加中心点。

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

创建以下函数:

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做同样的事情。下面是这个方法的一个示例:


获取交点中心的一种可能方法是构造Minkowski差分并查看点(0,0)。这适用于任意多边形,但对于您的问题来说可能过于复杂。请看一下这一点。(特别是中有关Minkowski差分的部分。)对不起,我不能提供具体帮助,我现在时间很紧。如果我理解正确的话。闵可夫斯基差异(或GJK算法)将告诉我多边形是否发生碰撞。它在哪里告诉我碰撞点?按照我的阅读方式,他要求的是整个区域,而不仅仅是中心点。如果是这种情况,第一个插图是误导性的。>我需要找到交点的中心,上图中的黑点。啊,在这种情况下,我误解了问题。实际上我需要中心点(或接近中心点的东西)但是我没有交集区域。目前我只有每个矩形的四个点,我知道它们是否碰撞。做一些数学来计算交集点,然后用一些逻辑来计算哪些点是交集区域的边界。有没有办法确定交集的中心ping区域,以便告诉CALayer将图像放置在何处?这似乎是迄今为止最好的方法,因为我不需要太多的精度。我会尝试一下并让您知道。如果第一步的值没有找到任何点,我只需再尝试一点:if(points==0)searchAgainWithStep(1)我使用PNPOLY作为IsPointInsideRectangle函数:PNPOLY的东西很好。很高兴你的问题解决了,这是一个有趣的问题!你的解释和绘图真的很有帮助。非常感谢。我希望我能多投票几次你的答案:)