我想检测圆形和矩形之间的碰撞,但不知道如何。
我知道如何使用毕达哥拉斯定理来检测圆与圆之间的碰撞:
(x2 - x1)^ 2 +(y2 - y1)^ 2 - (r2 + r1),但检测碰撞的数学是什么
在C或C ++编程语言中的圆形和矩形之间。
答案 0 :(得分:7)
在碰撞检测中,首先检测简单对象之间的碰撞然后专注于更复杂的对象通常是有益的。这称为宽相和窄相碰撞检测。我们的想法是,使用更简单的算法排除碰撞首先会使对象更快地被证明对象不会发生碰撞。
您最初可以将所有对象建模为包含可能更复杂的真实形状的圆形或方框。如果发现这些对象发生碰撞,则可以使用更复杂的算法来检查碰撞。
众所周知,对于所有凸面物体,如果两个物体没有碰撞,那么你可以在它们之间找到一个平面。这被称为分离轴定理。由于圆和正方形都是凸的,因此可以使用它来设计算法来检测它们之间的碰撞。
您可以先搜索简单平面,例如平行于正方形边缘的平面以及与圆相切的平面。一个很好的选择是在物体的两个中心之间的线上与圆相切的平面,然后是圆心和每个角之间的线。
找到分离平面后,对象不会发生碰撞,您可以停止搜索。
希望这有帮助。
(可以在此处找到有关此应用的非常详细的解释:http://www.metanetsoftware.com/technique/tutorialA.html#section1)
答案 1 :(得分:3)
如果圆的中心在矩形内,或者圆的中心到矩形边界上的最近点的距离小于圆的半径,则圆与矩形相交。圆的中心相对于矩形的位置有九种可能性,具体取决于它相对于其延伸边的位置:
A|B|C
-+-+-
D|E|F
-+-+-
G|H|I
在E
的情况下,圆圈和矩形明显相交。在A, C, G, I
的情况下,您需要测试到最近角落的距离。在其余情况下,使用从圆心到最近边的点线距离。
答案 2 :(得分: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
这提供了两种类型的测试:
答案 3 :(得分:0)
如前所述,将矩形形状划分为直线,然后将每条直线与带有算法here的圆相交。