目前为止,我们学会了谢尔宾斯基三角形、谢尔宾斯基地毯、科赫雪花三种分形的来法,相对它们,我更喜欢的是分形树。因为用Scratch画分形树的感觉太奇妙了,似乎真的有一棵小树从我们的笔下“生长”出来一样。在这几节分形课的最后,我们就来种一棵分形树吧!
问题
使用Scratch画笔绘制分形树,要求能够指定树的深度、长度参数。
分析
由前几课的经验,我们知道分形的关键是找到不同级别之间的递归调用关系,其它并没有什么神秘的。所以我们直接用编程的方式慢慢推导吧。
编程
一、画科赫曲线的时候,我们是从一根线段开始,再把它三等分。画树的时候呢?我们都知道树是从树根长出了树干,然后从树干上又生长出树枝和树叶的。所以最简单的树应该是这样,先移动再退回来:
右上角画笔画出的竖线就是我们画的第一棵“树”。
二、你可能会说:这是一棵树,你在逗我吧?是的,不管你信不信,它就是一棵树本身,只是还没有“发芽”长枝而已。树干不就是一条竖线吗?不着急,我们这就让它开始生长:
很好,这棵树有点意思了,虽然仍然光秃秃的,至少是个“树杈”而不是一根棍子了。仔细观察红框中的代码,你会发现我把画树这个自制积木中的代码在主程序中又写了一遍,先画出树干,再调用两次画树积木,画出了两根分支。这样我们可以找出树的第一级和第二级之间的关系,就是在画完本级之后,先不退回,继续画,左转30度画左分支,再右转60度画右分支,最后再转回来,回到起点。抬笔指令和退回之前,就是递归的入口点。
三、用递归改造上面的代码:
不幸的是,这次似乎还不如上次,程序一直在执行,画笔在树枝的末端不断转圈……这是为什么?因为我们没有给递归调用设置退出条件,它一直在反复调用自己,而无法返回了。
四、经过思考,我们可以给“画树”积木增加一个参数“级别”,调用的时候传递给它一个大于0的级别,当级别大于0时它会画出自己,并递归调用画出下一级,直到级别为0时退出调用。
现在,这棵小树有点模样了。
五、小树的基本样子有了,可是还不太“像”,哪有树干和树枝一样粗的?颜色也不太对。我们再给积木加上颜色和粗细两个参数,让它在每一级调用的时候产生变化:
效果不错!我用的初始粗细是20,颜色为10,每次颜色增加3。你也可以自己修改这些参数画出不同的效果。
六、让我们看看能不能继续完善,我们可以把旋转的角度设置成一个变量,通过修改角度,也可以得到形态各异的树——
七、只要掌握了这种用递归实现分形的思路,你可以画出形形色色的树!
总结
通过最近几节课的学习,相信你能体会到分形的奇妙之处。如果要进一步探索分形的奇妙世界,不妨在百度上搜索一下“上帝的指纹”相关的图片,看看简单的分形能够生成多么美妙的图案!