前两篇文章基本涵盖了turtle的大部分功能,同时也借由对turtle功能的展示,厘清了Python的一些语法特点,以利于新手入门。但是短短几个例子,阐述得还是有限,这里再展开两个知识点,一方面对turtle做个补遗,另一方面把Python语法的大框架过完一遍。

第一个是画椭圆。上一节中描述了如何用turtle画一个圆,或者是一段弧线,但是在很多图形中需要用到椭圆,如何画出一段优美的椭圆,是本篇的第一个知识点。

上节中有提到turtle中的circle()方法,其核心就是割圆术,也就是用正多边形来模拟一个圆。我们知道,正8边形比正6边形肯定要更接近一个圆,正16边形比正8边形又更接近一个圆,如果我们能画出一个正120边形,或者正360边形的话,那是非常接近一个圆的。下面就沿着这个思路,来画一个正120边形。不用说,在普通个人电脑上,“正120边形”在我们眼里肯定它就是一个“圆”了。上代码:

import turtle as t

t.pendown()

t.setheading(90) # 朝上(正北方向)

for j in range(120): # 重复执行120次

t.forward(3) # 移动3个单位

t.left(3) # 左转3度

t.penup()

t.done()

运行这个例子,可以看到turtle从原点出发,按逆时针方向画了一个圆。如果修改forward()中的参数,可以画出不同半径的圆。

这个画法跟circle()本质上没有区别。但是,却给了我们更大的自由度,来操控这段曲线,例如,修改代码如下:

import turtle as t

t.pendown()

t.setheading(90)

for j in range(60): # 重复执行60次

t.forward(3)

t.left(3)

t.penup()

t.done()

将重复运行的次数改为60次,每次还是转动3度,我们就可以得到一段60*3=180度的弧线。在不同的角度区间内,修改画弧的速度,也即修改forward()走的快慢,我样就可以得到一段椭圆弧,看代码:

import turtle as t

t.pendown()

t.setheading(90)

len = 1 # 设置初始走的速度为1

for j in range(60):

if j < 30: # 当j<30,也就是画前一半的弧线

len += 0.2 # 让速度越走越快

else: # 画后一半弧线

len -= 0.2 # 让速度越走越慢

t.forward(len)

t.left(3)

t.penup()

t.done()

运行这段代码,可以看到turtle画出了一段椭圆弧。能画成椭圆弧的关键是if-else条件语言的应用。if-else属于分支语句,跟前面学过的顺序、循环共同构成Python语言的三大控制结构。在这个例子中,我们一共画60步弧线,在前30步,让画弧的速度由慢到快,后30步,速度由快到慢,这样不匀速的画法,就形成了一条椭圆弧。

接下来完善这段代码,画出一个完整的椭圆来:

import turtle as t

t.pendown()

t.setheading(90)

len = 1

for k in range(2): # 将相同的动作重复做一遍

for j in range(60):

if j < 30:

len += 0.2

else:

len -= 0.2

t.forward(len)

t.left(3)

t.penup()

t.done()

运行这段代码,可以看到turtle画出了一个完美的椭圆。相对于上一个例子,我们只增加了一条语句,即“for k in range(2):”,也就是将画上一半弧的方法,在下一半上重复使用一次即可。当然,你也可以通过改变if-else的方法来实现,只会逻辑上要复杂一点。

从这里我们也可以看到,turtle绘图用的方法还是比较简单,适合于初学者入门使用,基本上不涉及计算机图形学的内容,要真正好出漂亮和复杂的弧线,turtle库还是不够。

第二个是用turtle实现递归绘图。

现实生活中,有很多图形是非常有规律性的,这样的图形如果使用递归算法来实现,程序就会非常简洁,运行效果也会很好。下面我们来用turtle画一棵树,感受一下Python中的递归算法和turtle的克隆功能。树的最大特点就是每个树干都会左右分叉成两枝,而每枝又会再次分叉,这样循环往复一直进行。我们先来画一个树干分叉的小例子:

import turtle

p = turtle.Pen() # 第一支画笔

p.penup()

p.goto(0, -200) # 移动到初始位置

p.setheading(90) # 向上(正北方向)

p.pensize(7)

p.pencolor('green')

p.pendown() # 落笔

p.forward(200) # 画第一条树干

q = p.clone() # 克隆出第二支笔来

p.left(65) # 第一支笔往左转

q.right(65) # 第二支笔往右转

p.forward(200 * 0.65)

q.forward(200 * 0.65)

turtle.done()

运行这个小例子,可以看到,turtle在界面上画出一个Y形的树支,这个就是我们递归的基础,后面所有的小树枝是都这样画出来。这里用到一个很重要的知识点,就是clone()方法,我们用clone()克隆出第二笔,以便于从树干分别往两边画。

接下来,改造上面的小例子,应用递归函数,让turtle帮我们不断的画出更多的树枝来,上代码:

#-*- coding:utf-8 –*-

#用递归函数实现turtle画一棵树。

#所有递归函数都可以转化为非递归来实现,

#如果需要非递归方法的代码,请加公众号:see_goal 留言“turtle画树”

import turtle

p = turtle.Pen()

p.penup()

p.goto(0, -200)

p.setheading(90)

p.pensize(7)

p.pencolor('green')

p.pendown()

def branch(plist, len): # 自定义函数,画树枝

if (len > 15): # 递归的退出条件

list = [] # 新画笔列表

for p in plist: # 遍历旧画笔列表

p.forward(len)

q = p.clone()

p.left(65)

q.right(65)

list.append(p) # 存入新画笔列表

list.append(q) # 存入新画笔列表

branch(list, len * 0.65) # 递归,list为新画笔列表,树枝长65%

branch([p], 200)

turtle.done()

运行这段代码,可以看到turtle在界面上递归的画出一棵树。

这棵树上的每一个小箭头,都代表着一个turtle的Pen对象。也就是说,我们通过不断的克隆Pen,来实现让每个树枝都能向左右两边伸展。而每一次伸展的长度都是上一个树枝的0.65倍,也就是越伸越短。当短到<15时,递归结束。每次克隆出的新Pen,都通过list.append()方法存到列表中,传递给下一次调用,这样就给人一种树枝不断发芽生长的动画效果。

python画椭圆-Python易学就会(五)turtle绘制椭圆与递归相关推荐

  1. python画椭圆形函数算法_python如何使用matplotlib绘制椭圆的数学公式-百度经验

    python是一门非常实用的编程语言,matplotlib库是python的可视化的实现方式,matplotlib提供了对latex的实现,那怎样用matplotlib绘制椭圆的公式呢? 工具/原料 ...

  2. python画五角星为什么144度_使用turtle绘制五角星、分形树

    本文实例为大家分享了使用turtle绘制五角星和分形树的具体代码,供大家参考,具体内容如下 turtle 库 与之前程序的区别: 没有显示的input()与output() 没有赋值语句 大部分语句为 ...

  3. python画七彩圆圈_python内置库turtle绘制有趣图形

    一:绘制六边形 import turtle t = turtle.Pen() turtle.bgcolor("black") sides = 6 colors = ["r ...

  4. python画椭圆形_python 用 matplotlib 的 patch 模块绘制椭圆详解

    #创建画布 fig = plt.figure(figsize=(12, 8), facecolor='beige', #米黄色 )#划分子区 axes = fig.subplots(nrows=2, ...

  5. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  6. html5画椭圆的完整代码,HTML5 Canvas中绘制椭圆的4种方法

    概述 HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结.各种方法各有优缺,视情况选用.各方法的参数相同: 1.context为Canvas的2D绘图环境对象, 2.x ...

  7. html如何画出四个圆圈,HTML5 Canvas中绘制椭圆的4种方法

    概述 HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结.各种方法各有优缺,视情况选用.各方法的参数相同: 1.context为Canvas的2D绘图环境对象, 2.x ...

  8. python turtle画椭圆-Python易学就会(五)turtle绘制椭圆与递归

    前两篇文章基本涵盖了turtle的大部分功能,同时也借由对turtle功能的展示,厘清了Python的一些语法特点,以利于新手入门.但是短短几个例子,阐述得还是有限,这里再展开两个知识点,一方面对tu ...

  9. python turtle 椭圆_Python易学就会(五)turtle绘制椭圆与递归-Go语言中文社区

    前两篇文章基本涵盖了turtle的大部分功能,同时也借由对turtle功能的展示,厘清了Python的一些语法特点,以利于新手入门.但是短短几个例子,阐述得还是有限,这里再展开两个知识点,一方面对tu ...

最新文章

  1. Java中Split函数的用法技巧
  2. alter system|session set events转储
  3. php在web端播放amr语音(如微信语音)
  4. Ambari2.7.4+HDP3.1.4下sqoop增量导入只支持append模式,mysql直接进入hive的lastmodified的不支持。下面是增量的命令。
  5. System V IPC之信号灯
  6. pip install mysqlclient报错fails with EnvironmentError: mysql_config not found
  7. 用于创建此对象的程序是package_【ROS 学习笔记】CMakeLists.txt 与 package.xml
  8. c++课设实验室管理系统_庆安知名实验室设备管理系统平均价格
  9. spring boot整合cxf发布和调用webservice
  10. mcafee迈克菲官网由于验证缺陷,导致暴力破解到企业授权号获取到所有企业用户的Grant number
  11. 歌乎:985博士生对996的困惑
  12. 单舵轮(叉车)AGV里程计数据解算
  13. skimage.exposure.rescale_intensity
  14. navigateTo:fail can not navigateTo a tabbar page
  15. 机器人在课堂上所表达的新科技发展观
  16. python设置颜色_使用python改变颜色的色调
  17. 灵隐寺招聘员工:没有KPI,佛系上班,四点半下班……
  18. 解决vue element导航重复点击路由报错
  19. 【Arduino基础】一位数码管实验
  20. 西北大学844计算机考研真题,2018年西北大学信息科学与技术学院844软件工程学科专业基础综合之计算机操作系统考研基础五套测试题...

热门文章

  1. iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多...
  2. numpy append
  3. flask Blueprint蓝图
  4. Google protobuf解析消息逻辑的版本问题
  5. 使用pdf.js预览实现读取服务器外部文件
  6. php一些单选、复选框的默认选择方法(示例)
  7. IOS网络篇1之截取本地URL请求(NSURLProtocol)
  8. iOS开发的库的列表,不完全是开源库
  9. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
  10. ZOJ1563 (动态规划)