发布时间:2020/07/21 作者:天马行空 阅读(3437)
一、Turtle绘图
1.1、画一条线
如何让这只乌龟在界面上画一条线呢?如同我们用笔写字一样,需要经过“落笔”、“划过”、“抬笔”、“结束”的过程,用turtle库来表达,同样非常直观,用简单的函数就可以:
import turtle as t # 导入turtle库 t.pendown() # 落笔 t.forward(300) # 划过300个单位的长度 t.penup() # 抬笔 t.done() # 结束
1.2、画正方形
向左转90度,我们用turtle中的left(90),向右转30度,我们用right(30),括号中是旋转的角度。
正方形中四个角都是90度,那么小乌龟只需要旋转90度即可。
import turtle as t # 导入turtle库 t.pendown() # 落笔 t.forward(100) # 划过100个单位的长度 t.left(90) # 左转90度 t.forward(100) # 划过100个单位的长度 t.left(90) t.forward(100) t.left(90) t.forward(100) t.left(90) t.penup() # 抬笔 t.done() # 结束
细心的同学们可能已经发现,上面的代码中有四组相同的语句,是不是可以用循环来实现呢?
import turtle as t t.shape('turtle') #显示小乌龟 t.pendown() for j in range(4): # 重复执行4次 t.forward(100) t.left(90) t.penup() t.done()
import turtle as t t.shape('turtle') #显示小乌龟 def drawsquare(): # 定义一个绘制正方形的函数,名为drawsqure() t.pendown() for j in range(4): t.forward(100) t.left(90) t.penup() drawsquare() # 调用这个函数 t.done()
1.3、画多个正方形
import turtle as t def drawsquare(): # 绘制单个正方形 t.pendown() for j in range(4): t.forward(100) t.left(90) t.penup() def drawsquares(): # 绘制多个正方形 for j in range(10): drawsquare() t.right(36) drawsquares() t.done()
1.4、画笔的颜色
填充颜色的时候,先初始化一个颜色。然后,在绘制每个图形之前使用begin_fill(),绘制之后使用end_fill()。这样就能得到一个填充效果。
t.pencolor() # 设置画笔的颜色,可以是字符串如"green", "red",也可以是RGB 3元组。 t.pensize() # 设置画笔的宽度; t.speed() # 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。 t.fillcolor() # 设置填充的颜色 t.begin_fill() # 开始填充 t.end_fill() # 结束填充
import turtle as t def drawsquare(): t.pendown() t.speed(5) t.pensize(5) for j in range(4): t.forward(100) t.left(90) t.penup() def drawsquares(clrs): for j in range(10): t.fillcolor(clrs[j]) # 从列表中选择颜色 t.begin_fill() # 开始填充 drawsquare() t.end_fill() # 结束填充 t.right(36) color_list = ['red', 'pink', 'yellow', 'gray', 'lightblue', 'ivory', 'lightcoral', 'violet', 'moccasin', 'lightseagreen'] # 颜色列表 drawsquares(color_list) t.done()
1.5、坐标系
介绍一下画布中的坐标系,你可能已经发现了,每次绘图的起点都是画布的中心,从原点到A点的距离是100 * sqrt(2):
import turtle as t import math t.pendown() t.left(45) # 等腰直角三角形的底角为45° t.forward(100 * math.sqrt(2)) # 向前移动 t.penup() t.done()
当然,这个小练习你也可以使用forward()函数,不过goto(x,y)会比forward()要简单很多
import turtle as t import math t.pendown() t.goto(100,100) t.penup() t.done()
画字母
import turtle as t import math t.shape('turtle') # 显示出小乌龟 t.penup() # 抬笔,先不要画 t.goto(-250, 100) # 移动到起始点 t.pendown() # 落笔 t.right(60) # 向右旋转60度 t.forward(200) # 向前走200个单位 t.penup() # 抬起笔 t.goto(-150,100) # 去往(-150,100)坐标点 t.pendown() # 落下笔 t.right(60) # 向右旋转60度 t.forward(200) # 向前走200个单位长度 t.penup() # 第一个字母"X"画完,抬笔 t.goto(-50,100) # 前往(-50,100)坐标点 t.pendown() # 落笔 t.left(60) # 向左转60度 t.forward(200) # 向前走200个单位 t.penup() # 抬笔 t.goto(50,100) # 去往(50,100)坐标点 t.pendown() # 落笔 t.right(60) # 向右旋转60度 t.forward(200) # 向前走200各单位长度 t.penup() # 抬笔 t.goto(250,100) # 前往(250,100)坐标点 t.pendown() # 落笔 t.left(30) # 向左转30度 t.forward(100*math.sqrt(3)) # 向前走 t.right(90) # 向右转90度 t.forward(100) # 向前走100个单位 t.right(90) # 向右转90度 t.forward(50) # 向前走50个单位 t.done()
1.6、画曲线
首先画一个圆
import turtle as t t.circle(100) # 画一个半径为100的圆 t.done() # 等效于t.done() 那如果希望turtle按顺时针方向绘制,应该怎样实现? 很简单,将t.circle(100)中的参数100改为-100即可,也就是t.circle(-100)。 import turtle as t t.circle(100, 120) # 画一段120度的弧线 t.penup() # 抬起笔来 t.goto(0, 0) # 回到圆点位置 t.left(90) # 向上画 t.pendown() # 落笔,开始画 t.circle(-100, 120) # 画一段120度的弧线 t.done()
画一条蛇
import turtle as t t.penup() # 抬起笔 t.goto(-150, 0) # 到起始点 t.pensize(25) # 设置画笔粗细 t.pencolor('green') # 设置画笔颜色 t.left(45) # 画笔向左转45度 t.pendown() # 落下画笔 t.circle(-50, 90) # 顺时针方向画90度的弧线 t.circle(50, 90) # 继续按逆时针方向画弧 t.circle(-50, 90) # 顺时针方向画90度的弧线 t.circle(50, 90) # 继续按逆时针方向画弧 t.circle(-50, 90) # 顺时针方向画90度的弧线 t.circle(50, 90) # 继续按逆时针方向画弧 t.circle(-50, 90) # 顺时针方向画90度的弧线 t.circle(50, 45) # 继续按逆时针方向画弧 t.forward(50) # 向前走50个单位 t.circle(10, 160) # 继续画一个160度的小弧 t.forward(8) # 再向前伸一点 t.done()
二、递归算法
翻转字符串
def reverse_str(st): # TODO # 完成函数的定义,函数的功能是将st中的内容倒置 if len(st) == 1: return st[0] else: return st[-1] + reverse_str( st[:-1] ) print(reverse_str("你是年少的欢喜"))
递归树枝
import turtle as t def branch(plist, len): # 自定义函数,画树枝 if len > 16: # 递归的退出条件,树枝的长度小于16时退出 pen_list = [] # 新画笔列表,注意,每次递归都会重新创建一个空列表 for i in plist: # 遍历原画笔列表 # 第一次进入函数时,列表中只有一支画笔,递归时(第二次进入函数),树枝有两叉,所以有两支画笔,以此类推 i.forward(len) # 原画笔划过树枝长度个单位 p = i.clone() # 克隆一支画笔 i.left(65) # 原画笔左转65度 p.right(65) # 克隆的新画笔右转65度 pen_list.append(i) # 将画笔 i 存入新画笔列表 pen_list pen_list.append(p) # 将话题 p 存入新画笔列表 pen_list branch(pen_list, len * 0.65) # 递归,pen_list为新画笔列表,树枝长为上一层的65% # 创建原画笔 # 按照绘制树干基础部分的方法 t.penup() t.goto(0, -200) t.left(90) t.pensize(7) t.pencolor('green') t.pendown() original_pen_list = [t] # 将原画笔添加到画笔列表中 branch(original_pen_list, 200) t.done()
总结
t.pendown()、t.forward()、t.penup()、t.done()可以分别控制画笔落下、前进、抬起、完成。
向左转90度,我们用turtle中的left(90),向右转30度,我们用right(30),括号中是旋转的角度。
我们也可以设置画笔的属性,包括画笔的颜色、宽度、移动速度、填充颜色。
turtle界面默认的坐标系为:正东方向(向右)作为0°,并按逆时针方向旋转,坐标系中的每个点也可以用坐标的形式表示。
练习:奥运五环
import turtle as t t.pensize(10) # 设置画笔粗细 def hua(x,y,r=100,color='green'): global t t.pencolor(color) # 设置画笔颜色 t.penup() t.goto(x, y) t.pendown() t.circle(100) # 画一个半径为150的圆 hua(-150, 0, color='blue') hua(0,0, color='black') hua(150,0, color='red') hua(-75, -100, color='yellow') hua(75, -100, color='green') t.done()
练习:太极图
import turtle as t t.pencolor('black') # 设置画笔颜色 t.fillcolor('black') # 设置填充的颜色 t.begin_fill() # 开始填充 t.penup() t.goto(0, -150) t.pendown() t.circle(150,180) t.end_fill() # 结束填充 t.fillcolor('white') # 设置填充的颜色 t.begin_fill() # 开始填充 t.circle(150,180) t.end_fill() # 结束填充 t.fillcolor('black') # 设置填充的颜色 t.begin_fill() # 开始填充 t.penup() t.goto(0, 0) t.pendown() t.left(180) t.circle(-75,180) t.end_fill() # 结束填充 t.fillcolor('white') # 设置填充的颜色 t.begin_fill() # 开始填充 t.penup() t.goto(0, 0) t.pendown() t.circle(-75,180) t.end_fill() # 结束填充 t.fillcolor('white') # 设置填充的颜色 t.begin_fill() # 开始填充 t.penup() t.goto(0, 100) t.pendown() t.circle(25) t.end_fill() # 结束填充 t.fillcolor('black') # 设置填充的颜色 t.begin_fill() # 开始填充 t.penup() t.goto(0, -50) t.pendown() t.circle(25) t.end_fill() # 结束填充 t.done()