2009-09-04 13 views
0

点が球の特定の距離内にあるかどうかをテストしたいと思います。点の球との距離の最適化

ですから、これらの変数を持っている...私は何ができる

Point3F spherePnt; 
F32 sphereRadius; 
Point3F testPnt; 

...

F32 dist = (spherePnt - testPnt).len() - sphereRadius; 

distのが正の場合はdistのがマイナスであれば、それは半径の外に、それが内部にあるさ半径。それは一見以来になりますが、どうやらそのは実際に与えるようにこれが見えます

またはLEN内平方根を回避するために最適化()あなたはこれを試すかもしれない機能として

...

F32 dist = (spherePnt - testPnt).lenSquared() - (sphereRadius * sphereRadius); 

[OK]を私は間違った結果になります

は、例えば、与えられた変数は、次のように設定されている...

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の範囲内に "、平方根を避けながらこれを行う方法はありますか?

答えて

6

"平方距離"アプローチでは、sqrt計算は必要ありません。 2つの点(球の中心とテストポイント)の間の距離は、自乗距離が平方の半径より小さい場合は球の半径よりも小さくなります - 球の中または外にあることをテストする唯一の目的のために、差の平方根は平方根の差ではなく、完全に無関係です。

+0

正確に。中心点までの距離の2乗と半径の2乗を比較します。 –

+1

そして、これがあなたのすべての時間を使っている "内部ループ"であれば、一度に2つの軸^ 2を追加することでスピードアップを得ることができます。あなたが> R^2を得るとすぐに、あなたは止めることができます。 –

+0

@Mike、素敵なアイデア、私はそれがどれほど時間を節約するのだろうと思っています(ポイントの分布に応じて - ポイントが非常に球から遠くに広がっているなら、それはかなり重要かもしれません)。 –

関連する問題