2つのベクトル間の角度に古典的な公式を適用する場合:
非常に小さい/鋭角の場合、精度が失われ、結果が正確ではないことがわかります。このStack Overflow answerで説明されているように、1つの解決策は代わりにアークタンジェントを使用することです。
そして、これは実際により良い結果をもたらします。しかし、これがに非常に近い角度で悪い結果を与えるのではないかと思います。そうですか?もしそうなら、ブランチ内の公差をチェックせずに角度を正確に計算する式はありますか?if
2つのベクトル間の角度に古典的な公式を適用する場合:
非常に小さい/鋭角の場合、精度が失われ、結果が正確ではないことがわかります。このStack Overflow answerで説明されているように、1つの解決策は代わりにアークタンジェントを使用することです。
そして、これは実際により良い結果をもたらします。しかし、これがに非常に近い角度で悪い結果を与えるのではないかと思います。そうですか?もしそうなら、ブランチ内の公差をチェックせずに角度を正確に計算する式はありますか?if
回答:
(私は以前にこのアプローチをテストしましたが、正しく動作したことを覚えていますが、この質問に対して具体的にテストしたことはありません。)
私の知る限りとして、両方 及びV 1 ⋅ V 2、彼らはどちらかの入力がオフの場合、ほぼパラレル/垂直にatan2はあなたに良い精度を与えることができないであれば壊滅的なキャンセルに苦しむことができます。
辺の長さが三角形の角度を見つけるように問題を再定式化することから始めます。v 1 | 、b = | v 2 | およびc = | v 1 − v 2 | (これらはすべて、浮動小数点演算で正確に計算されます)。カハン(針のような三角形の面積と角度の計算ミス)により、ヘロンの公式にはよく知られたバリアントがあり、面積と角度(aとbの間)を計算できます)その辺の長さで指定された三角形の、数値的に安定して行います。この副問題の削減も正確であるため、このアプローチは任意の入力に対して機能するはずです。
その論文から引用(P.3参照)、仮定≥ B、 μ = { C - (- Bを)、場合 B ≥ C ≥ 0 、B - (- C )、場合 C > B ≥ 0 、無効三角形、それ以外の場合、a n g l e = 2 arctan (√
Kahanの論文には、他の式が失敗する値の例を含む、これがどのように機能するかの説明があります。最初の式は4ページのC ″です。
KahanのHeronの式をお勧めする主な理由は、非常に素晴らしいプリミティブを作成するためです。潜在的にトリッキーな平面ジオメトリの質問の多くは、任意の三角形の面積/角度を見つけることで削減できるため、問題を減らすことができる場合、それのための素敵な安定した式、そしてあなた自身で何かを考え出す必要はありません。
編集ステファノさんのコメントに続いて、私はのための相対誤差のプロットを作っ、V 2 = (COS θ 、罪のθ )(コード)。2行はの相対誤差であるθ = εとθ = π / 2 - ε、ε水平軸に沿って行きます。動作しているようです。