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


    序·吴刚伐桂篇

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

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

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

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

    第零章 提出问题

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

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

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

      ...

      “你爸是谁?”

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

      “那你妈呢?”

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

    附录

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

  • 相关阅读:
    基于 jQuery 实现的非常精致的自定义内容滑动条
    异步加载js,Css方法
    jquery ready()的几种实现方法小结
    javascript事件绑定,取消,addEventListener,removeEventListener,attachEvent,detachEvent
    JSONP跨域访问,通过动态加入javascript实现
    抓包
    devops docker笔记
    linux 命令
    ubuntu16 mysql5.7 数据占满磁盘mysql服务停止的恢复方法
    devops kubernates
  • 原文地址:https://www.cnblogs.com/experdot/p/5080872.html
Copyright © 2020-2023  润新知