线段和圆/球的相交性检测

本文讨论2D中线段和圆的相交性检测,检测的方法也适用于3D中线段和球之间的相交性测试,这是因为可以在包含线段和球心的平面进行检测,从而将3D问题转化为2D问题。(如果线段包含在穿过球心的直线上,那么这个平面就不是唯一的,但这并不是问题,在这种情况下我们能使用任意包含射线和球心的平面来进行计算。)

  如下图用圆心c和半径r来定义球,线段的定义为:p(t)=p0+td,这里d为单位向量,t从0变化到l,l为线段长度。所要求的是交点处t的值:

  t = a - f;

  a的计算方法如下,设e为从p0直线圆心c的向量:

  e = c - p0;

  将e投影到d上,这个向量的的长度为a,它的计算式为:

  a = e.d(点乘)  (此式看不明白的请参考向量投影相关知识)

  现在的任务就是计算f。首先,根据勾股定理,可以很清楚地得到:

  f2+b2=r2

  在较大的三角形中用勾股定理求得b2:

  a2+b2=e2

  b2 = e2-a2

  e是从线段起点到圆心之间的距离,也就是向量e的长度,因此,e2:

  e2 = e.e

  代入并化简得:

  f = sqrt(r2-e2+a2)

 最后求得t:

 t = a - f

 这里考虑开根号出来的正负两种情况,从而得到两个交点。

  这里注意为负,那么射线与圆不相交。

 

代码实现如下:

程序输出:

交点
7.01444 4.29396
65536 65536
Press any key to continue

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值