Lazy Nezumi Pro 的 L-System 教程(一)

語言: CN / TW / HK

theme: channing-cyan

本文已參與掘金創作者訓練營第三期「高產更文」賽道,詳情檢視:掘力計劃|創作者訓練營第三期正在進行,「寫」出個人影響力

14.04.14 版本開始,Lazy Nezumi Pro 可以幫助你使用指令碼引擎的 L-System 函式繪製複雜的形狀和分形

本教程將逐步教你如何使用這些函式。

所有函式和指令符號的參考表都可以在指令碼參考頁面找到。

定義

L-System 定義為: - 一套稱為字母表(alphabet)的符號。 - 一串這些符號稱為公理(axiom)的字串,它定義了系統的初始狀態。 - 描述每次系統迭代時這些符號應如何轉換的一組規則(rules)。

該系統將被迭代多次,符號將根據規則進行更改。這將產生最後一串符號的字串,這些符號將被解讀為繪製形狀而移動筆的指令。

例子 1 - 科赫曲線(Koch Curve)

讓我們從一個著名的 L-System 開始: 科赫曲線。

js 字母表: F, +, - 公理: F 規則: F = F-F+F+F-F 如果我們從公理(axiom)開始,並使用給定的規則來替代 F,系統的演變如下:

js 第一次迭代後**: F-F+F+F-F 第二次迭代後**: F-F+F+F-F - F-F+F+F-F + F-F+F+F-F + F-F+F+F-F - F-F+F+F-F 第三次迭代後**: F-F+F+F-F - F-F+F+F-F + F-F+F+F-F + F-F+F+F-F - F-F+F+F-F -\ F-F+F+F-F - F-F+F+F-F + F-F+F+F-F + F-F+F+F-F - F-F+F+F-F +\ F-F+F+F-F - F-F+F+F-F + F-F+F+F-F + F-F+F+F-F - F-F+F+F-F +\ F-F+F+F-F - F-F+F+F-F + F-F+F+F-F + F-F+F+F-F - F-F+F+F-F -\ F-F+F+F-F - F-F+F+F-F + F-F+F+F-F + F-F+F+F-F - F-F+F+F-F

怎麼用這個來畫東西呢? 我們從左到右讀取最後一個字串。每次遇到 F 符號,我們就畫一條直線。如果我們遇到一個 - 或 + 符號,則向左或向右轉 90 度。

下圖顯示了結果

image.png

L-System 指令碼程式設計

那麼我們如何在 Lazy Nezumi Pro 中使用它呢? 從建立一個新的預設開始。在其細節面板中,啟用指令碼。選擇自定義模式,並將以下程式碼貼上到文字框中:

js lsysAxiom("F"); lsysRules("F=F-F+F+F-F"); lsysDrawSymbols("F"); lsysAngle(90); lsysLength(length); lsysIterations(iterations); lsysAdvance();

然後繼續並單擊 Compile 。因為這個程式有兩個使用者變數,應該會出現兩個引數滑塊: 長度(Lenth)和迭代(Iteration)。點選它們的 “…” 按鈕,將它們的範圍設定為比 [0..1] 更有意義的值。

長度 (用 lsylength 函式設定) 是筆每次在系統遇到繪製符號(Draw Symbol,在本例中是 F,用 lsysDrawSymbols 函式設定)時所移動的距離。值在 10 左右應該是個不錯的開始。

迭代(用 lsysIterations 函式設定)是在編譯程式後應該在系統上執行的迭代次數。注意這一點: 如果您有高度遞迴的規則,設定大量的迭代將花費很長時間來計算最終的系統字串(並且應用程式可能會有一段時間沒有響應)。通常您不需要進行超過 10 次的迭代,所以將範圍設定在 0 到 10 之間。

lsysAdvance 外的所有 L-System 函式只在程式編譯時使用。當您正在繪製時,lsysAdvance 將遍歷至最後一個 L-System 字串,直到找到一個繪製符號,此時它將移動當前筆的位置並返回。這個位置儲存在 oxoy 變數中。

如果開啟 Scripting Graph 視窗,可以在更改引數時看到生成的 L-System 的預覽。在你的美術應用中繪製L-System可能需要一些時間,所以最好先檢視預覽,以便大致瞭解你將得到什麼。

2233.gif