- ベストアンサー
C言語)マンデルブロー集合
1.マンデルブロー集合の計算する。 2.発散するまでの計算回数を2次元配列にいれる。 3.計算回数に応じて色分けして画像ファイルを作る という流れのプログラムに挑戦しているのですが 1は何とかできたのですが2.の2次元配列に入れることができなくて悩んでいます。 #include <stdio.h> #define MAX 20 int main() { double tlx=-1.6, tly=1.2, brx=0.9, bry=-1.2;/*複素数座標の入力用*/ double cr, ci, zr, zi, zrp, zip;/*漸化式の計算用*/ double x, y; int k;/*計算回数記録用*/ for(y=tly; y>=bry; y-=0.1)/*虚数軸*/ { cr=y; for(x=tlx; x<=brx; x+=0.1)/*実数軸*/ { ci=x; zip=zrp=0; for(k=1; k<MAX; k++) { zr=zrp*zrp-zip*zip+ci;/*漸化式・実数部*/ zi=2*zrp*zip+cr;/*漸化式・虚数部*/ if((zr*zr+zi*zi)>4) /*発散の判定*/ break; zrp=zr; zip=zi; } printf("%3d",k); } printf("\n"); } return 0; } これが現在のソースなのですが、助言などいただけないでしょうか? とりあえず25x25の2次元配列にいれてみようとおもっています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
x = cx * AX + BX において cx = 0 のとき x = tlx cx = 24 のとき x = brx となるような AX, BX を求めておけば: # yについても同様 int g[25][25]; for ( cx = 0; cx < 25; ++cx ) { x = AX * cx + BX; for ( cy = 0; cy < 25; ++cy ) { y = AY * cy + BY; .... x,y をもとに k を計算 .... g[cx][cy] = k; } }
その他の回答 (1)
- JaritenCat
- ベストアンサー率37% (122/322)
ANo.1さんのやり方をコードにするとこんな感じでしょうか。参考まで。 #include <stdio.h> #define MAX 20 #define XSIZE 25 #define YSIZE 25 int main() { double tlx=-1.6, tly=1.2, brx=0.9, bry=-1.2;/*複素数座標の入力用*/ double cr, ci, zr, zi, zrp, zip;/*漸化式の計算用*/ int x, y; /* 二次元配列用 */ int k;/*計算回数記録用*/ int g[XSIZE][YSIZE]; /* 二次元配列 */ double dx,dy; /* 座標計算用、升目の間隔 */ dx=(tlx-brx)/(double)(XSIZE-1); dy=(tly-bry)/(double)(YSIZE-1); for (y=0; y<YSIZE; y++) { cr=bry+(double)y*dy; for (x=0; x<XSIZE; x++) { ci=brx+(double)x*dx; zip=zrp=0.0; for(k=1; k<MAX; k++) { zr=zrp*zrp-zip*zip+ci;/*漸化式・実数部*/ zi=2.0*zrp*zip+cr;/*漸化式・虚数部*/ if((zr*zr+zi*zi)>4.0) /*発散の判定*/ break; zrp=zr; zip=zi; } printf("%3d",k); g[x][y]=k; /* 発散までの回数を二次元配列に入れる */ } printf("\n"); } /* とりあえずアルファベットで表示(Y座標は大きいほうから)*/ for(y=0;y<YSIZE;y++) { for(x=0;x<XSIZE;x++) { printf("%c ",g[x][(YSIZE-1)-y]+'a'); } printf("\n"); } return 0; }
お礼
具体的にコードにしていただいてありがとうございました! 早速参考に挑戦してみます!
お礼
なるほどー まったく思いつきもしませんでした^^; やっぱりマダマダ勉強不足ですね ありがとうございました! なんとか形にしてみせます!