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]
