人工智能学习联盟免费课程——案例二:绘制分形树

案例二 :绘制分形树

1.利用循环绘制五角星

本案例的学习要借助turtle库,这是一个画笔库。它的坐标定义如下:在这里插入图片描述
首先是简单的利用循环绘制多个五角星。

def draw_pentagram(size) :
    count = 1
    while count <=5:
        turtle.forward(size)
        turtle.right(144)
        count += 1

colors = ['red','green','black','blue','yellow','purple']
size = 50
while size <= 100:
    i = size//10 - 5
    turtle.color(colors[i])
    draw_pentagram(size)
    size += 10
    
turtle.exitonclick()

turtle.exitonclick()是用来结束绘制框的,如果不加这一句将导致崩溃。
我在老师的基础上,添加了颜色变量,每一个五角星都是一个不同的颜色,利用列表实现。

2.利用递归函数绘制多个五角星

循环是每一次你给函数一个参数,再调用函数来实现你的目标;而递归则是在其内部完成参数的更新。

def draw_recursive_pentagram(size = 50,maxsize = 100) :
#依旧是绘制一个五角星的循环
    count = 1
    while count <= 5:
        turtle.fd(size)
        turtle.rt(144)
        count += 1
#绘制完成之后开始自身迭代        
    size += 10
#迭代结束的条件一定要设置好,不然就是死循环
    if size <= maxsize :
        draw_recursive_pentagram(size,maxsize)

在这里,我比老师多设置了一个maxsize参数来控制绘制的五角星的最大边。
递归函数(或者说迭代函数)是在其定义的函数内部自己再次调用自己,从而实现参数的更新。

3.利用递归函数绘制分形树

分形树自行百度吧,就是在整体和局部的关系上有迹可循,利用迭代来实现从局部到整体。
老师留了课后思考是如何实现树的枝和叶颜色不同,所以我在迭代函数中添加了颜色变量来实现。
首先是迭代函数的定义。

def fractal_tree(branch_length) :
    if branch_length >= 5:
        # 绘制右侧树枝
        turtle.fd(branch_length)
        turtle.rt(20)
        if branch_length < 20 :
            turtle.color('green')
        fractal_tree(branch_length - 15)
        
        # 绘制左侧树枝
        turtle.lt(40)
        if branch_length < 20 :
            turtle.color('green')
        fractal_tree(branch_length - 15)
    
        # 返回上个节点
        if branch_length > 20 :
            turtle.color('brown')
        turtle.rt(20)
        turtle.bk(branch_length)

先来看颜色,我设置的是当枝的长度小于等于15时,我认为它是叶,即将最后一级看作叶(因为步长是15)。然后在返回上级节点时,将颜色变更为棕色,从而实现枝的绘制。
下面就是很烧脑的迭代问题。
我理解的是按照代码的顺序依次执行。
假设长度初始值为40,由起点(第一级节点)前进40(到达二级节点),右转20,这时进入迭代函数,长度为25,由二级节点,前进20(到达三级节点),右转20,这时(记为状态1)再一次进入迭代函数,长度为10,由三级节点,前进5(到达四级节点),右转20,这时(记为状态2)又一次进入迭代函数,长度为-5,不满足if条件,退出该迭代。
代码继续,这时是状态2,即进行fractal_tree(10 - 15)的下一行代码,turtle.lt(40),由右转20的状态变成左转20的状态,,然后下一行fractal_tree(10 - 15)依旧不能执行,再下一行,即返回上个节点的turtle.rt(20),由左转20的状态变成正向的状态,向后后退10,来到三级节点。
这个时候fractal_tree(25 - 15)的迭代结束了,继续状态1的下一行,turtle.lt(40),由右转20的状态变成左转20的状态,,然后下一行fractal_tree(25 - 15)开始迭代。由三级节点,前进10(到达四级节点),右转20,这时(记为状态3)又一次进入迭代函数,长度为-5,不满足if条件,退出该迭代。返回上个节点的turtle.rt(20),由左转20的状态变成正向的状态,向后后退10,再次回到三级节点。
之后循环往复,只到最终又回到一级节点。
示意图如下:
在这里插入图片描述
到此对迭代函数的工作原理就理解的差不多了。
下面就是绘制分形树了。

#先将画笔的方向调整好
turtle.left(90)
#将中心点位置调整好
turtle.penup()
turtle.bk(100)
turtle.pendown()
#引用函数进行绘图
fractal_tree(100)

turtle.exitonclick()

在这里插入图片描述
完结撒花!✿✿ヽ(゚▽゚)ノ✿

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值