优化点到球体测试的距离

时间:2009-09-04 00:24:21

标签: optimization math mathematical-optimization

我想测试一个点是否在球体的特定距离内。

所以你有这些变量......

Point3F spherePnt;
F32 sphereRadius;
Point3F testPnt;

我能做到......

F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;

如果dist为正,则它在半径之外,如果dist为负,则它在半径内。

或者作为避免len()函数中的平方根的优化,您可以尝试这个...

F32 dist = ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius );

好吧,这看起来像乍看之下,但显然它实际上给了我不正确的结果。

例如,给定的变量设置如下......

SpherePnt( 0, 0, 0 )
SphereRadius( 1 )
testPnt( 1, 1, 1 )

取结果......

F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;
F32 dist2 = mSqrt( ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius ) );

dist = 0.7320508075688772935274463415059;
dist2 = 0.4142135623730950488016887242097;

很明显,这实际上是错误的,数学上的。它减少到期望2的平方根与3的平方根相同...所以问题是,我猜...

鉴于我确实想要进行这项测试,“在一个球体的范围r内是点p”,有没有办法在避免平方根的同时做到这一点?

1 个答案:

答案 0 :(得分:6)

您不需要“平方距离”方法中的sqrt计算!如果平方距离小于平方半径,则两点(球心和测试点)之间的距离小于球半径 - 仅用于测试“在球体内或在球体外?”的事实,差异的平方根不是平方根的差异,完全不相关。