两个 圆_球 的相交性检测
使用球心 c1 , c2 和半径 r1 , r2 定义的两个球,设 d 为球心间的距离。
显然,当 d<r1+r2 时它们相交;在实现时通过比较 d2<(r1+r2)2 ,可以避免包括计算 d 在内的平方根运算。

图1 两个球相交

图2 两个运动的球

图3 认为其中一个球是静止的,并组合运动向量

图4 球和圆的动态检测
为了计算 t ,得先计算从 cm 指向 cs 的临时向量 e ,并设半径的和为 r :
er=cs−cm=rm+rs
根据 cos 定理:
r2=t2+∥e∥2−2t∥e∥cosθ
应用点乘的集合解释,化简可得:
r2r20=t2+∥e∥2−2t∥e∥cosθ=t2+e⋅e−2t(e⋅d)=t2−2(e⋅d)t+e⋅e−r2
应用二次求根公式:
0ttt=t2−2(e⋅d)t+e⋅e−r2=22(e⋅d)±(−2(e⋅d))2−4(e⋅e−r2)=22(e⋅d)±4(e⋅d)2−4(e⋅e−r2)=(e⋅d)±(e⋅d)2−e⋅e+r2)
其中,
- 较小的值(负根)是两个球开始接触时的 t 值;
- 较大的根(正根)是两个球脱离接触时的 t 值。
t=(e⋅d)±(e⋅d)2−e⋅e+r2)
NOTE :
- 若 ∥e∥<r,则球在 t=0 时就相交;
- 若 $ t < 0$ 或 t>l ,那么在所讨论的时间段内两个球不会发生接触;
- 如果根号内的值是负的,那么两个球不会相交。