如何执行简单放大到Mandelbrot集 [英] How to perform Simple Zoom into Mandelbrot Set

查看:160
本文介绍了如何执行简单放大到Mandelbrot集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个普遍的问题,Mandelbrot设置缩放视图和与它有关的数学。我已经实现了256 X 256窗口大小的mandelbrot集合与值

  // ImageWidth = ImageHeight = 256; 

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

ComputeMandelbrot();

接下来,我选择一个正方形区域,这些是最左上角的坐标,55)和最右底部尖端(116,99)



所以,我选择 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);

//然后我计算c - real和c-imag值

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

}

}

很难理解数学,并且关于生成'缩放'视图和任何帮助。

解决方案

这是一个线性缩放。让我们在1D中做。您有屏幕空间(屏幕坐标)和图像空间(在您的情况下,复杂的飞机)




  • 屏幕空间= 0,255]

  • image space => [-2,1]



将坐标X从屏幕空间转换为图像空间X'



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

使其更通用




  • screen space => [SMin,SMax]

  • image space => [IMin,IMax]



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






在您的代码中, / p>

  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项是在像素中间右取样。 。


I have a general question with the Mandelbrot set "zoom" view and the math pertaining to it. I have implemented the mandelbrot set for the 256 X 256 window size with values

  // ImageWidth = ImageHeight = 256;

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

  ComputeMandelbrot();

Next, I select a region of square and these are the coordinates for the upper left most tip (76,55), and rightmost bottom tip (116, 99) (square of side 44 is chosen)

so , I choose x2 = x1 + 44 ; y2 = y1 + 44;

How do I translate these new coordinates to the complex plane ? and how would the new real and imaginary values change in order to compute it for the new set of values ?

This is what I have tried so far..

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

     }

 }

I am having a hard time figuring out the math, and also with regards to generating a 'zoom' view and any help is appreciated !!

解决方案

It's a linear scaling. Let's doing it in 1D. You have the screen space (screen coordinates), and the image space (the complex plane, in your case)

  • screen space => [0, 255]
  • image space => [-2, 1]

So to convert a coordinate X from screen space to image space X'

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

To make it more generic

  • screen space => [SMin, SMax]
  • image space => [IMin, IMax]

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


In your code, you do

double newMinRe = MinRe + (Re_factor* x1);

which is equivalent to what I show. But then you do

double newMaxRe = MaxRe + (Re_factor* x2);

which is not correct, and should be

double newMaxRe = MinRe + (Re_factor* x2);

Same problem in your loop, it should be

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


Additional detail for extra-goodness : to sample properly the image space , I suggest this

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

The +0.5 term is to sample right in the middle of the pixel...

这篇关于如何执行简单放大到Mandelbrot集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆