« RX62NのWebコンパイラがパワーアップ | トップページ | RX-MEGAのリソースCD-ROMをバージョンアップ! »

2011.08.16

RX62Nでマンデルブロー集合を描いてみた

MARYのOLED基板に、マンデルブロー集合を描くデモを行ってみました。

RX62Nには浮動小数点演算器が内蔵されているので、たまにはそれを駆使してあげることにしました。次の動画をご覧下さい。

Webコンパイラにコードを貼り付けて、コンパイルして、メモリマップや逆アセンブラリストを確認し、MITOUJTAGのJTAG ICE機能を使ってRAMにダウンロードして実行しています。その一部始終を上のようなムービーにしました。
ピッピッピと音がしているのは、画面を1回更新したときに音を鳴らすようにしているためです。そうすれば、RX62Nの演算の実力がわかるだろうと思うわけです。

なお、コンパイルオプションは-O2をつけて最適化しています。

コアな部分のプログラムを示します。


// 複素数の乗算 C = A * B
void complex_mult(float ar,float ai,float br,float bi,float *cr,float *ci) {
*cr = ar * br - ai * bi;
*ci = ar * bi + ai * br;
}
 
// 複素数の絶対値の二乗を得る
float complex_abs2(float r,float i) {
float ar,ai;
complex_mult(r,i,r,-i,&ar,&ai);
return ar;
}
 
// 繰り返しの処理
void loop() {
OLED_move_position(MARY2,0,0); // MARYの書き込みモードセット
for(int y = 0;y < 128;y++) {
for(int x = 0;x < 128;x++) {
float cr = (x - 64) / 64. / mag + offsetx;
float ci = (y - 64) / 64. / mag + offsety;
float zr = 0, zi = 0;
int t; // 何回繰り返せば発散するか
for(t=0;t<64;t++) {
if(complex_abs2(zr,zi) > 2) break;
complex_mult(zr,zi,zr,zi,&zr,&zi);
zr += cr; zi += ci;
}
OLED_Send_Pixel(MARY2,generateColor(t,16)); // 1ピクセル描画
}
}
mag = mag * 1.03; // 視点の移動
offsety += 0.001;
offsetx += 0.0016;
}

これでRX62Nのプログラム開発や、ダウンロードがとても楽にできるようになりました。

|

« RX62NのWebコンパイラがパワーアップ | トップページ | RX-MEGAのリソースCD-ROMをバージョンアップ! »

コメント

コメントを書く



(ウェブ上には掲載しません)




« RX62NのWebコンパイラがパワーアップ | トップページ | RX-MEGAのリソースCD-ROMをバージョンアップ! »