【数学】交点计算

【数学】交点计算

线与面相交

将线参数方程作为参数带入到面的一般式方程中

n⃗xp(n⃗xlt+p⃗xl)+n⃗yp(n⃗ylt+p⃗yl)+n⃗zp(n⃗zlt+p⃗zl)−n⃗p⋅p⃗p=0(n⃗xpn⃗xl+n⃗ypn⃗yl+n⃗zpn⃗zl)t+(n⃗xpp⃗xl+n⃗ypp⃗yl+n⃗zpp⃗zl)−n⃗p⋅p⃗p=0(n⃗p⋅n⃗l)t+n⃗p⋅p⃗l−n⃗p⋅p⃗p=0(n⃗p⋅n⃗l)t=n⃗p⋅p⃗p−n⃗p⋅p⃗lt=n⃗p⋅p⃗p−n⃗p⋅p⃗ln⃗p⋅n⃗lt=n⃗p⋅(p⃗p−p⃗l)n⃗p⋅n⃗l \begin{aligned} \vec{n}^p_x(\vec{n}^l_xt+\vec{p}^l_x)+\vec{n}^p_y(\vec{n}^l_yt+\vec{p}^l_y)+\vec{n}^p_z(\vec{n}^l_zt+\vec{p}^l_z)-\vec{n}^p\cdot\vec{p}^p&=0\\ (\vec{n}^p_x\vec{n}^l_x+ \vec{n}^p_y\vec{n}^l_y+\vec{n}^p_z\vec{n}^l_z) t+(\vec{n}^p_x\vec{p}^l_x+\vec{n}^p_y\vec{p}^l_y+\vec{n}^p_z\vec{p}^l_z)-\vec{n}^p\cdot\vec{p}^p&=0\\ (\vec{n}^p\cdot\vec{n}^l)t+\vec{n}^p\cdot\vec{p}^l-\vec{n}^p\cdot\vec{p}^p&=0\\ (\vec{n}^p\cdot\vec{n}^l)t&=\vec{n}^p\cdot\vec{p}^p-\vec{n}^p\cdot\vec{p}^l\\ t&=\frac{\vec{n}^p\cdot\vec{p}^p-\vec{n}^p\cdot\vec{p}^l}{\vec{n}^p\cdot\vec{n}^l}\\ t&=\frac{\vec{n}^p\cdot(\vec{p}^p-\vec{p}^l)}{\vec{n}^p\cdot\vec{n}^l}\\ \end{aligned}

再将 tt 带入回直线方程中即可获得交点位置。

线与球相交

  • 线:o⃗+n⃗∗t\vec{o}+\vec{n}*t(可代表线上任意一点)
    • a:线起点
    • b:线法向
    • t:线上任意点离起点的距离
  • 球:(p⃗−c⃗)⋅(p⃗−c⃗)=r2(\vec{p}-\vec{c}) \cdot (\vec{p}-\vec{c}) = r^2
    • p:球上任意点
    • c:球心
    • r:球半径

将线上的点带入到球公式中:

(o⃗+tn⃗−c⃗)⋅(o⃗+tn⃗−c⃗)=r2(tn⃗+(o⃗−c⃗))⋅(tn⃗+(o⃗−c⃗))=r2t2n⃗⋅n⃗+2tn⃗⋅(o⃗−c⃗)+(o⃗−c⃗)⋅(o⃗−c⃗)−r2=0 \begin{aligned} (\vec{o}+t\vec{n}-\vec{c})\cdot(\vec{o}+t\vec{n}-\vec{c}) &= r^2 \\ (t\vec{n}+(\vec{o}-\vec{c}))\cdot(t\vec{n}+(\vec{o}-\vec{c})) &= r^2 \\ t^2\vec{n}\cdot\vec{n}+2t\vec{n}\cdot(\vec{o}-\vec{c})+(\vec{o}-\vec{c})\cdot(\vec{o}-\vec{c})-r^2&=0\\ \end{aligned}

该方程为一元二次方程,可以用求根公式来解:

  • a=n⃗⋅n⃗a=\vec{n}\cdot\vec{n}
  • b=2n⃗⋅(o⃗−c⃗)b=2\vec{n}\cdot(\vec{o}-\vec{c})
  • c=(o⃗−c⃗)⋅(o⃗−c⃗)−r2c=(\vec{o}-\vec{c})\cdot(\vec{o}-\vec{c})-r^2
  • discriminant=b2−4acdiscriminant=b^2-4ac
  • t=−b±discriminant2at=\frac{-b \pm \sqrt{discriminant}}{2a}

若设 h=n⃗⋅(o⃗−c⃗)h=\vec{n}\cdot(\vec{o}-\vec{c}),即 b=2hb=2h,则该公式还可以进一步化简:

t=−2h±4(h2−ac)2a=−h±(h2−ac)at=\frac{-2h \pm \sqrt{4(h^2-ac)}}{2a}=\frac{-h\pm (h^ 2 −ac)}{a}

由于正向线性变化不影响判别式结果,故判别式也可以优化。最终的计算公式如下:

  • a=n⃗⋅n⃗a=\vec{n}\cdot\vec{n}
  • h=n⃗⋅(o⃗−c⃗)h=\vec{n}\cdot(\vec{o}-\vec{c})
  • c=(o⃗−c⃗)⋅(o⃗−c⃗)−r2c=(\vec{o}-\vec{c})\cdot(\vec{o}-\vec{c})-r^2
  • d=h2−acd=h^2-ac
  • t=−h±dat=\frac{-h\pm d}{a}

当 d>0d>0 时,交点有两个;$ d=0$ 时,交点有一个。将求出的 t 带入到直线方程即可求出交点:o⃗+n⃗∗t\vec{o}+\vec{n}*t。


【数学】交点计算
https://bdffzi-blog.pages.dev/posts/3519951511.html
作者
BDFFZI
发布于
2025年6月9日
许可协议