编程画出千姿百态的树叶 作者:安徽省亳州三中教科处王宇 邮编:236800 E-Mail: [email protected] | |
走到户外,欣赏大自然的美景,映入眼帘的是千姿百态,各种各样美丽的树。这不禁使人在心旷神怡之余开始赞叹大自然的伟大。于是就有了用电脑把这美景画出来的冲动。 经过一番探索,程序编出来了,画出的效果还真不少,如图 1 所示,笔者根据其形状命名的有蕨叶、芦苇、叶脉、文竹、大树、嫩藤、小草、葡萄、迎客松、玫瑰花、五星花、蒲公英、塔、羽毛、凤凰、孔雀、浪花、稻草人等。 ![]() | |
① 首先从起点开始向前走到第一个分叉点,设距离是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: [email protected] QQ : 84115144 |