栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

测试线段是否与球体相交

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

测试线段是否与球体相交

我不知道这样做的标准方法是什么,但是如果您只想知道它相交,这就是我会做的。

一般规则…避免执行sqrt()或其他昂贵的操作。如果可能,请处理半径的平方。

  1. 确定起点是否在球体半径内。如果您知道永远不会这样,请跳过此步骤。如果您在内部,则射线将与球体相交。

从这里开始,您的起点不在范围内。

  1. 现在,想象一下适合球形的小盒子。如果在该框之外,请检查射线的x方向,y方向和z方向,以查看它是否与射线开始的框的侧面相交。这应该是简单的符号检查,或与零的比较。如果您在外面并远离它,那么您将永远不会相交。

从这里开始,您将处于更复杂的阶段。您的起点在假想盒子和球体之间。您可以使用微积分和几何获得简化的表达式。

您要执行的操作的要旨是确定射线与球之间的最短距离是否小于球的半径。

让您的射线由(x0 + i t,y0 + j t,z0 + k t)表示,球体的中心位于(xS,yS,zS)。
因此,我们希望找到t,使其给出最短的值(xS-x0-i
t,yS-y0-j t,zS-z0-k t)。

令x = xS-x0,y = yX-y0,z = zS-z0,D =矢量平方的大小

D = x ^ 2 -2 * x i t +(i * t)^ 2 + y ^ 2-2 * y j t +(j * t)^ 2 + z ^ 2-2 *z k t +(k * t)^ 2

D =(i ^ 2 + j ^ 2 + k ^ 2) t ^ 2-(x i + y j + z k)* 2 * t +(x ^ 2 + y ^ 2
+ z ^ 2)

dD / dt = 0 = 2 * t (i ^ 2 + j ^ 2 + k ^ 2)-2 (x i + y j + z * k)

t =(x i + y j + z * k)/(i ^ 2 + j ^ 2 + k ^ 2)

将t插回到D = …的方程中。如果结果小于或等于球体半径的平方,则有一个相交。如果更大,则没有交集。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624023.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号