动态刷新曲线_讲座8动态勾股树作业讲解

掌握了勾股树的绘制原理,可以使用多种方法绘制动态勾股树。

5ddebf81e304b47fbd1178c0f0fec337.png

方法1. 毛毛老师的作品,先画右子树,再画左子树,最后画根结点。

df91d3526eb985f74b39eff7853c4625.png

"""Created on Tue Jul 21 16:09:49 2020@author: 毛毛老师"""import turtle as ttimport math#画正方形时一定要确定底边和起始点的位置和方向def tree(d, a):    if d > 5:        tt.up()          tt.forward(d) #从右下角画正方形的1条边后停在右上角        #从右上角朝着北偏西a度方向绘制左子树(如果很短则不画)        tt.right(90-a)        tree(d*math.sin(math.radians(a)), a)#递归绘制右子树        #画完右子树,继续绘制左子树        tt.left(90)        tt.forward(d*math.sin(math.radians(a)))        tree(d*math.cos(math.radians(a)), a)#递归绘制左子树        tt.backward(d*math.sin(math.radians(a)))        tt.left(90-a)        if d < 20:            tt.color('green')        elif d < 80:            tt.color('brown')        else:            tt.color('black')        tt.begin_fill()        tt.down()        for i in range(5): #从右上角开始画正方形后停在右下角            tt.right(90)            tt.backward(d)        tt.end_fill()tt.TurtleScreen._RUNNING = True  # 启动绘图,在IDE中运行加这句可避免报错tt.ht()#隐藏笔头tt.delay(0)'''tt.setheading(90)tree(100, 60)'''angles = list(range(20, 71)) + list(range(70, 19, -1))for a in angles:    tt.tracer(0)    tt.clear()    tt.setheading(90)    tree(100, a)    tt.update()tt.done()

方法2. 使用turtle内置方法,记录入口位置和方向,绘制完成后,直接还原入口位置和方向。

"""Created on Tue Jul 21 15:39:36 2020@author: 巧若拙毕达哥拉斯树,也叫"勾股树"。是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的树形图形。又因为重复数次后的形状好似一棵树,所以被称为毕达哥拉斯树。"""import turtle as ttimport mathdef tree(d, a):    if d > 5:        if d < 20:            tt.color('green')        elif d < 80:            tt.color('brown')        else:            tt.color('black')        tt.begin_fill()        enter = tt.position() #记录入口位置        angel = tt.heading() #记录入口方向        tt.down()        for i in range(7): #画正方形后停在左上角            tt.forward(d)            tt.left(90)        tt.end_fill()        #从左上角朝着东偏北a度方向绘制左子树(如果很短则不画)        tt.left(90 + a)        tree(d*math.cos(math.radians(a)), a)#递归绘制左子树        #画完左子树,前进一段距离再右转90度绘制右子树        tt.up()        tt.forward(d*math.cos(math.radians(a)))        tt.right(90)        tree(d*math.sin(math.radians(a)), a)#递归绘制右子树        #海龟返回左下角,并指向东方(即还原入口位置和方向)        tt.up()        tt.goto(enter)        tt.setheading(angel)tt.TurtleScreen._RUNNING = True  # 启动绘图,在IDE中运行加这句可避免报错tt.ht()#隐藏笔头tt.delay(0)'''tree(100, 60)'''angles = list(range(20, 71)) + list(range(70, 19, -1))for a in angles:    tt.tracer(0, 0) #启用海龟动画并设置刷新图形的延迟时间    tt.clear() #从屏幕中删除指定海龟的绘图    tree(100, a)    tt.update() #执行一次 TurtleScreen 刷新tt.done()

方法3. 另类做法,先画根结点的3条边,画完左子树和右子树后,再返回来画剩下的一条边。

526773b1e0302bd9df73ec65ec8d9cb2.png

"""Created on Tue Jul 21 16:27:46 2020@author: 巧若拙毕达哥拉斯树,也叫"勾股树"。是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的树形图形。又因为重复数次后的形状好似一棵树,所以被称为毕达哥拉斯树。"""import turtle as ttimport mathdef tree(d, a):    if d > 5:        tt.down()        for i in range(3): #从左下角开始逆时针画3/4正方形后停在左上角            tt.forward(d)            tt.left(90)        #从左上角朝着东偏北q度方向绘制左子树(如果很短则不画)        tt.left(90 + a)        tree(d*math.cos(math.radians(a)), a)#递归绘制左子树        #画完左子树,前进一段距离再右转90度绘制右子树        tt.up()        tt.forward(d*math.cos(math.radians(a)))        tt.right(90)        tree(d*math.sin(math.radians(a)), a)#递归绘制右子树        #海龟原路返回左下角,并指向东方(原方向)        tt.up()          tt.left(90)        tt.backward(d*math.cos(math.radians(a)))        tt.right(90 + a)        tt.down()        tt.forward(d)        tt.left(90)tt.TurtleScreen._RUNNING = True  # 启动绘图,在IDE中运行加这句可避免报错tt.speed(10)tree(100, 70)'''tt.ht()#隐藏笔头tt.delay(0)angles = list(range(20, 71)) + list(range(70, 19, -1))for a in angles:    tt.tracer(0)    tt.clear()    tree(100, a)    tt.update()'''tt.done()

需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!

088b83427dfdcb5faae733460fb6be49.png

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

海龟绘图案例分析系列讲座宣传片

讲座1:海龟绘图案例分析之多变螺旋线

讲座2:海龟绘图案例分析之从顺序结构开始

讲座3:海龟绘图案例分析之正多边形和正多角星

讲座4:海龟绘图案例分析之斐波那契螺旋线

讲座5:海龟绘图案例分析之谢尔宾斯基三角形

讲座6:海龟绘图案例分析之科赫曲线

讲座7:海龟绘图案例分析之漂亮分形树

讲座7:海龟绘图案例分析之动态勾股树

0bb346577f6458db3d1f888d61bb95d9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值