Jam*_*mes 0 math optimization mathematical-optimization
我想测试一个点是否在球体的特定距离内.
所以你有这些变量......
Point3F spherePnt;
F32 sphereRadius;
Point3F testPnt;
Run Code Online (Sandbox Code Playgroud)
我可以...
F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;
Run Code Online (Sandbox Code Playgroud)
如果dist为正,则它在半径之外,如果dist为负,则它在半径内.
或者作为避免len()函数中的平方根的优化,您可以尝试这个...
F32 dist = ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius );
Run Code Online (Sandbox Code Playgroud)
好吧,这看起来像乍看之下,但显然它实际上给了我不正确的结果.
例如,给定的变量就像这样设置......
SpherePnt( 0, 0, 0 )
SphereRadius( 1 )
testPnt( 1, 1, 1 )
Run Code Online (Sandbox Code Playgroud)
取结果......
F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;
F32 dist2 = mSqrt( ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius ) );
dist = 0.7320508075688772935274463415059;
dist2 = 0.4142135623730950488016887242097;
Run Code Online (Sandbox Code Playgroud)
很明显,这实际上是错误的,数学上的.它减少到期望2的平方根与3的平方根相同...所以问题是,我猜...
鉴于我想要执行此测试,"是在球体的范围r内的点p",有没有办法在避免平方根的同时做到这一点?
您不需要"平方距离"方法中的sqrt计算!如果平方距离小于平方半径,则两点(球心和测试点)之间的距离小于球半径 - 仅用于测试"在球体内或在球体外?"的事实,差异的平方根不是平方根的差异,完全无关紧要.