编程画出千姿百态的树叶

来源:互联网 发布:sql select 统计 编辑:程序博客网 时间:2024/05/17 09:42
编程画出千姿百态的树叶
作者:安徽省亳州三中教科处王宇    邮编:236800      E-Mail:Wydz511@sohu.com  
 
走到户外,欣赏大自然的美景,映入眼帘的是千姿百态,各种各样美丽的树。这不禁使人在心旷神怡之余开始赞叹大自然的伟大。于是就有了用电脑把这美景画出来的冲动。
 
经过一番探索,程序编出来了,画出的效果还真不少,如图1所示,笔者根据其形状命名的有蕨叶、芦苇、叶脉、文竹、大树、嫩藤、小草、葡萄、迎客松、玫瑰花、五星花、蒲公英、塔、羽毛、凤凰、孔雀、浪花、稻草人等。
 
           
  
 仔细观察它们的形状有何规律,那就是自相似性,一棵树分的一个叉又是一棵小树。
 
 为了说明原理,笔者以二维情况下非常典型的一棵小树为例来介绍画图的算法。
 
 设这棵树发了两个叉,如图2深色部分所示。沿着箭头的方向,画这棵树需要如下步骤。
 
首先从起点开始向前走到第一个分叉点,设距离是L1
 
②向左转θ1
 
③画子树;
 
④向右转回θ1 ,然后再向左转θ,这个θ角相当于树的曲度;
 
⑤继续向前走到第二个分叉点,又走了L2
 
⑥向右转θ2
 
⑦画子树;
 
⑧向左转θ2 ,考虑到如果树枝下面还有枝节,应该再向左多转θ表示树的曲度;
 
⑨向右转回θ,后退L2,回到第二个分叉点
 
⑩向右转回θ,后退L1,回到起点。
 
至此一棵完整的树就诞生了。
 
算法分析:在算法中,③、⑦用到了递归方法,对自身进行调用,正是这一步骤模拟了自然界树木生长的实质。⑨、⑩两个步骤为回溯算法,保证画完子树之后能退回到转弯时的出发点。
 
对于一般的情况程序核心代码如下:
 
Sub leaf(ByVal n As Integer, ByVal l As Single)
'蕨叶(n为递归深度,大小为L)蕨叶和树结构类似
Dim i As Integer 'i是循环变量
If n = 0 Then Exit Sub '递归的结束条件
 For i = branch To 1 Step -1 'branch指枝条数
    FD L1 * i / branch * l 
    LT Seta1
    leaf n - 1, i / branch * l / K1 '左子树大小的比例系数为K1
    RT Seta1 – Seta '树的曲度为Seta
    FD L2 * i / branch * l
    RT Seta2
    leaf n - 1, i / branch * l / K2 '右子树大小的比例系数为K2
    LT Seta2 + Seta
 Next i
 For i = 1 To branch    '回溯主叶干
    RT Seta
    BK L2 * i / branch * l
    RT Seta
    BK L1 * i / branch * l
 Next i
End Sub
 
程序说明:
 
本程序为多枝条树的画法,主要是用递归和循环来描述的。对于程序究竟是怎么执行的,聪明的你还需要动脑去想一想,这可是使你更加深刻的理解递归和循环的好机会啊。
 
在程序中调用了一些称为海龟作图的函数,假设有一只听话的小海龟在受你的控制,它能听懂如下命令:FD n,在当前位置上前进n步;BK n,在当前位置上后退n步;RT n,在当前位置上向右转n度;LT n,在当前位置上向左转n度。这些函数用VB的Line语句很好实现,这里就不再详细介绍了。
 
代码可能比较枯燥,但看着这些美丽的效果你就会感受到编程的无穷乐趣了。
 
程序界面如图3所示:
 
在程序运行时可以方便的调节各个参数,通过调整比例系数可以改变子树的大小,从而决定画出的形状更像是树之还是树叶;调整子树的倾斜角度可以形成不同的树种;在各个参数中曲度对树的形状影响最大,调整它可以生成不同类别的图案。使用动画按钮还可观察到一个树叶从小到大的生长过程。
 
通过编程画出了这些千姿百态的树形图案,这些图案也许从几何层面上揭示了自然界的生物生长、海浪等现象的原理,那就是整体是由自身的部分不断复制而形成的。
 
对程序的拓广:
 
如果增加三维功能,则可描绘出更加逼真的树图。
 
只要稍微变换一下规则,还可画出各种类似具有分形规律的图形。
 
赶快动手吧,大自然蕴含的无穷规律正等待我们去不断探索,不断发现。
 

程序下载页面蕨叶生成器

本文已发表在《电脑报》2005年12期(2005.4.16),并收入2005《电脑报》合订本。
 
作品名称:编程画出千姿百态的树叶
程序名称:蕨叶生成器
制作日期:2005.2.16
邮编:236800
作者E-Mail:Wydz511@sohu.com  
QQ84115144