再谈mandelbrot集
在我以前的这篇文章中,曾经介绍过Mandelbrot集,并给出了c++的实现方法。当时的我编程水平有限,用了很多笨办法,最终的效果图也不是很美观。主要问题有两个:第一,我以前的着色方法是把每个坐标点的模值映射到一个RGB值,然后画出来。这样做带来了一个很大的问题,那就是分形图案的发散速度是非常快的,迭代一些次数之后,其模值会很快超过double的有效范围,所以导致画出来的图又难看又不准。于是经过改进,我把每个像素点的不超过规定模值的最大迭代次数作为其颜色的标签,这样一来,既加快了运算速度,图形也变的准确美观了。第二个问题是颜色分配,我以前的方法是手工分配,这样既麻烦又不好看。我试验了一些方法之后,发现用小质数作为随机因子再对255取余的方法是最简单有效的,具体可以参阅后面的代码。
先说传统意义上的Mandelbrot集:对于复平面上的每一个点c, 用以下方法进行迭代:
a = 0;
while( a的模 < 4.0 且 迭代次数 < 阈值) //4.0 这个值的来源可以看wiki上的说明
{
a = a * a;
a = a + c;
}
得到的图形就是Mandelbrot集
分形图案的最大特点就是自相似性,每一个局部都有整体的特征。
注意到传统Mandelbrot集的迭代规则是a先平方,然后把结果加上该点的坐标。如果把平方改成立方会是什么样子呢?也是说把while循环里的内容改成这样:
a = a * a * a;
a = a + c;
像三次函数一样,3次Mandelbrot集的分形图案多了一个分叉,看上去大致是这样的:
类似的,4次Mandelbrot集是这个样子:
五次、六次的mandelbrot集也是大致如此,此处只贴原始图,就不一一放大了
五次的:
六次的:
源代码有尝提供,有意者请留邮箱