我想测试一个点是否在球体的特定距离内。
所以你有这些变量......
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 的平方根相同......所以问题是,我猜......
鉴于我确实想要执行此测试,“点 p 在球体的范围 r 内”,有没有办法在避免平方根的同时做到这一点?