2011-06-02 176 views
3

找出一个轴对齐的矩形是否与一个旋转的矩形发生碰撞,最有效的方法是什么?每个类都有一个位置矢量和一个大小矢量,旋转的类有一个角度值。旋转矩形碰撞

+0

你正在寻找的重叠,还是一个真正有关联的速度它? – phkahler 2011-06-02 17:16:15

+0

只是静态重叠。 – Matt 2011-06-02 17:22:15

回答

5

你想使用分离轴定理(SAT)。通常它用在3d中,但它很好地折叠到2d。既然你已经有了一个特殊的情况下,你需要考虑的唯一轴线是你的矩形的4个主要轴线:

 
[ 1,0 ] 
[ 0,1 ] 
[ sin(theta), cos(theta) ] 
[ -cos(theta), sin(theta) ] 

要检查一个轴,计算与轴每个顶点的点积。然后检查两组值的最小值和最大值,看它们是否重叠。如果4轴中的任何一个给出不重叠的范围,则矩形不重叠(您已经找到了分离轴)。如果所有4轴都显示重叠,则矩形相交。

这里有一个同样的问题最近SO问题: Separating Axis Theorem and Python

这里是维基百科的文章

http://en.wikipedia.org/wiki/Separating_axis_theorem

3

最有效的方法是创建一个更大的矩形,它限制旋转的矩形,并基于边界矩形执行碰撞检测。

这意味着边界矩形冲突并不表示“点击”,而是需要进一步调查的条件。调查手段根据您可以做出的假设而有所不同。在最简单的情况下,您可以使用AND像素检查真实输出。

然后,您可以使用此“已确认”命中以更复杂的模型进行分析;考虑到碰撞的角度,速度,几何形状和弹性(或者你感兴趣的任何东西)。

存在更复杂的模型,但通常更复杂的模型需要更多的计算能力。通过设置一系列快速,快速的检查来节省您的计算能力会更容易,并且只会为需要付清的情况带来沉重的计算周期。

+0

-1仅提及优化并忽略了基本功能(例如,您不会提到测试是否在另一个矩形中包含了一个矩形的顶点)。 – finnw 2011-06-02 17:22:24

+0

实际上,这只是一个“快速检查”,以避免更昂贵的分析适用(请阅读帖子的后半部分)。因此+1 – ignis 2011-06-02 17:26:48

+1

这里没有给出实际的解决方案。 – phkahler 2011-06-02 17:41:47