在学习函数递归的过程中,课程老师介绍了一个很有趣的小例子,利用turtle和函数递归绘制科赫雪花,效果如下:
科赫曲线:仔细观察可以发现,雪花的边缘和雪花的整体结构之间存在着一定的相似性,这种相似性就是科赫曲线的数学描述
光看定义可能不太明白,下面上图
是不是已经有雪花的雏形了呢,接下来我们来绘制
首先定义一个科赫函数,两个参数分别为想要绘制直线的长度和绘制的阶数n:
[Python] 纯文本查看 复制代码 def koch(size,n):
然后用分支结构区分基例(最简单的情形)和链条(每一次递推的具体过程)
[Asm] 纯文本查看 复制代码 if n == 0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
turtle.left(angle)
koch(size/3,n-1)
到这,其实就已经结束了,我们给出计算机第一次怎么绘制,之后的绘制按照这个递归就可以一直执行下去,怎么样,递归是不是很有趣,接下来完成绘制的过程
我们引入turtle库
设置画布的尺寸,画笔的大小,出发点,速度
[Python] 纯文本查看 复制代码 turtle.setup(600,600)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
turtle.speed(speed=6)
level=3
接下来调用刚才的科赫函数进行绘制,绘制的过程按照等边三角形为框架,先直边,然后两个斜边进行绘制,完整代码和注释见下
[Python] 纯文本查看 复制代码 import turtle
def koch(size,n):
if n == 0: #对于科赫雪花,如果考虑最简单的情形,就是一条直线
turtle.fd(size)
else:
for angle in [0,60,-120,60]: #绘制方向从0°,然后抬起60°,然后向下120°,再向上60°回到水平,相当于等边三角形去掉下底
turtle.left(angle)
koch(size/3,n-1) #运用递归,上面只给出第一次画的方法,剩下的n-1次全部如此
def main():
turtle.setup(600,600) #设置画布尺寸
turtle.penup() #抬起画笔
turtle.goto(-200,100) #画笔上指定位置
turtle.pendown() #落笔
turtle.pensize(2) #设置画笔尺寸为2像素
turtle.speed(speed=6) #控制小海龟的移动速度,0和10最大,6正常
level=3 #传入koch雪花函数的参数,3,即在每条边上进行三次迭代
koch(400,level) #开始绘制等边三角形第一条边(横着的边)的雪花图形
turtle.right(120) #画笔方向向下旋转120°,进行第二条边绘制
koch(400,level) #开始绘制等边三角形第一条斜边
turtle.right(120) #画笔再次旋转,此时指向了起始点
koch(400, level) #开始绘制等边三角形第二条斜边
turtle.hideturtle() #隐藏画笔
main() #调用函数开始绘制
其实这个科赫雪花是最基础的,我们还可以修改雪花的颜色,雪花的数量,还可以再写一个函数,让雪花实现飘落的效果,也可以修改科赫曲线的旋转角度,基础框架的形状等等
非常希望这个案例能够激发大家的兴趣,动手一起敲代码,看到图形那一刻会非常有成就感。 |