前两篇文章基本涵盖了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 turtle 椭圆_Python易学就会(五)turtle绘制椭圆与递归相关推荐

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

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

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

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

  3. 用python画耳朵_Python易学就会(四)turtle绘图入门--高级篇

    到目前为止我们通过turtle库了解了Python的基本语法,包括顺序与循环.函数的调用与方法的定义.列表与简单的数学运算等:也学习了用turtle库绘图的基本用法,包括坐标与角度.落笔抬笔.颜色与填 ...

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

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

  5. python正则匹配_Python正则表达式初识(五)

    原标题:Python正则表达式初识(五) 正则表达式的内容很丰富,今天小编继续给大家分享Python正则表达式的基础知识.今天要给大家的讲的特殊字符是竖线"|".竖线"| ...

  6. python与室内设计_Python初学者笔记(五):白话讲“装饰器”,你看不懂算我笨!...

    初学者又遇到难题了吧?听都没听说过,装饰器--英文:decorator,啥意思?室内装饰师,油漆匠,适于室内装饰的-- 听不懂,更不知道啥意思,怎么用了吧?这不可怕,可怕的是那些大神,把这个东西写的巨 ...

  7. python像素处理_Python+OpenCV图像处理(五)—— 像素运算

    最近在忙毕业设计,只能偶尔更新博客........ 一.像素的算术运算 像素的算术运算涉及加减乘除等基本运算(要进行算术运算,两张图片的形状(shape)必须一样) 代码如下: #像素的算术运算(加. ...

  8. python动态捕捉屏幕_python学习(十五) 屏幕抓取

    15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签 ...

  9. python柱形图代码_Python数据可视化:基于matplotlib绘制「条形图」

    简介 条形图 (bar chart)是用宽度相同条形的高度或长短来表示数据多少的图形,可以横置或纵置.纵置时的条形图也称为 柱形图 (column chart). 绘制条形图 1 import mat ...

最新文章

  1. Spring MVC 解读——mvc:annotation-driven/
  2. 理论计算机初步:概率算法和近似算法
  3. GitHub优秀开源项目收集
  4. java和python哪个学习编程_初学编程,选Java还是Python?
  5. 动态代理:jdk和cglib区别
  6. 如何获取网站的ico图标呢?
  7. 马斯克回应“逃税”:没有从特斯拉领取高薪 一直在按规定缴税
  8. Java集合类的整理
  9. 第23章 排序算法(包括merge等)
  10. python cls方法
  11. SwitchHosts工具介绍及下载
  12. 【矩阵论】矩阵的广义逆
  13. 今日金融词汇---前复权,是什么?
  14. java外卖项目介绍_JavaWeb网上订餐系统项目
  15. 九九乘法表居中c语言,JavaScript实现九九乘法表的简单实例
  16. 一个简单的文本编辑程序源代码
  17. NGFW module恢复密码操作方法
  18. 将古典融汇到现代(一) ---皮尔斯逻辑之四
  19. 操作系统概念(九)——虚拟内存
  20. Notepad++查看二进制文件——HexEditor插件

热门文章

  1. asp毕业设计—— 基于asp+access的期刊稿件处理系统设计与实现(毕业论文+程序源码)——期刊稿件处理系统
  2. jsDelivr 备案被吊销后,网页静态资源何去何从
  3. Android使用被动刷新SurfaceView
  4. 知乎里那些绝美的壁纸在这里!
  5. 2023贵州省职业院校技能大赛大数据技术与应用专业样题
  6. win10刻录光盘失败,一直显示有准备好写入到光盘中的文件
  7. 【python】二维数组按照某行或某列排序(numpy lexsort)
  8. Blender - 渲染动画:体积云、动画、运动模糊、Compositor数据输出
  9. 25 Redis的缓存中的数据和数据库中的不一致问题
  10. xadsafe做暗刷_深蓝维护通道有暗刷? - 综合技术讨论大区 - 死性不改BBS - 网维行业自由、中立的技术与信息交流平台 - Powered by Discuz!...