【问题标题】:Optimizing points distance to sphere test优化点到球体的距离测试
【发布时间】:2010-11-25 11:42:54
【问题描述】:

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

所以你有这些变量...

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

【问题讨论】:

    标签: optimization math mathematical-optimization


    【解决方案1】:

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

    【讨论】:

    • 没错。比较到中心点距离的平方和半径的平方。
    • 对。如果这是使用你所有时间的“内循环”,你可以通过一次添加一个轴^2来获得加速。一旦你得到 > R^2 你就可以停下来了。
    • @Mike,好主意,我想知道它会节省多少时间(当然取决于点的分布——如果点离球体很远,那可能很重要)。
    猜你喜欢
    • 2015-08-25
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多