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

本文介绍了一个程序渲染树木的实验过程,包括观察与思考、作出假设、制定计划到实践检验等阶段,最终通过代码实现了不同形态的桂树绘制。

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

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

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

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

第零章 提出问题

  正确地观察与思考,并发现问题,是追求机会至关重要的条件。

  元来到这个世界已经好多天了,一直无法进入桂树百丈范围。

  元在伊甸园里种过树,通过仔细观察,Ta 发现桂树是另外一种生长方式。

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

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

  “星座?”

  “属猴。”

  ...

  “你爸是谁?”

  “爹爹是大英雄,不过我却从来没见过。”童稚的声音低落了一些。

  “那你妈呢?”

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

附录

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

转载于:https://www.cnblogs.com/experdot/p/5080872.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值