2

マンデルブロ集合の「ズーム」ビューとそれに関連する数学に関する一般的な質問があります。256X256ウィンドウサイズのマンデルブロ集合を値で実装しました

  // ImageWidth = ImageHeight = 256;

  double MinRe = -2.0;
  double MaxRe = 1.0;
  double MinIm = -1.2;
  double MaxIm = 1.8;

  ComputeMandelbrot();

次に、正方形の領域を選択します。これらは、左上端(76,55)と右下端(116、99)の座標です(辺44の正方形が選択されています)

だから、私は選ぶx2 = x1 + 44 ; y2 = y1 + 44;

これらの新しい座標を複素平面に変換するにはどうすればよいですか?そして、新しい値のセットに対してそれを計算するために、新しい実数値と虚数値はどのように変化しますか?

これは私がこれまでに試したことです。

double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);

double newMinRe = MinRe + (Re_factor* x1);
double newMaxRe = MaxRe + (Re_factor* x2);
double newMinIm = MinIm + (Im_factor* y1);
double newMaxIm = MaxIm + (Im_factor* y2);

// and then I compute c - real and c- imag values

  for(unsigned y=0; y<ImageHeight; ++y) 
{ 
  double c_im = newMaxIm - y*Im_factor;
  for(unsigned x=0; x<ImageWidth; ++x)
    {
      double c_re = newMinRe + x*Re_factor;

      // ComputeMandelbrot();

     }

 }

私は数学を理解するのに苦労しています、そしてまた「ズーム」ビューを生成することに関して、そしてどんな助けもありがたいです!!

4

1 に答える 1

7

これは線形スケーリングです。1Dでやってみましょう。画面スペース(画面座標)と画像スペース(この場合は複素平面)があります

  • 画面スペース=>[0、255]
  • 画像スペース=>[-2、1]

したがって、座標Xを画面スペースから画像スペースX'に変換するには

X'=(X / 255)*(1-(-2))+(-2)

それをより一般的にするために

  • 画面スペース=>[SMin、SMax]
  • 画像スペース=>[IMin、IMax]

X'=((X-SMin)/(SMax-SMin))*(IMax-IMin)+ IMin


あなたのコードでは、あなたは

double newMinRe = MinRe + (Re_factor* x1);

これは私が示したものと同等です。しかし、あなたはそうします

double newMaxRe = MaxRe + (Re_factor* x2);

これは正しくないので、

double newMaxRe = MinRe + (Re_factor* x2);

あなたのループで同じ問題、それはする必要があります

for(unsigned y=0; y<ImageHeight; ++y)  { 
  double c_im = MinIm + y*Im_factor;
  for(unsigned x=0; x<ImageWidth; ++x) {
    double c_re = MinRe + x*Re_factor;
    // ComputeMandelbrot();
  }
}

余分な良さのための追加の詳細:画像空間を適切にサンプリングするために、私はこれを提案します

for(unsigned SX = SMin; x < SMax; ++x) {
  double k = (double(SX + 0.5) - SMin) / (SMax - SMin);
  double IX = (k * (IMax - IMin)) + IMin;
}

+0.5の項は、ピクセルの真ん中でサンプリングすることです...

于 2011-12-05T06:38:55.470 に答える