植物的演算法美:如何敲出一個漂亮的 Sunflower

植物的演算法美:如何敲出一個漂亮的 Sunflower

來自專欄 Hewes的編程藝術

「Beauty is bound up with symmetry.」

——(加)普魯辛凱維奇、(加)林德梅葉《The Algorithmic Beauty of Plants》( CSDN下載,譯為《植物的演算法美》)

植物的魅力吸引了數學家們幾個世紀的關注,諸如葉片的雙側對稱,花朵的旋轉對稱以及松果中的鱗片的螺旋排列等明顯的幾何特徵已被廣泛地研究。

《The Algorithmic Beauty of Plants》探討了植物結構美的另外兩個因素——首先是簡單而優雅的生成演算法,即描述植物發育的規則;其次是其自相似性。

Erickson 和 Jean 嘗試以純粹的幾何描述合成逼真圖像的模型,藉此呈現螺旋葉狀圖案的花和果實。

Phyllotaxis,在螺旋葉狀圖中,可見的螺旋,通常是斐波那契數列的兩個連續元素:

1,1,2,3,5,8,13,21,34,55 ......

其中每個數字是前兩項的總和。發生這種情況時,連續的葉子或植物元素之間的角度是接近黃金角:137.5°。這是不是很神奇。

長時間的觀察,他們得出了以下公式:

這看起來是非常簡便的數學公式。Mike Bostock 使用 HTML 實現了它:

現在,我們試著在 Processing 中來實現 sunflower 的生長,代碼非常簡單:

/* * Phyllotaxis * By Hewes * Further reading: Hewes 的編程藝術(https://zhuanlan.zhihu.com/c_123529691) * */float n = 0;float c = 6;ArrayList<PVector> points = new ArrayList<PVector>();float start = 0;void setup() { size(500, 500); colorMode(HSB, 360, 255, 255);}void draw() { background(0); translate(width / 2, height / 2); rotate(n * 0.3); for (int i = 0; i < n; i++) { float a = i * radians(137.5); float r = c * sqrt(i); float x = r * cos(a); float y = r * sin(a); float hu = i+start; hu = i/3.0 % 360; fill(hu, 255, 255); noStroke(); ellipse(x, y, 4, 4); } n += 5; start += 5; if (keyPressed) { // 保存圖片 saveFrame("Phyllotaxis.jpg"); }}

示例效果:

當137.5°變成137.3° 或者 137.6°後……

如果你在學習過程中,創造出令人驚艷的效果,歡迎@ Hewes。


推薦閱讀:

海洋是怎麼形成的呢?
天王星雲層與臭雞蛋有什麼共同之處?
原來考拉和人類的指紋最接近,幾乎完全一樣
陳成猛:石墨烯的守望者 | 「35歲以下科技創新35人」中國榜單專欄
祛除果蔬中的殘留農藥,就靠它了。

TAG:自然科學 | 演算法 | Processing編程語言 |