2013-04-05 148 views
2

我想检测圆形与矩形之间的碰撞,但不知道如何。圆形与矩形之间的碰撞

我知道如何检测圆之间碰撞利用勾股定理这是圈:

(X2 - X1)^ 2 +(Y2 - Y1)^ 2 - (R2 + R1),但什么是用C或C++编程语言检测圆形和矩形形状之间的碰撞的数学运算。

+0

也许你想测试多边形之间的碰撞,而不是? ;) – Shark 2013-04-05 11:52:32

+0

你尝试了什么?你有没有发现*可能是检测这一部分的任何测试? – unwind 2013-04-05 11:52:43

+0

鲨鱼多边形也将是有用的,但我不知道如何 - 放松,为什么我要求帮助,因为我不知道从哪里开始 – 2013-04-05 11:53:52

回答

7

在碰撞检测中,首先检测简单物体之间的碰撞然后专用于更复杂的物体通常是有益的。这被称为宽相和窄相碰撞检测。我们的想法是,使用更简单的算法来排除冲突首先会使对象更快速,因为对象可以被证明不会发生碰撞。

您可以将所有对象初始建模为包含可能更复杂真实形状的圆或框。如果您发现这些物体正在碰撞,那么您可以使用更复杂的算法来检查碰撞。

众所周知,对于所有的凸物体,如果两个物体没有碰撞,那么你可以在它们之间找到一个平面。这被称为分离轴定理。既然圆和方形都是凸的,你可以用它设计一个算法来检测它们之间的冲突。

您可以先搜索简单的平面,例如平行于正方形边缘的平面和那些与圆相切的平面。一个不错的选择是与物体的两个中心之间的直线上的圆相切的平面,接着是圆的中心与每个角之间的直线。

一旦你找到了一个分离平面的对象不能碰撞,你可以停止搜索。

希望这会有所帮助。

(此应用的一个非常详细的说明可以在这里找到:http://www.metanetsoftware.com/technique/tutorialA.html#section1

1

一种解决方案是将矩形变成四个线段,然后测试它们的交点。

在伪码:

for line in line-segments(rectangle) 
    if line.end1 inside circle or line.end2 inside circle 
     return true 
    if line intersects circle 
     return true 
return false 

这给出了两种类型的测试:在圆

  1. 点 - 这是简单的,从圆
  2. 线的中心的距离与一个圆的交点 - 这是更复杂一点(example
+0

我只是想要一些算法/数学公式来检测圆和矩形的碰撞 – 2013-04-05 12:03:22

+0

@annaSjolvikaz,我相信上面就是这样 - 它显示如何检测一个圆是否与一个矩形相交。 – 2013-04-05 13:12:30

3

的圆相交的矩形,如果圆的中心是矩形从圆的中心的距离内,或者如果到矩形边界上的最近点小于圆的半径。有九种可能性相对矩形圆的中心的位置,不同的地方在于它相对于它的扩展方面:

A|B|C 
-+-+- 
D|E|F 
-+-+- 
G|H|I 

如果E,明确了圆形和矩形相交。在A, C, G, I的情况下,您需要测试到最近角落的距离。在剩余的情况下,使用从圆心到最近边的点线距离。

+2

+1。注意:您的答案的第一句未能涵盖案例E(想象一个大矩形内的小圆圈)。 – 2013-04-05 12:08:44

+0

@KlasLindbäck更正,谢谢。 – ecatmur 2013-04-05 12:35:07

0

如前所述,将您的矩形形状分为几行,然后用算法here将各行与圆相交。