當前位置:
首頁 > 知識 > 自繪Mandelbrot集合(二)

自繪Mandelbrot集合(二)

三、專業軟體


首先,如果你的目的只是繪製Mandelbrot集合的圖像,而不在乎了解其中的具體原理,那麼我推薦你使用專門的分形繪製軟體。這些軟體有繪製多種分形的能力,大量可自定的設置,更快的運行速度,其開發人員也有多年分形繪圖的專業知識。我要在這裡介紹的區區一百五十行程序,無論在功能和性能上,都不可能與之相比。你可以在網上搜索引擎中尋找這些軟體,也可參照參考文獻中維基百科Fractal-generating software條目。有興趣的朋友可以注意一下其中兩個軟體。


一是Kalles Fraktaler,這是一款開源軟體,放大功能極其強大。前面提到分形的特徵是自相似,無論放大多少倍,都能在那個尺度找到和整個集合相似的局部。於是網上有一些分形愛好者製作了不少「深度放大」視頻,從整個Mandelbrot集合開始不斷放大某個局部。有人使用Kalles Fraktaler製作了放大倍數高達1010000的視頻,這意味著如果最終的畫面大小是1毫米邊長,那麼按這個尺度把最初的Mandelbrot集合整個顯示出來的話,畫面邊長會約是109981光年。而可觀測宇宙的直徑,也只不過是約1000億也即1011光年。

二是Ultra Fractal,可以免費試用的商業軟體。它的各項功能都極其強大,是分形繪製的專業軟體。本文中試圖模仿風格的英文維基百科Mandelbrot set條目中「放大」系列的十幾幅圖像,就是一位叫Wolfgang Beyer的德國物理學家使用Ultra Fractal軟體繪製出來的。


如果你願意了解一下Mandelbrot集合圖案繪製的原理,那麼就請繼續閱讀本文。


四、區域坐標和點彩繪圖


為了確定我們要繪製的圖形區域,必須先介紹區域坐標這個概念。一個複平面上的點可以由一個複數來定義,也即兩個實數,分別是此複數的實部和虛部。我們用這樣兩個實數OX和OY來表示要繪製的區域的中心點。還需說明所繪製區域的大小,我們用一個實數WIDTH來說明此區域的寬度,而用另一個實數RATIO來說明此區域的高寬比。這四個參數完全確定了一個複平面上長方形區域,它的中心點在複數OX+OYi處,寬WIDTH,高WIDTH*RATIO。這就是這個區域的坐標。本文中我們用「OX + OYi @ WIDTH /RATIO」這樣的形式來表示區域坐標。比如本文第一幅圖像下的標註「-0.7436438885706 + 0.1318259043124i @ 0.0000000041493 /0.75」即是說,這幅圖形所繪的Mandelbrot集合局部區域在複平面上的中心點位於-0.7436438885706 + 0.1318259043124i,寬度為0.0000000041493,高寬比3/4。

在本文大部分我自繪的圖像下,我都標出了它所繪的區域坐標,以便讀者查詢驗證。


要指出的是,區域坐標和最終繪出的圖像的高寬比是一致的,但區域坐標和最終繪出的圖像的大小(圖像的寬度,也即橫向的像素數)是無關的。圖像的寬度是一個整數,而區域的寬度則是一個實數(通常遠遠小於1)。同一個區域坐標用不同寬度的圖像繪製,畫出來的總是Mandelbrot集合的同一個地方,只不過寬度越大,圖像就越清晰,當然繪製時間也和此值的平方成正比。比如下面三幅圖像繪製的都是同一區域坐標的圖像,但寬度分別為100、200和500像素。

自繪Mandelbrot集合(二)



Mandelbrot集合的繪製原理則很簡單,用短短一段話就可以概括:

「如何畫一幅寬為w個像素,高為h個像素的圖像?只要為每個像素計算一下它該是什麼顏色,然後在相應位置畫上這種顏色,畫完所有w*h個像素,圖像就繪製完成了。」


這話的風格聽起來有點象那個笑話:「如何把大象裝進冰箱?把冰箱門打開;把大象放進去;把冰箱門帶上。」不過我們從中至少可以知道,為了編製此程序,在具體畫圖的方面我們只要了解如何在所使用的計算機語言里畫點就可以了,而不需要了解如何畫直線、曲線或色塊。這種畫法有點類似於繪畫中新印象主義,或稱點彩畫派的風格,只是我們將要使用的顏色種類要多得多。這同樣也大大降低了把程序從一種語言移植到另一種語言的難度;因為在不同語言間,普通的整數和浮點運算甚至是流程控制的的寫法的區別通常不大,但在畫圖的編程介面方面則往往區別相當大。


文章接下去的幾節將要引入能運行卻什麼都不幹(其實還是能畫出一個紅色長方形來)的程序代碼,大概是本文中最沒有意思的部分。不過雖然大家都想看的其實只是把大象裝冰箱的第二步,但畢竟打開和關上冰箱門也是必不可少的步驟,不能不做。


五、開發工具準備


從理論的角度來看,Mandelbrot集合的繪製原理並不依賴所使用的計算機語言。只要是一門能夠進行一定精度的浮點運算,並且能夠點彩也即在指定位置的像素上繪製指定顏色的語言(所有的實用計算機語言大概都有這樣的功能),都可以運用這個原理來繪製Mandelbrot集合圖像。但實際上介紹程序編製的文章常有的一個尷尬之處,就是要選定具體的編程語言,一下子就把無法或懶得使用這種語言的許多人擋在門外。本文也不能避免這點。

我在這裡選擇的第一門語言是Java。首要原因是我對它比較熟悉;其次它也被相當廣泛地運用,所以熟悉的人也比較多。但編譯和運行Java程序必需安裝一些開發工具如JDK,如果平時就在電腦上使用Java的人要嘗試我的Java版程序沒有問題,沒有這些開發工具的朋友就比較麻煩。而我也無意在此介紹如何編譯運行Java程序,只假設要嘗試Java代碼的朋友已經知道這些事情如何做了。


所以我同時也給出內嵌JavaScript程序的HTML頁面源碼。這樣你只要打開一個文本編輯器,拷貝粘貼我給出的源碼,存成後綴為html的文件,再用網路瀏覽器打開即可運行程序。一般流行的較新版本的網路瀏覽器均可,如Chrome,Firefox或Internet Explorer等等,推薦使用Chrome。為了只需要解釋一次代碼,我將JavaScript代碼寫得盡量類似Java版本的,結果就是寫出的JavaScript代碼充滿了濃厚的Java味道,而且做了一些無用功,比如整數的顏色代碼和它的紅綠藍分量之間沒有必要地互相轉換。同時我無意使用面向對象的編程,一來許多計算機語言並不支持面向對象的編程,二來實現它的語法在Java和JavaScript中有很大不同,會使兩套程序的區別沒有必要地增加。說到底,這裡給出的程序源碼只是一個例子,目的是說清原理並能很快試用。如果你想要實際地應用它,必須進行深刻的改寫和重構。

自繪Mandelbrot集合(二)


(待續)


參考文獻:


[1] 維基百科Mandelbrot set條目https://en.wikipedia.org/wiki/Mandelbrot_set


[2] 維基百科Fractal-generating software條目https://en.wikipedia.org/wiki/Fractal-generating_software


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科學公園 的精彩文章:

科普公眾號「科學公園」簡介
結構如此複雜的多糖,現在可以人工合成了
南懷瑾,他真的配得上「國學大師」嗎?
黃河象:生活在黃土高原的遠古巨象
優秀微信公眾號推薦

TAG:科學公園 |

您可能感興趣

自繪Mandelbrot集合(三)
自繪Mandelbrot集合(四)
自繪Mandelbrot集合(六)
自繪Mandelbrot集合(五)
自繪Mandelbrot集合(七)
自繪Mandelbrot集合(一)
C 集合(Collection)
Java集合-LinkedList
Java集合——LinkedList
Java集合-ArrayList
Java集合——ArrayList
前端數據存儲方案集合(cookie localStorage等)以及詳解(一)
Hacking Tools搜羅大集合
WidgetLayout:一組繼承於 ViewGroup 的自定義容器集合
最佳cosplay鑒賞!PAX South遊戲展Coser大集合
Java集合-HashSet
《Fate/Apocrypha》第二集,黑方陣營英靈大集合
傳奇 Logo 大集合,Nike Presto X 「LEGACY」 定製版
見色起意!Nike Free RN Flyknit跑鞋大集合