神奇的分形藝術: Mandelbrot集和Julia集

前言

這段時間看了一個關於維度的視頻介紹,嘆於其驚豔的多維幾何體和分形的視覺動畫效果。其實關於分形,已經有很成熟的分形軟件和應用場景,可以參看目前流行的分形軟件一覽,不過沒有及時更新,有些鏈接已經進不了,還有一個 分形藝術網
關於分形視頻的製作,有不同的製作辦法,例如,這位仁兄的作品:他的思路是通過Shader渲染,然後通過ffmpeg命令把圖片生成mp4視頻;也可以通過專業的分形軟件來做也可以在分形軟件基礎上定製開發;本文采用純Python實現,藉助MoviePy這個包來生成視頻或者gif動畫,本文只是提供有興趣的朋友,瞭解這個領域,並可以動手實踐體驗。
本文討論範圍侷限在 Mandelbrot集合和Julia集合。

Mandelbrot集合

如果英語還行,建議去維基百科讀英文 Mandelbrot集合

Mandelbrot集合是一個複數c的集合,c由 zn+1=zn2+cz_{n+1}=z_{n}^2 + c公式在z0=0z_0=0開始迭代而得到。得到的值可以組成一個數列,依次爲 c,c2+c,(c2+c)2+cc,c^2+c,(c^2+c)^2+c……。當該數列發散到無窮時,對應的點就屬於Mandelbrot集合。Mandelbrot集合是分形中最經典例子。

c=0c=0 時,顯然數列永遠是0,並不發散,因此 c=0c=0 不屬於Mandelbrot集合。

又如c=3ic=3i 時,對應的數列爲3i,9+3i,6351i,14316477j3i, -9+3i, 63-51i, 1431-6477j …. ,數字越來越龐大,因此3i就屬於Mandelbrot集合。

在二維平面上,將所有不屬於Mandelbrot集合的點標記爲黑色,將所有屬於Mandelbrot集合的點按照其發散速度賦予不同的顏色,就可以得到Mandelbrot的經典圖像:
在這裏插入圖片描述

請注意: Mandelbrot集合是在z0=0z_0=0時,不斷的迭代c得到。

在生成的Mandelbrot集合中,我們可以將圖像放大,選取某些區域進行生成,就可以得到格式各樣造型迥異的分形圖案。在Mandelbrot集合中,有很多地方圖案比較奇特,如下圖中的3個位置。
在這裏插入圖片描述
其中編號爲2的地方被稱爲“Elephant Valley”,因爲此處的圖案與大象很像,直接運行可以得到該區域的圖像:

 # Elephant Valley
 fractal.gen_mandelbrot(fractal.set_data(x_tuple=(.275, .28),
                                     y_tuple=(.006, .01)),
                        rgb=(.9, .6, .6)).save("mandelbrot_area.png")

在這裏插入圖片描述
編號爲3的地方被稱爲“Triple Spiral Valley”(三重螺旋),在mandelbrot_area.py修改一下座標位置爲(ratio調整的是顏色):

# 三重螺旋
fractal.gen_mandelbrot(fractal.set_data(x_tuple=(-.09, -.086),
                                        y_tuple=(.654, .657)),
                       rgb=(.2, .6, .6)).save("mandelbrot_3.png")
   

就可以得到該處的圖案:
在這裏插入圖片描述
最後編號爲1的地方被稱爲“Seahorse Valley”(海馬山谷),對應的座標爲:

 # Seahorse Valley(海馬山谷)
  fractal.gen_mandelbrot(fractal.set_data(x_tuple=(-.75, -.747),
                                          y_tuple=(.099, .102)),
                          rgb=(.1, .1, .3)).save("mandelbrot_sea.png")

圖像如下,確實和海馬有一點神似:
在這裏插入圖片描述

Julia集合

如果英語還行,建議去維基百科讀英文 Julia集合

Julia集合和Mandelbrot集合差不多,但這次我們固定c,轉而計算髮散的z的值。即c是固定的常數(可以任取),數列變成z,z2+c,(z2+c)2+cz,z^2+c,(z^2+c)^2 +c,……。如果該數列發散,對應的z集合就屬於Julia集合。我們看看不同的c值下Julia圖案的差別:

c=0.8350.2321ic = -0.835-0.2321i 時:
在這裏插入圖片描述

c=0.2850.01ic = 0.285 - 0.01i 時::
在這裏插入圖片描述

c=0.8+0.156ic = -0.8 + 0.156i,圖案又變得完全不同:
在這裏插入圖片描述

c=0.8350.2321ic = -0.835 - 0.2321i,圖案又變得完全不同:
在這裏插入圖片描述

c=0.701760.3842ic = 0.70176 - 0.3842i,圖案成爲樹狀:
在這裏插入圖片描述

生成Julia集合的動畫

在Julia集合中,每次都對c的值進行微小的改變,並將依次生成圖片製作爲gif,就可以生成如下所示的動畫: 從這裏下載觀看, 好像不允許上傳gif。程序中提供了一個width參數,可以修改它以生成更大尺寸,質量更高的動畫圖像。

代碼實現

代碼採用TensorFlow實現, 比較簡單,可以從這裏下載代碼。希望你能點贊,反饋,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章