趣学妙用Scratch编程40 进阶篇(十) 奇妙的分形

预备知识

从这一节课开始,我们要开始画一些“分形”图形。什么是分形呢?看下面这张图片:

 

 

这不是西兰花吗?它和分形有什么关系呢?

仔细观察,你会发现这棵西兰花是由许多个小一些的块组成的,每一块好像就是一朵缩小了的西兰花!就好像西兰花是由比自己小一号的克隆体组成的,而这些克隆体又是由比它们自己更小一号的克隆体组成,再小一号的克隆体由再再小一号的克隆体组成……如果你用放大镜看,最微小的西兰花组成部分和整棵西兰花好像是一样的!这种“整体就是局部、局部就是整体”的“自相似性”就是分形了。

自然界到处存在着分形,比如海岸线的形状、树的形状,包括我们的大脑和肺都是分形体。它就好像是大自然创造万物时的密码,让你不得不惊叹,原来那些看上去复杂的东西,都是由无数个简单的“克隆体”组合而成的!

分形在科学上有许多应用,我们现在先学会一些简单的分形画法就可以了,比如今天我们要画的是谢尔宾斯基分形。

谢尔宾斯基是波兰的一名数学家,他于1915年提出了谢尔宾斯基三角形,这就是一种“自相似”的图形,构造方法如下:

1、取一个实心的三角形。(多数使用等边三角形) 2、沿三边中点的连线,将它分成四个小三角形。 3、去掉中间的那一个小三角形。 4、对其余三个小三角形重复第一步。

这里“重复第一步”非常关键,正是这种重复才让这种图形的局部和整体是相似的。

 

 

如果取一个正方形或其他形状开始,用类似的方法构作,形状也会和谢尔宾斯基三角形相近。这种图形被称为“谢尔宾斯基地毯”。

 

 

今天我们就要画这两种分形图。

问题

使用Scratch画笔绘制谢尔宾斯基三角形和谢尔宾斯基地毯。

分析

要实现谢尔宾斯基三角形,我们无法去像现实中去从一个三角形中间“挖”去一个,但我们在画三角形每条边的时候,都画以它的一半边长先画个小的等边三角形,三条边总共画出三个,加上原来的大三角形,就构成一一个四等分三角形。

 

 

当然,在画小一半的三角形时,我们对它还可以重复这个过程。

以上过程让你你想到了什么?是的,自己调用自己的,这不是递归吗?我们正是要借助递归的特性来实现“分形”。

编程

一、根据分析,我们先来画一个等边三角形,这个过于简单,我就不解释什么了……

 

 

二、现在,你如果调用这个积木,会以你指定的边长画一个三角形。那么如果我在左转之前,先以一半的边长调用一下自己呢——

 

 

三、如果你现在调用这块自制积木,你的画笔角色将毫无响应,但是程序明明还在执行?这时候,赶紧停止程序。这是因为你让积木不断调用自己,它无休止地调用自己的二分之一的二分之一的二分之一……的边长画三角形,这是一个死循环,因为数字总能分到更小,你的计算机资源耗尽也算不完。因此,我们必须给这个程序加上限制,如果边长小于一定程度,比如20,就不再执行了——

 

 

这时运行程序,你的画笔开始上下翻飞,很快画出了你想要的结果——

 

 

四、加上必要的初始化代码,在画三角形时加上修改画笔颜色的指令,你可以得到这样的结果(通过调整“等边三角形”自制积木中限制执行的边长,你可以画出更密集的三角形,当然速度也更慢):

 

 

五、到这里我们画谢尔宾斯基三角形任务基本已经完成了,让我们再画一个以正方形为基础的谢尔宾斯基地毯 :

 

 

正方形画起来就慢多了,可以通过将自制积木设置为“运行时不刷新屏幕”来大幅度提升绘图速度。

六、演示一下画谢尔宾斯基三角形的过程:

总结

只需要给绘制等边三角形这样简单的自制积木加上递归调用,就能画出这么漂亮的图案,这就是分形的奇妙之处。当然,递归虽好,可不要忘记加限制条件哦!

给TA赞助
共{{data.count}}人
人已赞助
综合资讯

CSP报名在即,C++的同学学到什么样的程度可以参赛

2023-6-30 14:32:49

综合资讯

趣学妙用Scratch编程41 进阶篇(十一) 绘制科赫雪花

2023-7-1 8:23:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索