编程模拟自然(三):更好的静态树算法
序·吴刚伐桂篇
旧言月中有桂,有蟾蜍,故异书言,月桂高五百丈,下有一人常斫之,树创随合。
(前情提要:元通过天阙裂缝离开了他所在的世界...)
吴刚抬头看了看天,没有发现什么,只当是出现了幻听。
第零章 提出问题
元通过细致地观察与思考,他发现月桂树是另外一种生长方式,和自己在伊甸园里种的完全不同。
图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?今年几岁?”
“我只有乳名‘无名儿’,已是总角之龄。”
...
“你爸是谁?”
“爹爹是大英雄,不过我却从来没见过。”
“那你妈呢?”
“哼,我娘可是广寒宫中的仙子,你休得欺负我。”