Как выполнить простое увеличение в наборе Мандельброта - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть общий вопрос с представлением Мандельброта «зум» и математической информацией, относящейся к нему.Я реализовал набор mandelbrot для размера окна 256 X 256 со значениями

  // 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();

     }

 }

У меня естьтрудно разобраться в математике, а также в том, что касается создания «зума», и любая помощь приветствуется !!

1 Ответ

7 голосов
/ 05 декабря 2011

Это линейное масштабирование. Давайте делать это в 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 - это выборка прямо в середине пикселя ...

...