編程模擬自然(三):更好的靜態(tài)樹算法
序·吳剛伐桂篇
舊言月中有桂,有蟾蜍,故異書言,月桂高五百丈,下有一人常斫之,樹創(chuàng)隨合。
(前情提要:元通過天闕裂縫離開了他所在的世界...)
吳剛抬頭看了看天,沒有發(fā)現(xiàn)什么,只當(dāng)是出現(xiàn)了幻聽。
第零章 提出問題
元通過細(xì)致地觀察與思考,他發(fā)現(xiàn)月桂樹是另外一種生長方式,和自己在伊甸園里種的完全不同。

圖3-1 程序渲染隨機(jī)樹
“這顆樹的全稱為 Graphics User Interface Tree,中文簡稱:桂樹。”
第一章 作出假設(shè)
元用假設(shè)解開了自己的疑惑:每個樹枝都是一個獨(dú)立的結(jié)點(diǎn),它可以向上再生長 n 個樹枝結(jié)點(diǎn)。

圖3-2 較少枝干的樹
第二章 制定計(jì)劃
元立即制定了實(shí)現(xiàn)假設(shè)的方案。
樹枝生長步驟
首先,長出第一個樹枝(樹干)
然后,每個樹枝的頂部長出不少于一個樹枝
其中,每個樹枝的粗為上一層 0.618 倍,長度為上一層的 0.618*random(1) 倍
最終,重復(fù)第二步,直至樹枝不能更細(xì),或者迭代深度達(dá)到上限

圖3-3 光禿的樹
第三章 實(shí)踐檢驗(yàn)
元想到:實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。
每個樹枝的頂部用一個向量表示,生長出的子樹枝旋轉(zhuǎn)一定角度并改變模長即可。
Imports System.Numerics Imports EDGameEngine.Core.Utilities ''' <summary> ''' 樹節(jié)點(diǎn) ''' </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> ''' 創(chuàng)建并初始化一個實(shí)例 ''' </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
“把樹畫出來就知道結(jié)果了。”
第四章 得出結(jié)論
樹長成了,元打算撰寫一篇探究實(shí)驗(yàn)報告。
“這片天地與我創(chuàng)造的世界確實(shí)不一樣,竟然長成這副樣子。”元有些郁悶。

圖3-4 水墨樹
后記
“哼哼,終于逮住你了。”
...
“我問你話,你可要老實(shí)回答。”
“First Name,Second Name?今年幾歲?”
“我只有乳名‘無名兒’,已是總角之齡。”
...
“你爸是誰?”
“爹爹是大英雄,不過我卻從來沒見過。”
“那你媽呢?”
“哼,我娘可是廣寒宮中的仙子,你休得欺負(fù)我。”
浙公網(wǎng)安備 33010602011771號