python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)


Posted in Python onMay 30, 2019

插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进、后退、左转、右转,乌龟的尾巴朝下,它移动时就会画一条线。并且为了增加乌龟画图的艺术价值,可以改变尾巴宽度和尾巴浸入墨水的颜色。

1.递归绘制螺旋

先用我们让乌龟以line_len长度前进,然后向右旋转90°,然后缩短line_len长度递归调用draw_spiral函数

import turtle
my_turtle = turtle.Turtle()
my_win = turtle.Screen()
def draw_spiral(tur, line_len):
  if line_len > 0:
    my_turtle.forward(line_len)
    my_turtle.right(90)
    draw_spiral(tur, line_len - 1)
draw_spiral(my_turtle, 100)
my_win.exitonclick()

python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)

2.递归绘制二叉树

首先绘制branch_length长度的主干枝条,然后向右旋转20°,递归调用draw_tree绘制主干枝条上的右分支,之后再向左旋转40°(因为需要抵消右旋转的20°),递归调用draw_tree绘制主干枝条的左分支,然后再向右旋转20°,原路返回。

import turtle
my_tree = turtle.Turtle()
my_win = turtle.Screen()
def draw_tree(branch_length, t):
  if branch_length > 5:
    t.forward(branch_length)
    t.right(20)
    draw_tree(branch_length-20, t)
    t.left(40)
    draw_tree(branch_length-20, t)
    t.right(20)
    t.backward(branch_length)
my_tree.left(90)
my_tree.up() # 抬起尾巴
my_tree.backward(200)
my_tree.down() # 放下尾巴
my_tree.color('green')
draw_tree(100, my_tree)
my_win.exitonclick()

python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)

3.绘制谢尔宾斯基三角形

谢尔宾斯基三角形使用了三路递归算法,从一个大三角形开始,通过连接每一个边的中点,将大三角型分为四个三角形,然后忽略中间的三角形,依次对其余三个三角形执行上述操作。

import turtle
def draw_triangle(points, color, my_angle):
  my_angle.fillcolor(color)
  my_angle.up()
  my_angle.goto(points[0][0], points[0][1])
  my_angle.down()
  my_angle.begin_fill()
  my_angle.goto(points[1][0], points[1][1])
  my_angle.goto(points[2][0], points[2][1])
  my_angle.goto(points[0][0], points[0][1])
  my_angle.end_fill()
def get_mid(p1, p2):
  return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)
def sierpinski(points, degree, my_angle):
  colormap = ['blue', 'red', 'green', 'yellow',
        'violet', 'orange', 'white']
  draw_triangle(points, colormap[degree], my_angle)
  if degree > 0:
    sierpinski([points[0],
          get_mid(points[0], points[1]),
          get_mid(points[0], points[2])],
          degree - 1, my_angle)
    sierpinski([points[1],
          get_mid(points[0], points[1]),
          get_mid(points[1], points[2])],
          degree - 1, my_angle)
    sierpinski([points[2],
          get_mid(points[2], points[1]),
          get_mid(points[0], points[2])],
          degree - 1, my_angle)
my_turtle = turtle.Turtle()
my_win = turtle.Screen()
my_points = [[-100, -50], [0, 100], [100, -50]]
sierpinski(my_points, 3, my_turtle)
my_win.exitonclick()

python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)

总结

以上所述是小编给大家介绍的python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
python发送伪造的arp请求
Jan 09 Python
探究Python中isalnum()方法的使用
May 18 Python
python爬取51job中hr的邮箱
May 14 Python
python实现简单遗传算法
Mar 19 Python
python ---lambda匿名函数介绍
Mar 13 Python
Python代码太长换行的实现
Jul 05 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
Python中url标签使用知识点总结
Jan 16 Python
Python 如何查找特定类型文件
Aug 17 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python基础之函数嵌套知识总结
May 23 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 #Python
基于Python打造账号共享浏览器功能
May 30 #Python
Python实现带下标索引的遍历操作示例
May 30 #Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 #Python
python2和python3在处理字符串上的区别详解
May 29 #Python
python TF-IDF算法实现文本关键词提取
May 29 #Python
详解Python odoo中嵌入html简单的分页功能
May 29 #Python
You might like
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
Python中的pass语句使用方法讲解
2015/05/14 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Python查看微信撤回消息代码
2018/06/07 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
某公司的.net工程师面试题笔试题
2013/11/22 面试题
信访稳定工作汇报
2014/10/27 职场文书
离婚协议书的范本
2015/01/27 职场文书
财务工作失误检讨书
2015/02/19 职场文书
vue 实现上传组件
2021/05/31 Vue.js
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技