category: C / C++
DATE : 2007/03/27 (Tue)
DATE : 2007/03/27 (Tue)
BREW SDK 3.1.2には、sin や cos などの三角関数は提供されているものの、逆三角関数は提供されていません。
そのうち提供されそうな気もしますが、以下に atan2 の実装方法を記しておきます。
なお、atan2 は次のような、y / x の逆正接を計算する関数です。結果はラジアンで返されます。
double atan2(double x, double y)
ネット上にアルゴリズムが転がっていないか探してみたところ、「DSP Trick: Fixed-Point Atan2 With Self Normalization」というページを見つけました。ただし、C風の擬似言語で書かれているので、これを BREW 向けにそのまま移植しました。
BREW 向けに移植したコードは、以下の通りです。
#include <AEEStdLib.h> double atan2(const double x, const double y) { const double zero = FASSIGN_INT(0); double coeff1 = FASSIGN_STR("0.785398163"); double coeff2 = FMUL(FASSIGN_INT(3), coeff1); double abs_y = FADD(FABS(y), FASSIGN_STR("0.00000000001")); double r; double angle; if (FCMP_LE(zero, x)) { r = FDIV(FSUB(x, abs_y), FADD(x, abs_y)); angle = FSUB(coeff1, FMUL(coeff1, r)); } else { r = FDIV(FADD(x, abs_y), FSUB(abs_y, x)); angle = FSUB(coeff2, FMUL(coeff1, r)); } if (FCMP_L(y, zero)) { return FSUB(zero, angle); } return angle; }
( ^ω^)元のコードがパブリックドメインなので、上の atan2 のコードも自由にご利用ください。
PR
●この記事にコメントする
忍者ブログ [PR]