简单常规图形的碰撞检测

Reference

[算法][包围盒]球,AABB,OBB - 南水之源 - 博客园 (cnblogs.com)

碰撞检测算法之分离轴定理 - 知乎 (zhihu.com)
Separating Axis Theorem (SAT) Explanation – sevenson.com.au — 分离轴定理 (SAT) 解释 – sevenson.com.au

圆 * 圆

圆与圆的碰撞检查,只需要检查两个圆心的距离和两个圆半径和的关系,用分离轴算法相当于两个圆心在xy任意坐标轴上的投影坐标,再加减各自半径,得出两个圆各自投影线段的最大点和最小点,进行线段相交判断。

常规矩形 * 常规矩形(AABB,axis-aligned bounding box,即轴对其包围盒)

只需要检查两个矩形各自的长度坐标表范围宽度坐标范围是否同时有相交,用分离轴算法相当于就是在这判断投影相交,而且因为矩形对边平行的原因,每个矩形只需要检查两条轴。

引用自Separating Axis Theorem (SAT) Explanation – sevenson.com.au

Imagine taking a torch and shining it on the two shapes you are testing from different angles. What sort of shadows would it cast on the wall behind it?
想象一下,拿起手电筒,从不同的角度照射你正在测试的两个形状。它会在它后面的墙上投下什么样的阴影


If you work your way around the shapes and never find a gap in the shadows then the objects must be touching. If you find a gap, then they are clearly not touching.
如果你使用这种方法,却从未在阴影中找到间隙,那么物体一定是接触的。如果你发现一个缝隙,那么它们显然没有接触。

From a programming point of view it would be too intensive to check every possible angle. Luckily, due to the nature of the polygons, there is only a few key angles you need to check.
从编程的角度来看,检查每个可能的角度都太密集了。幸运的是,由于多边形的性质,您只需要检查几个关键角度

旋转矩形* 旋转矩形(OBB ,oriented bounding box,即方向包围盒)

使用分离轴算法,可优化总共只检查4条轴。

多边形 * 圆形

使用分离轴算法,圆的分离轴为0条,只需要检查多边形的分离轴,进行投影时,圆将圆心进行投影,投影点加减半径,得出圆投影线段的最大点和最小点,以此和多边形投影进行相交判断。

多边形 * 多边形

使用分离轴算法