直线和球的交点

                     

贡献者: addis

预备知识 Matlab 的函数,一元二次方程

   直线参数方程可以用几何矢量表示为 $ \boldsymbol{\mathbf{P}} _0 + \lambda \hat{\boldsymbol{\mathbf{v}}} $,其中 $ \hat{\boldsymbol{\mathbf{v}}} $ 是单位矢量。球心为 $ \boldsymbol{\mathbf{P}} _c$,半径为 $R$,那么直线和球相交的点满足

\begin{equation} ( \boldsymbol{\mathbf{P}} _0 + \lambda \hat{\boldsymbol{\mathbf{v}}} - \boldsymbol{\mathbf{P}} _c)^2 = R^2~. \end{equation}
其中左边的平方表示矢量和自身的内积,即矢量模长的平方。展开后得到关于 $\lambda$ 的二次方程
\begin{equation} \lambda^2 + 2 \hat{\boldsymbol{\mathbf{v}}} \boldsymbol\cdot ( \boldsymbol{\mathbf{P}} _0 - \boldsymbol{\mathbf{P}} _c) \lambda + ( \boldsymbol{\mathbf{P}} _0 - \boldsymbol{\mathbf{P}} _c)^2 - R^2 = 0~. \end{equation}
直接使用求根公式得
\begin{equation} \lambda = \frac{-b \pm \sqrt{b^2 - 4c}}{2}~. \end{equation}
其中
\begin{equation} b = 2 \boldsymbol{\mathbf{v}} \boldsymbol\cdot ( \boldsymbol{\mathbf{P}} _0 - \boldsymbol{\mathbf{P}} _c)~, \qquad c = ( \boldsymbol{\mathbf{P}} _0 - \boldsymbol{\mathbf{P}} _c)^2 - R^2~. \end{equation}

   以下给出 Matlab 代码

未完成:应该支持多条直线而不是多个球……
代码 1:LSph2P.m
% 计算直线和球的焦点
% numel(L)=6, size(P)=[N,3], numel(R)=1
function [P1,P2] = LSph2P(L6, P, R)
L6 = L6(:)';
P0 = L6(1:3); v0 = L6(4:6)/norm(L6(4:6));
P0_P = P0-P;
b = 2*P0_P*v0';
c = dot(P0_P, P0_P, 2) - R^2;
d = b.^2 - 4*c;
if d < 0
    P1 = []; P2 = []; return;
end
d = sqrt(d);
P1 = 0.5*(-b -d).*v0 + P0;
if d == 0
    P2 = []; return;
end
P2 = 0.5*(-b +d).*v0 + P0;
end


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利