小编典典

测试线段是否与球体相交

algorithm

我试图确定线段(即两点之间)是否与球体相交。我对交点的位置不感兴趣,而对线段是否与球体表面相交不感兴趣。有没有人建议最有效的算法是什么?(我想知道是否有比通常的射线-
球面相交算法更简单的算法,因为我对相交位置不感兴趣)


阅读 525

收藏
2020-07-28

共1个答案

小编典典

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

一般规则…避免执行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 = …的方程中。如果结果小于或等于球体半径的平方,则有一个相交。如果更大,则没有交集。

2020-07-28