我试图确定线段(即两点之间)是否与球体相交。我对交点的位置不感兴趣,而对线段是否与球体表面相交不感兴趣。有没有人建议最有效的算法是什么?(我想知道是否有比通常的射线- 球面相交算法更简单的算法,因为我对相交位置不感兴趣)
我不知道这样做的标准方法是什么,但是如果您只想知道它相交,这就是我会做的。
一般规则…避免执行sqrt()或其他昂贵的操作。如果可能,请处理半径的平方。
从这里开始,您的起点不在范围内。
从这里开始,您将处于更复杂的阶段。您的起点在假想盒子和球体之间。您可以使用微积分和几何获得简化的表达式。
您要执行的操作的要旨是确定射线与球之间的最短距离是否小于球的半径。
让您的射线由(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 = …的方程中。如果结果小于或等于球体半径的平方,则有一个相交。如果更大,则没有交集。