自然界中樹木分枝、雪花結晶那樣複雜又充滿規律的圖案是不是可以用一些數學規則來描述和生成呢?
什麼是 L-System?
L-System 最初由匈牙利生物學家 Aristid Lindenmayer 於 1968 年提出,用於模擬植物的生長過程。它本質上是一套符號重寫規則,從一個初始字串(稱為「公理」Axiom)開始,透過迭代應用這些規則,生成一系列越來越複雜的字串。這些字串隨後可以被解釋為繪圖指令,從而產生視覺化的圖形。
關於細節可以看他的書 The Algorithmic Beauty of Plants
L-System 是一套符號重寫系統。想像一下,你有一串初始的符號字串,然後你定義了一些規則,告訴程式如何將字串中的特定符號替換成另一串符號。
我對這個東西有陣子很著迷,所以就寫了一個生成器來玩玩
https://chihhsiangchien.github.io/L-system/index.html
L-System 的核心
公理 (Axiom): 這是 L-System 的起始狀態或初始字串。它通常是一個非常簡單的字串,例如 F 或 F-F-F-F。在我的程式中,你可以在 "Axiom" 輸入框中設定這個初始字串。
規則 (Rules): 這是 L-System 的生成引擎。規則定義了如何將字串中的特定符號(稱為「前驅」predecessor)替換成一個新的字串(稱為「後繼」successor)。 例如,一條簡單的規則可能是: F -> F+F-F 這表示,在每次迭代中,字串中所有的 F 符號都會被替換成 F+F-F。
機率性規則: 允許一個符號根據不同的機率被替換成不同的字串,為圖形帶來隨機性和多樣性。例如: F 0.5 -> F[+F]F (50% 機率) F 0.5 -> F[-F]F (50% 機率)
上下文相關規則 (Context-sensitive): 規則的應用可以取決於符號的「鄰居」是什麼。例如: A < B > C -> X 這表示只有當符號 B 的左邊是 A 且右邊是 C 時,B 才會被替換成 X。
迭代 (Iteration): 從公理開始,程式會重複地將規則應用於現有的字串。每一次完整的應用稱為一次迭代。隨著迭代次數的增加,字串會變得越來越長,越來越複雜。在我的程式中,每點擊一次 "Generate" 按鈕,就會執行一次迭代。
從字串到圖形:海龜繪圖的詮釋
生成了複雜的字串後,我們如何將它變成視覺化的圖形呢?這通常是透過一種稱為「海龜繪圖 (Turtle Graphics)」的機制來實現的。
想像有一隻小海龜在畫布上,它會讀取 L-System 生成的字串中的每一個符號,並根據符號執行特定的動作:
F, G, L, R, Fl, Fr 等: 向前移動一定距離並畫線。
f: 向前移動但不畫線。
+: 向左轉動一個預設的角度。
-: 向右轉動一個預設的角度。
[: 保存目前海龜的狀態(位置和方向),通常用於開始一個分支。
]: 恢復到上一次保存的海龜狀態,通常用於結束一個分支,回到分叉點。
X: 在目前位置畫一個小標記(在我的程式中是個小圓圈)。
你可以透過 "Angle" 輸入框來設定 + 和 - 指令的轉向角度,改變不同圖案的樣貌。
透過這些基本的公理、規則和繪圖指令,L-System 就能生成出千變萬化的圖案。