在我以前的這篇文章中,曾經介紹過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集也是大致如此,此處只貼原始圖,就不一一放大了
五次的:
六次的:
源代碼有嘗提供,有意者請留郵箱