跑程式時,畫出了漂亮的圖。下面是程式執行當中,先後擷取出來的兩張截圖。
會畫出這樣的圖案,完全是意料之外的事,因為變數實在太多了,從attractor和mover的數量和它們本身質量的大小,到它們所在的位置,以及萬有引力常數的大小,無不影響圖案的長相。一開始是用亂數隨便擺幾個attractor和mover,結果跑出來的圖案只能用慘不忍睹來形容,就亂糟糟的一團,活像被調皮的小貓咪蹂躪過的毛線團。
畫了老半天都畫不出至少可以看的圖案,突然想到Lorenz attractor那個像是蝴蝶展翅的漂亮圖案。「如果只用兩個attractor和兩個mover,說不定可以畫出類似的圖案。」一面想著,一面就試著畫看看。
嘿!蝴蝶展翅沒畫成,沒想到倒是出現了前面兩張截圖那樣的圖案。那個直立的桶子是其中一個mover的軌跡,而腰帶部分,則是另一個mover的軌跡。如果仔細觀察,可以發現所有的軌跡都沒有重複。所以囉,如果一直畫個不停,那個圖案最後看起來應該會是黑壓壓的一片。這也就是說,用一維的線,可以把二維的面給填滿,然後那個介於一維和二維之間的分數維度就冒出來了。碎形(fractal)很多迷人的圖案都有這種特性。
身為頂級藝術細胞缺乏者,總是非常羨慕那些能隨手畫出漂亮圖畫的人。看著自己寫的程式在螢幕上展現出事先無法預期的漂亮圖案,還真是很有成就感,也不免有些興奮地想著:「嘿!看來頂級藝術細胞缺乏者有藥醫了!」
畫那兩張圖的主程式放在 《The Nature of Code閱讀心得筆記——使用Python實作》 《The Nature of Code閱讀心得與Python實作》的第2.5節Exercise 2.12中。除了主程式之外,另外還需要Mover和Attractor這兩個class,也可以在該節中找到。
要結束這篇隨筆時,又忍不住手癢,創作了另一個漂亮的圖案,這次還加了點顏色上去。