SPALM Web Interpreter
Cannot use canvas tag.
No.
----
状態:
停止
ソース
'フラクタル表示 (計算に時間がかかります)' '出典 「X68000 Cプログラミング」 中森 章 ソフトバンク 1991' defconst(WAIT,10) //defconst(SIZE, 512) //defconst(SCSIZE,512) defconst(SIZE, 256) defconst(SCSIZE,256) setscsize(SIZE,SIZE,SCSIZE,SCSIZE) dbgloopset(1) setcolortable(0) sleep(WAIT) tm=0;ts=tick calcfrac1() tm=tick-ts soft1("*".tm."msec") end // フラクタル計算1(専用命令使用) : 15527msec // フラクタル計算2(実数計算使用) : 371259msec // フラクタル計算3(複素数構造体使用) : 937377msec // (※)計算結果はすべて同じです。 'フラクタル計算1(専用命令使用)' func calcfrac1() { // 初期化 defconst(min_r,-0.4) defconst(min_i, 0.2) defconst(max_r,-0.3) defconst(max_i, 0.4) defconst(con_r,-0.02) defconst(con_i,-0.695) delta_r=0 delta_i=0 x=0 y=0 rep=0 t1=tick t2=0 // 増分を事前に計算 delta_r = (max_r - min_r) / SIZE delta_i = (max_i - min_i) / SIZE // フラクタルの計算と表示 for (y=0; y<SIZE; y++) { for (x=0; x<SIZE; x++) { // 専用命令使用 rep = calcfractal(x,y,delta_r,delta_i,min_r,min_i,con_r,con_i,51,4) setpixel(x,y,colortbl[rep & 0xF]) //if ((x % 16)==0) { sleep(WAIT) } t2=tick-t1 if (t2>1000) { t1=tick sleep(WAIT) } } // if (y==10) { break } } } 'フラクタル計算2(実数計算使用)' func calcfrac2() { // 初期化 defconst(min_r,-0.4) defconst(min_i, 0.2) defconst(max_r,-0.3) defconst(max_i, 0.4) defconst(con_r,-0.02) defconst(con_i,-0.695) delta_r=0 delta_i=0 x=0 y=0 z_r=0 z_i=0 t_r=0 t_i=0 rep=0 t1=tick t2=0 // 増分を事前に計算 delta_r = (max_r - min_r) / SIZE delta_i = (max_i - min_i) / SIZE // フラクタルの計算と表示 for (y=0; y<SIZE; y++) { for (x=0; x<SIZE; x++) { t_r = x * delta_r + min_r t_i = y * delta_i + min_i for (rep=0; rep<=50; rep++) { z_r = t_r * t_r - t_i * t_i + con_r z_i = 2 * t_r * t_i + con_i if (z_r * z_r + z_i * z_i > 4) { break } t_r = z_r t_i = z_i } setpixel(x,y,colortbl[rep & 0xF]) //if ((x % 16)==0) { sleep(WAIT) } t2=tick-t1 if (t2>1000) { t1=tick sleep(WAIT) } } //if (y==10) { break } } } 'フラクタル計算3(複素数構造体使用)' func calcfrac3() { // 初期化 cmin["real"]=-0.4 cmin["imag"]=0.2 cmax["real"]=-0.3 cmax["imag"]=0.4 ccon["real"]=-0.02 ccon["imag"]=-0.695 delta["real"]=0 delta["imag"]=0 x=0 y=0 z["real"]=0 z["imag"]=0 ctemp1["real"]=0 ctemp1["imag"]=0 ctemp2["real"]=0 ctemp2["imag"]=0 rep=0 t1=tick t2=0 // 増分を事前に計算 Complex_sub(&cmax, &cmin, &ctemp1) ctemp2["real"]=SIZE ctemp2["imag"]=0 Complex_div(&ctemp1, &ctemp2, &delta) // フラクタルの計算と表示 for (y=0; y<SIZE; y++) { for (x=0; x<SIZE; x++) { ctemp1["real"] = x * delta["real"] ctemp1["imag"] = y * delta["imag"] Complex_add(&ctemp1, &cmin, &z) for (rep=0; rep<=50; rep++) { Complex_mul(&z, &z, &ctemp1) Complex_add(&ctemp1, &ccon, &z) if (Complex_norm(&z)>4) { break } } setpixel(x,y,colortbl[rep & 0xF]) //if ((x % 16)==0) { sleep(WAIT) } t2=tick-t1 if (t2>1000) { t1=tick sleep(WAIT) } } //if (y==10) { break } } } // 複素数構造体の雛形 // Complex["real"]=0 // Complex["imag"]=0 // 複素数構造体を使用する関数 func Complex_add(*c1, *c2, *cret) { *(cret)["real"] = *(c1)["real"] + *(c2)["real"] *(cret)["imag"] = *(c1)["imag"] + *(c2)["imag"] } func Complex_sub(*c1, *c2, *cret) { *(cret)["real"] = *(c1)["real"] - *(c2)["real"] *(cret)["imag"] = *(c1)["imag"] - *(c2)["imag"] } func Complex_mul(*c1, *c2, *cret) { *(cret)["real"] = *(c1)["real"] * *(c2)["real"] - *(c1)["imag"] * *(c2)["imag"] *(cret)["imag"] = *(c1)["real"] * *(c2)["imag"] + *(c1)["imag"] * *(c2)["real"] } func Complex_div(*c1, *c2, *cret) { loc c2_norm = Complex_norm(c2) *(cret)["real"] = ( *(c1)["real"] * *(c2)["real"] + *(c1)["imag"] * *(c2)["imag"] ) / c2_norm *(cret)["imag"] = ( - *(c1)["real"] * *(c2)["imag"] + *(c1)["imag"] * *(c2)["real"] ) / c2_norm } func Complex_norm(*c) { return *(c)["real"] * *(c)["real"] + *(c)["imag"] * *(c)["imag"] } '色テーブル設定' func setcolortable(mode) { glb colortbl loc i, c switch (mode) { case 1: // (グレースケール 16色) for (i=0;i<16;i++) { c=255*i\15 colortbl[i]=(c<<16)+(c<<8)+c } break case 2: // (PC98 8色) @(colortbl,0,0xFF,0xFF0000,0xFF00FF,0xFF00,0xFFFF,0xFFFF00,0xFFFFFF, 0,0xFF,0xFF0000,0xFF00FF,0xFF00,0xFFFF,0xFFFF00,0xFFFFFF) break case 3: // (PC98 16色) @(colortbl,0,0xFF,0xFF0000,0xFF00FF,0xFF00,0xFFFF,0xFFFF00,0xFFFFFF, 0x7F7F7F,0xAF,0xAF0000,0xAF00AF,0xAF00,0xAFAF,0xAFAF00,0xAFAFAF) break default: // (X68000 16色) @(colortbl,0,0x5F5F5F,0x7F,0xFF,0x7F0000,0xFF0000,0x7F007F,0xFF00FF, 0x7F00,0xFF00,0x7F7F,0xFFFF,0x7F7F00,0xFFFF00,0xAFAFAF,0xFFFFFF) break } // 色確認 //col(0) //frect(0,0,width,height) //for (i=0;i<16;i++) { // col(colortbl[i]) // frect(i*5,0,5,5) //} }
詳細表示