編程模擬自然(三):更好的靜態樹算法


序·吳剛伐桂篇

  舊言月中有桂,有蟾蜍,故異書言,月桂高五百丈,下有一人常斫之,樹創隨合。 

  (前情提要:元通過天闕裂縫離開了他所在的世界...)  

  “汪...”一聲猿嘯從天際傳來。

  吳剛抬頭看了看天,沒有發現什么,只當是出現了幻聽。

第零章 提出問題

  元通過細致地觀察與思考,他發現月桂樹是另外一種生長方式,和自己在伊甸園里種的完全不同。

圖3-1 程序渲染隨機樹

  “這顆樹的全稱為 Graphics User Interface Tree,中文簡稱:桂樹。”

第一章 作出假設

  元用假設解開了自己的疑惑:每個樹枝都是一個獨立的結點,它可以向上再生長 n 個樹枝結點。

圖3-2 較少枝干的樹

第二章 制定計划

  元立即制定了實現假設的方案。

  樹枝生長步驟

  首先,長出第一個樹枝(樹干)

  然后,每個樹枝的頂部長出不少於一個樹枝

  其中,每個樹枝的粗為上一層 0.618 倍,長度為上一層的 0.618*random(1) 倍

  最終,重復第二步,直至樹枝不能更細,或者迭代深度達到上限

圖3-3 光禿的樹

第三章 實踐檢驗

  元想到:實踐是檢驗真理的唯一標准。

  每個樹枝的頂部用一個向量表示,生長出的子樹枝旋轉一定角度並改變模長即可。

Imports System.Numerics
Imports EDGameEngine.Core.Utilities
''' <summary>
''' 樹節點
''' </summary>
Public Class TreeNode
    ''' <summary>
    ''' 相對位置
    ''' </summary>
    Public Property Location As Vector2
    ''' <summary>
    ''' 絕對位置
    ''' </summary>
    Public Property RealLocation As Vector2
    ''' <summary>
    ''' 長度
    ''' </summary>
    Public Property Length As Single
    ''' <summary>
    ''' 層級
    ''' </summary>
    Public Property Rank As Integer
    ''' <summary>
    ''' 父級
    ''' </summary>
    Public Property Parent As TreeNode
    ''' <summary>
    ''' 子集
    ''' </summary>
    Public Property Children As New List(Of TreeNode)
    ''' <summary>
    ''' 花集
    ''' </summary>
    Public Property Flowers As New List(Of Flower)
    ''' <summary>
    ''' 中折角度
    ''' </summary>
    Public Property MidRotateAngle As Single
    ''' <summary>
    ''' 生長比例
    ''' </summary>
    Public Property Percent As Single
    ''' <summary>
    ''' 凋零比例
    ''' </summary>
    Public Property DiePercent As Single

    Public Shared Property Rnd As New Random

    ''' <summary>
    ''' 創建並初始化一個實例
    ''' </summary>
    Public Sub New(location As Vector2, length As Single, rank As Integer)
        Me.Location = location
        Me.Location.SetMag(length)
        Me.Length = length
        Me.Rank = rank
        Me.MidRotateAngle = CSng(Rnd.NextDouble)
    End Sub
End Class

  “把樹畫出來就知道結果了。”

第四章 得出結論

  樹長成了,元打算撰寫一篇探究實驗報告。

  “這片天地與我創造的世界確實不一樣,竟然長成這副樣子。”元有些郁悶。

圖3-4 水墨樹

后記

  “哼哼,終於逮住你了。”

  ...

  “我問你話,你可要老實回答。”

  “First Name,Second Name?今年幾歲?”

  “我只有乳名‘無名兒’,已是總角之齡。”

  ...

  “你爸是誰?”

  “爹爹是大英雄,不過我卻從來沒見過。”

  “那你媽呢?”

  “哼,我娘可是廣寒宮中的仙子,你休得欺負我。”

附錄

  預知后情,且看下回分解。了解更多請瀏覽目錄導航


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM