mandel_proc
MANDEL_API MSGraph<sWord>* mandel_proc(MSGraph<sWord>* vp) { MSGraph<sWord>* xp = NULL; int Xsize = 600; // スクリーンのXサイズ double Infnty = 1.0e8; // 無限大 double Xmin = -2.5; // X軸(実数部)の最小値の初期値 double Xmax = 1.0; // X軸(実数部)の最大値の初期値 double Ymin = -1.5; // Y軸(虚数部)の最小値の初期値 double Ymax = 1.5; // Y軸(虚数部)の最大値の初期値 double val = 200; // 最大繰り返し回数の初期値 // 数値入力用ダイアログ BOOL isok = InputMultiNumDLG("X軸の最小値", &Xmin, "X軸の最大値", &Xmax, "Y軸の最小値", &Ymin, "Y軸の最大値", &Ymax, "最大繰り返し回数", &val); if (!isok) { xp = new MSGraph<sWord>(); xp->state = ERROR_GRAPH_CANCEL; return xp; } ///////////////////////////////////////// // 以下に処理コードを書く // 入力 vp, 出力 xp ///////////////////////////////////////// int xsize = Xsize; int ysize = (int)(xsize*(Ymax-Ymin)/(Xmax-Xmin) + 0.5); double dC = (Xmax-Xmin)/xsize; // 刻み幅 xp = new MSGraph<sWord>(xsize, ysize); // (xsize × ysize) の画用紙を用意 int i, j, k; double Cr, Ci, Zr, Zi, Zrp, Zip; Ci = Ymax; for (j=0; j<xp->ys; j++) { Cr = Xmin; for (i=0; i<xp->xs; i++) { Zrp = 0.0; Zip = 0.0; k = 0; // 漸化式の計算 Z(n+1) = Z(n) + C do { Zr = Zrp*Zrp - Zip*Zip + Cr; Zi = 2.*Zrp*Zip + Ci; Zrp = Zr; Zip = Zi; k++; } while (Zr<Infnty && Zi<Infnty && k<=(int)val); // 発散のチェック xp->point(i, j) = (sWord)((double)(val-k+1)*4095/val); // 色を作って点を打つ (k==1:白, k==val+1:黒) Cr += dC; } Ci -= dC; } xp->color = GRAPH_COLOR_ARGB16; // カラーモード ///////////////////////////////////////// // 処理コードはここまで ///////////////////////////////////////// return xp; }
Counter: 1440,
today: 2,
yesterday: 1
最終更新: 2011-07-31 (日) 14:53:34 (JST) (4928d) by iseki