编程模拟自然(三):更好的静态树算法

序·吴刚伐桂篇

  旧言月中有桂,有蟾蜍,故异书言,月桂高五百丈,下有一人常斫之,树创随合。 

  (前情提要:元通过天阙裂缝离开了他所在的世界...)  

  “汪...”一声猿啸从天际传来。

  吴刚抬头看了看天,没有发现什么,只当是出现了幻听。

第零章 提出问题

  元通过细致地观察与思考,他发现月桂树是另外一种生长方式,和自己在伊甸园里种的完全不同。

图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?今年几岁?”

  “我只有乳名‘无名儿’,已是总角之龄。”

  ...

  “你爸是谁?”

  “爹爹是大英雄,不过我却从来没见过。”

  “那你妈呢?”

  “哼,我娘可是广寒宫中的仙子,你休得欺负我。”

附录

  预知后情,且看下回分解。了解更多请浏览目录导航

posted @ 2015-12-27 21:15  ExperDot  阅读(1443)  评论(4编辑  收藏  举报