Python学习——海龟绘图

Posted 北理光头强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习——海龟绘图相关的知识,希望对你有一定的参考价值。

最近打算开两个新专题,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 _ in range(25):
    t.forward(200)
    t.left(165)

t.end_fill()
time.sleep(5)

2.3 递归绘制树

from turtle import *
# 相比于 import turtle as * 这样的区别

# 绘制过程使用递归算法,后续解释
def tree(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 in range(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 in range(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 in range(1,6):
    t.forward(200)
    t.right(144)

turtle.done() #类似Mainloop,一个循环函数,保证画布持续存在

2.7 迭代绘制五角星

from turtle import *

pen()
pencolor("red")
speed(0)

for i in range(20):
    forward(i*20)
    right(144)

done()

2.8 绘制彩色五角星+说明字符

from turtle import *

pensize(5)
color("yellow", "red")
begin_fill() # 准备填充
for i in range(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 in range(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


def koch(size, n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size / 3, n - 1)


def main():
    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
def koch(size,n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0,60,-120,60]:
            turtle.left(angle)
            koch(size/3,n-1)
def main():
    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编程的基础知识,当然还有很多都没涉及到,大家可以自行学习!

通过海龟绘图学习Python-01

作为一名Python初学者,看教程死记硬背理论知识固然是必要的,也可以通过海龟绘图的方式进行实践操作。在实践的过程中加深对理论知识的理解。
接下来,本人将通过海龟绘图的方式开启Python的学习之路。
注:Python的基本理论知识可以通过官网网站进行学习,网上也有很多的教材,本人假定读者已经学习了入门知识。

  1. 什么是海龟绘图
    海龟绘图是Python内置的turtle 模块(源码: Lib/turtle.py),使用海龟绘图可以编写重复执行简单动作的程序画出精细复杂的形状。
    例如下图
    技术图片

2.如何使用
导入turtle模块就可以看到,如下图所示

技术图片
可以直接在python界面运行
import turtle
turtle.shape("turtle")
turtle.exitonclick()

也可以在开发工具界面运行
技术图片

3.用海龟绘图做点什么吧
请注意,默认这只乌龟在界面的正中间,面朝正右方。
3.1走两步
import turtle #导入模块
turtle.shape("turtle")#外形显示乌龟
turtle.forward(100)#向前移动距离100像素
turtle.exitonclick()#点击退出
技术图片

3.2循环
乌龟可以转向,再继续走,再转向继续走。

import turtle#导入模块
turtle.shape("turtle")#外形显示乌龟
turtle.forward(100)#向前移动距离100像素
turtle.left(90)#左转90度
turtle.forward(100)#向前移动距离100像素
turtle.left(90)#左转90度
turtle.forward(100)#向前移动距离100像素
turtle.left(90)#左转90度
turtle.forward(100)#向前移动距离100像素
turtle.exitonclick()#点击退出
技术图片

这个代码看上去有点长,走个正方形这么简单的事情要写这么长,要做更复杂的操作那代码得写多少啊。赶紧优化一下。
import turtle#导入模块
turtle.shape("turtle")#外形显示乌龟
for a in range(4):#定义变量执行4次
turtle.forward(100)#向前移动距离100像素
turtle.left(90)#左转90度
turtle.exitonclick()#点击退出
注意:定义变量的冒号后,第二行需要有空格

如果要走更复杂的路线呢:
技术图片
import turtle#导入模块
turtle.shape("turtle")#外形显示乌龟
for a in range(16):#定义第一个变量
turtle.left(22.5)#定义左转角度
for b in range(4):#定义第二个变量
turtle.forward(100)#向前移动距离100像素
turtle.left(135)#定义左转角度
turtle.exitonclick()#点击退出

乌龟走了一个复杂的图案,如果不使用变量,那写的脚本就长的不知道哪里去了,现在通过变量只需要不到10行就搞定了。

今天先到这儿,下次再继续。

关于海龟绘图的详细信息可以参考官网,因为要搬×××才能访问,我就不贴具体的网址了。
技术图片

以上是关于Python学习——海龟绘图的主要内容,如果未能解决你的问题,请参考以下文章

海龟库画春联怎么画

python_海龟绘图_坐标系问题_画笔各种方法-python工作笔记013

python课程设计笔记turtle绘图库(海龟库)

python海龟画图怎么把背景变成黑色

python海龟作图怎么打开?

Python海龟围绕8字走的代码?