#author("2023-08-29T04:25:55+00:00","default:iseki","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;            // 刻み幅
    
    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;
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 ページ一覧 検索 最終更新   ヘルプ   最終更新のRSS