掌握了勾股树的绘制原理,可以使用多种方法绘制动态勾股树。
方法1. 毛毛老师的作品,先画右子树,再画左子树,最后画根结点。
"""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条边,画完左子树和右子树后,再返回来画剩下的一条边。
"""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算法,感兴趣就一起来!
相关优秀文章:
阅读代码和写更好的代码
最有效的学习方式