• ベストアンサー

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次元配列にいれてみようとおもっています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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; } }

nozie
質問者

お礼

なるほどー まったく思いつきもしませんでした^^; やっぱりマダマダ勉強不足ですね ありがとうございました! なんとか形にしてみせます!

その他の回答 (1)

回答No.2

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; }

nozie
質問者

お礼

具体的にコードにしていただいてありがとうございました! 早速参考に挑戦してみます!

関連するQ&A