0

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

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

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 内”,有没有办法在避免平方根的同时做到这一点?

4

1 回答 1

6

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

于 2009-09-04T00:29:10.663 回答