ポイントが球から特定の距離内にあるかどうかをテストしたいと思います。
これらの変数があります...
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 内にありますか」、平方根を避けながらこれを行う方法はありますか?