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 相关文章推荐
JSON Web Tokens的实现原理
Apr 02 Python
详解Django的CSRF认证实现
Oct 09 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
numpy linalg模块的具体使用方法
May 26 Python
python re.sub()替换正则的匹配内容方法
Jul 22 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
python实现字符串和数字拼接
Mar 02 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
python实现粒子群算法
Oct 15 Python
python APScheduler执行定时任务介绍
Apr 19 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
获取PHP警告错误信息的解决方法
2013/06/03 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
不安全的常用的js写法
2009/09/15 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
python3.5 tkinter实现页面跳转
2018/01/30 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python基础 range的用法解析
2019/08/23 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
高级护理实习生自荐信
2013/09/28 职场文书
幼儿教师自我鉴定
2013/11/02 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
2015年仓管员工作总结
2015/04/21 职场文书