射线和球相交的判断

本文主要介绍如何判定一条线和一个球面相交
1、第一种是代入法
2、优化后的方法
其中只介绍数学相关,代码实现可自行实现

1、代入法判定射线和球是否相交

我们假设射线为 L ( t ) = t d ⃗ + P L(t) =t\vec{d}+P L(t)=td +P,其中P为射线起点, d ⃗ \vec{d} d 为射线的方向

因为射线与球相交可以等价为射线和球面相交,因此我们假设球面方程为

F ( X ) = ( X − C ) 2 = R 2 F(X) = (X-C)^2 = R^2 F(X)=(XC)2=R2,其中X是球面上的点,C为球心,R为球的半径

我们把射线上的点带入球面方程中可得到

( t d ⃗ + P − C ) 2 = R 2 ( 1 ) (t\vec{d}+P-C)^2 = R^2(1) (td +PC)2=R21

d ⃗ t 2 + 2 t [ d ⃗ ( P − C ) ] + ( P − C ) 2 − R 2 = 0 \vec{d}t^2 + 2t[\vec{d}(P-C)]+(P-C)^2-R^2 = 0 d t2+2t[d (PC)]+(PC)2R2=0

这就是一个一元二次方程的形式 a t 2 + 2 b t + c = 0 at^2+2bt+c = 0 at2+2bt+c=0

因此我们可以用判别式去判断相交情况,即 ▲ = b 2 − 4 a c ▲=b^2-4ac =b24ac

▲>0,两个交点;
▲=0,一个交点;
▲<0,没有相交;
在这里插入图片描述
接下去两个交点的求法就用 − b ± ▲ 2 4 a c \frac{-b±\quad \sqrt[2]{▲}}{4ac} 4acb±2 去求解

2、优化法判定射线和球是否相交

同样假设射线为 L ( t ) = t d ⃗ + P L(t) =t\vec{d}+P L(t)=td +P,其中P为射线起点, d ⃗ \vec{d} d 为射线的方向,如下**图(a)**所示, a ⃗ = C − P \vec{a} = C-P a =CP,则
① 如果 ∣ a ⃗ ∣ 2 ≤ R 2 |\vec{a}|^2≤R^2 a 2R2,此时必定相交,因为点P在球内,如图(c)
② 如果 ∣ a ⃗ ∣ 2 > R 2 |\vec{a}|^2>R^2 a 2>R2,此时计算 a ⃗ 在 d ⃗ 上 的 投 影 l = a ⃗ ⋅ d ⃗ , 如 果 l < 0 , \vec{a}在\vec{d}上的投影l=\vec{a}·\vec{d},如果l<0, a d l=a d l<0证明球在射线后面,则一定不相交,如图(b)
③求 球心和 l l l 的距离 m , m 2 = a − l 2 , 如 果 m 2 ≤ R 2 , 则 相 交 , 反 之 不 相 交 m ,m^2=a^-l^2,如果m^2≤R^2, 则相交,反之不相交 mm2=al2m2R2,如图(a)
在这里插入图片描述

参考文章《射线与球的相交测试》

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值