忍者ブログ
[280] [279] [278] [277] [276] [275] [274] [273] [272] [271] [270]

DATE : 2024/04/18 (Thu)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック