DOSEIの日記

技術メモ+日常ログ

なす角

y 軸 (0,1,0) と適当なベクトル (a,b,c) のなす角をプログラムで求めるには、どの式を使えばより正確に求まるのだろうか。

  • \cos \theta = b / \sqrt{a^2 + b^2 + c^2}acos() で計算
    • 小数で割り算して渡すので、精度の問題がある。
    • [−1, 1] をはみ出すとエラーとなることに注意が必要。計算誤差でそうなることはよくあるのだが、いちいち errno でチェックするのはだるいので、 std::max(-1.0, std::min(x, 1.0)) のように、クリップするとよい。
  • \tan \theta = \sqrt{a^2+c^2} / batan2() で計算
    • 分子・分母を別々に渡すので、関数がよきに計らってくれることが期待できる。
    • (0, 0) でなければ、エラーにならない。