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