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

「距離の二乗」アプローチでは、平方根の計算は必要ありません。2 点 (球の中心とテストポイント) の間の距離は、距離の 2 乗が半径の 2 乗より小さい場合、球の半径よりも小さくなります。差の平方根は平方根の差ではなく、まったく無関係です。

于 2009-09-04T00:29:10.663 に答える