【数学】交点计算
线与面相交
将线参数方程作为参数带入到面的一般式方程中
nxp(nxlt+pxl)+nyp(nylt+pyl)+nzp(nzlt+pzl)−np⋅pp(nxpnxl+nypnyl+nzpnzl)t+(nxppxl+nyppyl+nzppzl)−np⋅pp(np⋅nl)t+np⋅pl−np⋅pp(np⋅nl)ttt=0=0=0=np⋅pp−np⋅pl=np⋅nlnp⋅pp−np⋅pl=np⋅nlnp⋅(pp−pl)
再将 t 带入回直线方程中即可获得交点位置。
线与球相交
- 线:o+n∗t(可代表线上任意一点)
- a:线起点
- b:线法向
- t:线上任意点离起点的距离
- 球:(p−c)⋅(p−c)=r2
将线上的点带入到球公式中:
(o+tn−c)⋅(o+tn−c)(tn+(o−c))⋅(tn+(o−c))t2n⋅n+2tn⋅(o−c)+(o−c)⋅(o−c)−r2=r2=r2=0
该方程为一元二次方程,可以用求根公式来解:
- a=n⋅n
- b=2n⋅(o−c)
- c=(o−c)⋅(o−c)−r2
- discriminant=b2−4ac
- t=2a−b±discriminant
若设 h=n⋅(o−c),即 b=2h,则该公式还可以进一步化简:
t=2a−2h±4(h2−ac)=a−h±(h2−ac)
由于正向线性变化不影响判别式结果,故判别式也可以优化。最终的计算公式如下:
- a=n⋅n
- h=n⋅(o−c)
- c=(o−c)⋅(o−c)−r2
- d=h2−ac
- t=a−h±d
当 d>0 时,交点有两个;$ d=0$ 时,交点有一个。将求出的 t 带入到直线方程即可求出交点:o+n∗t。