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 のコードも自由にご利用ください。
DATE : 2007/03/11 (Sun)
今回開発している BREW アプレットでは、ファイルからのデータ読み込みが重要な役目を担います。ところが、開発初期の頃はとてもファイル読み込みが遅くて使い物になりませんでした。
(;^ω^)1件データを読み込んで処理するのに2、3秒かかっていました。
ところが、少しコードをいじるだけで劇的に速くなりました。
( ^ω^)というわけで、その少しいじった部分をメモしておきます。
ファイルアクセスを速くするには、以下の2つの方法が簡単で効果的です。
- ファイルを開いたら、処理が一段落するまで閉じないようにする。
- ファイルキャッシュサイズを設定する。
ファイルを開いたら、処理が一段落するまで閉じないようにする
ファイルアクセスが遅かった時のコードでは、データを1件処理するごとに、律儀にファイルのオープン、クローズを繰り返していました。そのため、オープン、クローズ処理のオーバヘッドが処理時間に影響していました。
そこで、ファイルのオープン、クローズはデータ単位ではなく、処理単位で行うようにします。リソースに余裕がある場合は、アプレットの終了まで確保し続けても良いかと思います。
(;^ω^)あまりオープン、クローズを繰り返すと、メモリ領域の断片化を誘発しそうですしね。
ファイルキャッシュサイズを設定する
IFILE_SetCacheSize 関数を使用すると、ファイルキャッシュサイズを設定できます。キャッシュサイズの分だけファイルの内容がメモリ上に保持されるので、データへのアクセスが高速になります。
ただし、設定できるキャッシュサイズは選択制(標準・最小・最大・中間)になっていて、最終的にどの程度確保されるかは機種依存です。
参考文献
DATE : 2007/02/13 (Tue)
(前回の記事)
イベントとは
AEE シェルにコールバックを登録することで処理を細かく分けることができました。そのほかに BREW AEE にイベントを送信することで、イベントに関連付けられた処理を呼び出すことができます。
イベントは、AEEEvent 型で定義されています。BREW アプレットの開始や停止、キーが押されたなどのイベントも、AEEEvent (実体は符号なし16ビット整数)で定義されています。新しくイベントを定義する場合には、EVT_USER 定数以上の値にする必要があります。
また、送信するイベントには関連するデータを2種類添付することができます。具体的には、符号なし16ビット整数と符号なし32ビット整数の2つです。例えば、キーが押されたイベント(EVT_KEY_PRESS)の場合は、前者に押されたキーのコードが、後者に修飾キーのビットフラグが設定されます。
イベントを実際に送信するには、以下の関数を使用します。これらの関数を使用するには、送信先アプレットのクラス ID を指定する必要があります(通常は、イベントの送信元のクラス ID となります)。
- ISHELL_SendEvent
- ISHELL_PostEvent
(つづきます)
DATE : 2007/02/06 (Tue)
BREW では標準 C ライブラリ関数を直接使うことができません。アプレットのサイズを最小限に抑えるため、BREW では標準 C ライブラリ関数を AEE を通して使います。例えば malloc 関数を使うには、 AEE に用意された MALLOC 関数を使います。
BREW の仕様上、中には AEE から使用できない標準 C ライブラリ関数もあります。また BREW では通常、浮動小数点数演算がサポートされていないため、浮動小数点演算用の関数が用意されています。
そこで 時々使う max, min, abs 関数を BREW API ドキュメントの中で探してみたのですが、見つかりません(浮動小数点数用の FMAX, FMIN, FABS はあったのですが、整数用のものは書かれていませんでした)。
しかし、BREW のヘッダファイルの「AEEComDef.h」を覗いて見ると、次のような宣言がありました。
#ifndef MAX #define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) #endif #ifndef MIN #define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) #endif #ifndef ABS #define ABS(VAL) (((VAL)>0)?(VAL):(-(VAL))) #endif
(;^ω^)API ドキュメントには書かれていませんが、マクロ関数 MAX, MIN, ABS として使用できるようです。