Canvas に(楕)円(弧)を描くことを考えましょう. DoJa3.0(505i)以降のiアプリ, およびMIDPの場合には, drawArc というメソッドが用意されているのでこれを使えばいいです. しかし, DoJa3.0 未満や EZアプリの場合には, sin, cos を使って細かい折れ線として描くことになります.
しかし, iアプリ/Vアプリ/EZアプリの従う J2ME CLDC1.0 には, sin, cos 関数はありません. そこで, 数表をおぼえておくか, Taylor 級数で計算することになります.
さらに, 数表をおぼえておく, Taylor 級数で計算するといっても J2ME CLDC1.0 には, double/float 型がないので, 工夫が必要です. sin q=x/100000 のような分数だと思って, 整数 x をおぼえることにします. このように表現された実数に演算をするときは, 順序をよく考えなくてはいけません. int の間の演算では, ( 10 * 100 ) / 1000=1000/1000=1, 10 * (100 / 1000) = 10 * 0 = 0 です. 一般に, オーバーフローしない範囲で, 割り算は最後に1回だけ行う, ようにするのがいいでしょう.
なお, Vアプリは独自拡張で固定小数点クラス FixedPoint と, FixedPoint オブジェクトに対する sin, cos などのメソッドを持っています. しかし, これらは J2ME Wireless Toolkit の中からは使用できず, compiler や preverifier をコマンドラインで使用しなければなりません. ここでは, これらのメソッドは使わないことにします. また, CLDC1.1 では, double 型がサポートされるそうです. また, J2ME CLDC1.0 に(すなわち,iアプリ/Vアプリ/EZアプリ共通に) 固定小数点クラスを追加するクラスライブラリ MathFP というものが存在します. 樋口はもっぱらこちらを使っています. 樋口による解説
cat Sample.javah | cpp -P -C -DMIDP=1 | nkf -sc | cat -s > Sample.javaなどとして, それぞれの source を生成しています. DOJA Builder/MIDP Builder のプリプロセッサでも, わずかな変更(#if と #endif の間に #define を書けないことに対応する)でこのような source を処理できます.
ここで, この配列 sin, cos は, J2SE の プログラム で作りました.
penguin15% javac TrigTable.java penguin15% java TrigTable > tableなどとするんですね.
アナログ時計を作ろう. 世の中のアナログ時計って, 日時の表示があったり, 文字盤に絵が描いてあったり, 月齢計があったり, n時0分には楽隊が出てきて演奏したりするよね :)
cat Sample.javah | cpp -P -C -DMIDP=1 | nkf -sc | cat -s > Sample.javaなどとして, それぞれの source を生成しています. DOJA Builder/MIDP Builder のプリプロセッサでも, わずかな変更(#if と #endif の間に #define を書けないことに対応する)でこのような source を処理できます.