|
1: 2011-07-30 (土) 23:19:33 iseki |
| + | *** mandel_proc [#iff2f1d9] |
| + | 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; // = (Ymax-Ymin)/ysize; // 刻み幅 |
| + | |
| + | 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; |
| + | } |