燃燒船分形(Burning Ship fractal)

最近偶然看到一個博客標題是Burning Ship fractal,就懷著十足的好奇心點進去看了下。畢竟fractal大家都知道,中文分形可能連小朋友都聽說過。實在好奇分形跟燃燒著的船有什麼關係?

點進去一看,就看到了本文題圖的這副畫——看「火焰「的部分,的的確確應該是分形沒跑了;看整體,的確像一個迎面開來的船頭。不知道是誰設計出這個分形,又聯想到燃燒著的船的,真的是腦洞大開!

wiki了一下子,原來The Burning Ship fractal是Michael Michelitsch和Otto E. R?ssler在1992年通過下面公式反覆迭代畫出來的:

f(z) =(|Re(z)+|Im(z)|)^{2} +c ,這裡的z,c,f都是複數。

相比之下,

比較著名的Mandelbrot 分形的 函數是:

Z_{n+1} =Z_{n}^{2} +c

而燃燒船分形的函數則是取平方前實部虛部都取絕對值:

Z_{n+1} =(|Re(Z_{n})+|Im(Z_{n})|)^{2} +c

僅僅是多了一個取絕對值的步驟,畫出的分形圖就相隔十萬八千里:Mandelbrot多少帶著對稱、自然螺旋之類的「規律」結構,而Burning Ship就真的像個歪斜著迎面開來的帶著火焰的船而已。

Wikipedia上眾所周知的Mandelbrot分形:

原始整體圖:

局部放大的海馬尾巴:

看到迭代公式這麼簡單,忍不住自己用Matlab畫一下。當然結果就沒有那麼酷炫了,畢竟只寫了基本的流程,剩下連線配色等等並沒有做。

figure;hold onnxlim([-2.5 1])nylim([-1 1])nnfor k=1:10000n x0=rand(1)*3.5-2.5; %(-2.5,1)n y0 = rand(1)*2-1; %(-1,1)n x=0;n y=0;n iter=0;n max_iter=1000;nnn while(x*x+y*y<4 && iter<max_iter)n xtmp = x*x-y*y+x0;n y = 2*x*y +y0;n x = xtmp;n iter = iter+1;n plot(x,y)n endnendn

Mandelbrot大概的框架可以看出來了,只是需要增加迭代次數,以及將隨機分配的參數c改為遍歷。此外加一個配色看上去就酷炫多了。

燃燒船的代碼就是在上面代碼基礎上加上求絕對值,不再贅述了:

腦洞開得大一點的話還是很匹配本文題圖的 :-P

更多高清大圖可以參考wiki頁面:Burning Ship fractal


推薦閱讀:

拉普拉斯運算元
GitHub|教你快速使用Tensorflow/Elasticsearch實現全文的圖片搜索(附源代碼)
顏色保衛戰與VOT2016
1.23【OpenCV圖像處理】直方圖均衡化和計算

TAG:分形理论 | 图像处理 | 复变函数 |