兔子與 L-System

Grasshopper 的 Rabbit 是專門處理細胞自動機(Cellular Automata; CA)和 L-System (Lindenmayer System)的套件。本文將介紹 Rabbit 跑 L-System 的例子。

[測試環境:Rhino 4 SR9 + Grasshopper 0.9.0014 + Rabbit 0.3.1]

本文不意圖對 L-System 做詳細解說,如果對 L-System 觀念不熟,建議請先參閱 Wikipedia 的介紹。此外,也務必閱讀、收藏經典著作 The Algorithmic Beauty of Plants,作者之一就是 Lindenmayer!

回到 Rabbit 套件,當中處理 L-System 的有三個元件,這裡介紹常用的兩個:

LSystem
此元件根據初始狀態(A)和規則(PR)產生 L-System 符號字串。
輸入參數有:
  • A (Axiom): 定義初始狀態。
  • PR (Production Rules): 定義規則。
  • n (Number of Generations): 迭代次數。
輸出值為:
  • W (Word): 生成的最終符號字串(一般只需用這個回傳值)。
  • LW (List of Words): 所有迭代過程所產生的字串。
  • LS (LSystem Object): 回傳完整的 LSystem 物件。

Turtle
承襲自 Logo 語言的繪圖烏龜,此元件將 LSystem 符號字串轉換為線條。
會用忍者龜當元件圖示,大概可以猜到 Rabbit 作者的年紀吧(笑)。
輸入參數:
  • S (Source String): 規則字串。
  • L (Step Length): 步伐長度。
  • dL (Step Length Scale): 步伐長度縮放比例。
  • A (Angle): 角度。
  • dA (Angle Scale): 角度縮放比例。(尚未作用)
  • O (Initial Position and Orientation): 初始位置與方位。
  • TS (Tube Settings): 管狀形體設定。
輸出值為:
  • E (Edges): 依據規則生成的線條。
  • V (Vertices): 依據規則生成的點(透過符號J)。
  • T (Tube geometry): 管狀形體。
  • P (Turtle Orientation Planes): 烏龜的工作面。
  • S (Section profiles): 剖面線。
而在 Rabbit 裡可用的 Axiom 和 Production Rules 規則符號包括:
  • F 往前一步 L(步伐長度) 同時畫線
  • f 往前一步 L(步伐長度) 但不畫線
  • + 左轉 A(預設角度) 度
  • - 右轉 A(預設角度) 度
  • \ 左傾 A(預設角度) 度
  • / 右傾 A(預設角度) 度
  • ^ 上仰 A(預設角度) 度
  • & 下俯 A(預設角度) 度
  • | 迴轉 180 度
  • J 插入一個點(Vertex)
  •  目前長度乘上 dL(長度縮放)
  • ! 目前粗細乘上 dT(粗細縮放)
  • [ 開始分支(儲存烏龜方位)
  • ] 結束分支(恢復烏龜方位)
  • A/B/C/D.. 符號運算用的變數
其中左轉(turn left)、右轉(turn right)、左傾(roll left)、右傾(roll right)、上仰(pitch up)、下俯(pitch down)分別對應到三軸的旋轉,故可生成三維的 L-System。要留意這些旋轉都是相對的,四次右轉90度會回到原來位置。此外,Turtle 元件雖然有 dA 參數,文件中卻沒有提到相對應的規則符號,經與作者聯繫後得知目前版本尚未實作 dA,預計下一版會提供。

Rabbit 所附的範例清楚展示了各種不同的可能性,包括生成規則(PR)和長度、角度、工作面的變化:

一般 L-System 初學者會對 X, Y, A, B 之類的變數都會感到困惑,不知何時該用、以及怎麼用。變數只有在生成符號字串時有作用,在繪圖上則沒有實質作用。

若不使用變數, L-System 的變化比較有限,只有 F 可供置換,所產生的圖形也相對較為規則,如:
Axiom: F
Rule: F = F[-F]F

使用變數後,則可定義更複雜的置換規則:
Axiom: F
Rules: F = F[-XF]F, X = F[X]

甚至分支型態的多樣化:
Axiom: F
Rules: F = F[-XF]YF, X = F[X], Y = [+FY]

上述三個例子的程式在此:點選下載

留言