Mandelbrot图实际上是由Mandelbrot集合构成的图像。
Mandelbrot集合的定义如下:
zn+1=z2n+c
其中,c是一个复数。加入给定一个复数 z0 ,比如 z0=0 ,那么这个递推式会生成一个序列: [z0,z1,z2,z3,...] 。如果这个序列收敛在一个有限值范围内,那么c就在Mandelbrot集合中。当序列中有一项的绝对值大于2时,这个序列一定趋向于无穷,一般说来,如果这个序列前60项都没有一项大于2,那么可以认为这时c就在Mandelbrot集合中。
下面的Matlab程序就是根据以上的原理写的,只不过为了使得图片更加炫酷,根据发散快慢(也即序列在第几项大于2)设置不同的颜色:
xc = 0; %图片中心点
yc = 0;
xoom = 1; %放大倍数
res = 512; %分辨率
iter = 100; %序列项数x0 = xc - 2 / xoom;
x1 = xc + 2 / xoom;
y0 = yc - 2 / xoom;
y1 = yc + 2 / xoom;x = linspace(x0, x1, res);
y = linspace(y0, y1, res);
[xx, yy] = meshgrid(x, y);
C = xx + yy * 1i;
z = zeros(size(C));
N = uint8(zeros(res, res, 3));color = uint8(round(rand(iter, 3) * 255));for k = 1: iterz = z.^2 + C;[row, col] = find(abs(z) > 2);k1 = zeros(size(row)) + 1;k2 = zeros(size(row)) + 2;k3 = zeros(size(row)) + 3;p1 = sub2ind(size(N), row, col, k1);N(p1) = color(k, 1);p2 = sub2ind(size(N), row, col, k2);N(p2) = color(k, 2);p3 = sub2ind(size(N), row, col, k3);N(p3) = color(k, 3);z(abs(z) > 2) = 0;C(abs(z) > 2) = 0;
end
imshow(N);
imwrite(N, 'test.png');
通过调整中心点和放大倍数的位置,可以看到不同地方的图像
下面是在(-1.478,0),放大300倍,看到的图像
调整序列项数,以及分辨率,可以得到更加精细的图片,下面是一个5000x5000分辨率,序列项数为10000的图片