最近打算开两个新专题,Python学习和C++学习,由于科研有较高的编程需求,自己的编码能力有待提高,希望将学习的过程记录下来。
今天来玩一个好玩的游戏,借助Python海龟绘图进行绘画,并学会其中的编程原理。
参考:(1)https://blog.csdn.net/suoyue_py/article/details/102458661
(2)https://docs.python.org/zh-cn/3/library/turtle.html#turtle.setheading
1 基础介绍
1.1 海龟绘图
“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
海龟绘图(Turtle Graphics)是python2.6版本中后引入的一个简单的绘图工具,出现在1966年的Logo计算机语言。
海龟绘图(turtle库)是python的内部模块,使用前导入即可 import turtle
海龟有3个关键属性:方向、位置和画笔(笔的属性有色彩、宽度和开/关状态)
1.2 Pycharm 安装和配置
本系统是Ubuntu 18.04,建议大家安装社区版,完全免费。
教程太多了,我就不写了,这里附上一篇,亲测有效。
https://blog.51cto.com/u_15088375/3247761
还需要安装 Anaconda3
1.3 基本元素介绍
1.3.1 画布(canvas)
画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置
- 设置画布的大小:
turtle.screensize(canvwidth=None,canvheight=None,bg=None)
参数分别代表画布的宽、高(单位像素)和背景颜色:
turtle.screensize(800,600,"green")
turtle.screensize()#默认返回(400,300,"white")
另一种设置画布大小的方式:
turtle.setup(width=0.5,height=0.75,startx=None,starty=None)
当长和宽是小数时,代表占据整个屏幕的比例;为整数时,代表像素大小。
(startx,starty)代表窗口左上角的位置,如果为空,整个窗口位于屏幕中心。
example:
turtle.setup(width=800,height=0.8)
turtle.setup(width=800,height=600,startx=100,starty=200)
1.3.2 画笔(Pen)
使用 turtle.Pen() 来创建画笔对象
import turtle
turtle.Pen()
turtle.mainloop()#画面保持
代码执行后就建立了画布,同时屏幕中间可以看见箭头(arrow),即所谓的海龟
在海龟绘图中,海龟的起点即画布中央为 (0,0),移动单位是像素 (pixel)
描述海龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中, 就是使用位置方向描述海龟(画笔)的状态
1.3.3 绘图命令
绘图命令主要分为三种:
- 画笔运动命令
- 画笔控制命令
- 全局控制命令
部分命令解释和补充:
turtle.circle(radius,extent=None,steps=None)#radius=半径,正负有别,extent代表弧度,steps内切正多边形的边数
turtle.setheading(angle)#转变方向,angle指绝对角度,只改变方向不行进
turtle.done()#停止画笔绘制,但是不关闭窗口
2 绘图举例
在实践中学习!
2.1 绘制正方形
import turtle
turtle.setup(800,400)#调整画板大小
turtle.up()#提起笔
turtle.goto(-50,50)#调整画板起始点
turtle.down()#放下笔
turtle.color("red")#画笔颜色
turtle.speed(1)#控制绘画速度# 画图过程
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)# 保持画面
turtle.mainloop()
2.2 绘制太阳花
import turtle as t
import time
t.color("red","yellow")
t.speed(10)
t.begin_fill()for _ inrange(25):
t.forward(200)
t.left(165)
t.end_fill()
time.sleep(5)
2.3 递归绘制树
from turtle import*# 相比于 import turtle as * 这样的区别# 绘制过程使用递归算法,后续解释deftree(branchLen, t):if branchLen >5:
t.forward(branchLen)
t.right(20)
tree(branchLen -15, t)
t.left(40)
tree(branchLen -10, t)
t.right(20)
t.backward(branchLen)
t = Turtle()
myWin = t.getscreen()# 获取屏幕
t.speed(0)
t.hideturtle()# 隐藏箭头
t.left(90)# 掉转绘制方向朝上
t.up()# 画笔离开
t.backward(300)# 将画笔移动到屏幕下方
t.down()# 画笔落下
t.color("green")#调整画笔颜色
tree(110, t)#调用绘制函数
myWin.exitonclick()# 点击关闭屏幕
这种递归方法总体难度还是比较大,大家可以通过Debug的方法来初步进行,了解递归的运行方式。
2.4 绘制旋转多边形
import turtle as t
a =200
t.speed(0)
t.color("green")for x inrange(1,37):
t.forward(a)
t.left(90)
t.forward(a)
t.left(90)
t.forward(a)
t.left(90)
t.forward(a)
t.left(100)
t.mainloop()
2.5 绘制彩色多边形
import turtle
t = turtle.Pen()
t.pensize(5)
colorValue =1
colorStep = colorValue /36
t.speed(0)for x inrange(1,37):
colorValue -= colorStep
t.color(0.5,1, colorValue)
t.forward(200)
t.left(90)
t.forward(200)
t.left(90)
t.forward(200)
t.left(90)
t.forward(200)
t.left(100)
turtle.mainloop()
2.6 绘制一个五角星
import turtle
t=turtle.Pen()
t.hideturtle()
t.pensize(5)#画笔粗细
t.up()
t.goto(-100,50)#画笔移动到画布较为中心的位置
t.down()for i inrange(1,6):
t.forward(200)
t.right(144)
turtle.done()#类似Mainloop,一个循环函数,保证画布持续存在
2.7 迭代绘制五角星
from turtle import*
pen()
pencolor("red")
speed(0)for i inrange(20):
forward(i*20)
right(144)
done()
2.8 绘制彩色五角星+说明字符
from turtle import*
pensize(5)
color("yellow","red")
begin_fill()# 准备填充for i inrange(5):
forward(200)
right(144)
end_fill()# 填充完毕
up()
goto(-200,-100)# 将海龟移动到此位置
pencolor("violet")# 颜色选用紫罗兰
write("WQ",False,"left", font=('Arial',40,'normal'))# 在当前位置输入字符“WQ”,光标回到左下角,font中三项分别指定字型、字号和形式
done()
2.9 绘制小蛇
from turtle import*
setup(900,350,200,200)
up()
fd(-350)
down()
pensize(25)
color("purple")# 控制画笔起始方向
seth(-40)# 绘制蛇身for i inrange(4):
circle(60,80)
circle(-60,80)
circle(60,80/2)# 绘制蛇头
fd(60)
circle(32,180)
fd(60*2/3)
done()
2.10 绘制科赫曲线和科赫雪花
- 科赫曲线
import turtle
defkoch(size, n):if n ==0:
turtle.fd(size)else:for angle in[0,60,-120,60]:
turtle.left(angle)
koch(size /3, n -1)defmain():
turtle.setup(800,400)
turtle.up()
turtle.goto(-300,-50)
turtle.down()
turtle.pensize(2)
koch(600,3)
turtle.hideturtle()
turtle.done()
main()
- 科赫雪花
科赫雪花相当于画了三次科赫曲线
#绘制科赫雪花import turtle
defkoch(size,n):if n ==0:
turtle.fd(size)else:for angle in[0,60,-120,60]:
turtle.left(angle)
koch(size/3,n-1)defmain():
turtle.setup(600,600)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level =3#3阶科赫雪花,阶数
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
turtle.done()
main()
在本讲中,尝试使用海龟绘图模块(类)绘制一些基础图形,学习了一些Python编程的基础知识,当然还有很多都没涉及到,大家可以自行学习!
版权归原作者 北理光头强 所有, 如有侵权,请联系我们删除。