我真的在这里摸不着头脑,努力理解我在某处读到的一句话:“我们在分形中放大的越多,我们最有可能需要执行的迭代越多”。
到目前为止,我还没有找到任何证明这样说的数学/学术论文。 我还设法找到一个计算mandelbrot集的小代码,取自这里: http://warp.povusers.org/Mandelbrot/ 但是,却无法理解缩放如何影响迭代。double MinRe = -2.0;
double MaxRe = 1.0;
double MinIm = -1.2;
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
unsigned MaxIterations = 30;
for(unsigned y=0; y<ImageHeight; ++y)
{
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
double c_re = MinRe + x*Re_factor;
double Z_re = c_re, Z_im = c_im;
bool isInside = true;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = false;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside) { putpixel(x, y); }
}
}
谢谢!
答案 0 :(得分:1)
这不是一个科学的答案,而是一个具有常识的答案。理论上,要确定一个点是否属于Mandelbrot集,您应该无限地迭代 ,并检查该值是否达到 Infinity 。这几乎没用,所以我们做出假设:
当您放大Mandelbrot集时,第二个假设仍然有效。但缩放表示增加点坐标的重要小数位数。
假设您从(0.4,-0.2i).
开始
迭代此值会增加使用的数字,但不会丢失有效数字。现在,当您的点坐标看起来如此:(0.00000000045233452235, -0.00000000000943452634626i)
来检查该点是否在集合中,您需要更多的迭代来查看该迭代是否会达到2,更不用说如果您使用某种Float类型,将在某个缩放级别丢失有效数字,您将不得不切换到任意精度库。
尝试是你最好的朋友:-)计算一个低迭代和高迭代的集合,并从第一个图像中减去第二个图像。您将始终看到边缘处的变化(黑色像素与彩色像素相遇),但如果您的缩放级别很高(意味着:点坐标有很多小数位数),您将获得不同的图像。
答案 1 :(得分:1)
你问过缩放是如何影响迭代的,而我的典型缩放比例是如果放大到第9个大小我会将迭代次数增加1.7。当然,大小的第9个意味着宽度和高度都除以3。
使这更通用我实际上在我的代码中使用它
Complex middle = << calculate from click in image >>
int zoomfactor = 3;
width = width / zoomfactor;
maxiter = (int)(maxiter * Math.Sqrt(zoomfactor));
minimum = new Complex(middle.Real - width, middle.Imaginary - width);
maximum = new Complex(middle.Real + width, middle.Imaginary + width);
我发现缩放和迭代之间的这种关系非常好,分形中的细节在深度缩放上仍然很好,而不会过快地对迭代过于疯狂。
如果您想要缩放的速度有多快,我喜欢3的缩放因子,但任何事情都有。重要的是你需要保持zoomfactor和interations之间的关系。