欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

全网最细海龟 (turtle) 画图讲解 (四):绘制图形

程序员文章站 2022-03-23 11:10:42
目录1. 绘制图形1.1 绘制线条1.2 绘制矩形1.3 绘制圆或弧形1.3.1 绘制五环图案1.4 绘制多边形1.5 绘制填充图形1.6 将绘制的图形定义为画笔形状最近博主在 CSDN 上看到许多关于海龟画图的案例,如画圣诞树、五角星等,但是都是直接给出了源码以及一些简单的注释,没有对其详细的说明,会让很多初学者迷糊很久,故这里博主详细地对 turtle 模块中的方法进行详解,让广大博友能够做到*画图。海龟绘图是 Python 内置的一个比较有趣的模块,模块名称为 turtle。它最初源于 20世纪...

最近博主在 CSDN 上看到许多关于海龟画图的案例,如画圣诞树、五角星等,但是都是直接给出了源码以及一些简单的注释,没有对其详细的说明,会让很多初学者迷糊很久,故这里博主详细地对 turtle 模块中的方法进行详解,让广大博友能够做到*画图。

海龟绘图是 Python 内置的一个比较有趣的模块,模块名称为 turtle。它最初源于 20世纪60年代 的 Logo 语言,之后成为了 Python 的内置模块。海龟绘图提供了一些简单的绘图方法,可以根据编写的控制指令(代码),让一个 “海龟” 在屏幕上来回移动,而且可以在它爬行的路径上绘制图形。通过海龟绘图,不仅可以在屏幕上绘制图形,还可以看到整个绘制过程。另外,海龟绘图对初学者十分友好,它能够轻松地编写出很多有趣的实例。

1. 绘制图形

在前面几篇文章中,我们一直绘制的都是直线,实际上,海龟绘图还可以绘制其他形状的图形,如圆形、多边形等,下面分别介绍。

1.1 绘制线条

在海龟绘图中,画笔处在落笔状态时,只要海龟移动时就会绘制出移动轨迹线条。通过改变移动的方向和位置可以绘制出各种线条。在绘制线条时,主要通过前面文章介绍的控制方向和位置的方法实现。下面通过一个实例来演示如何绘制复杂的线条。

通过逆时针旋转 90 度,向前移动,再顺时针旋转 90 度,并向前移动,可以实现一级台阶的绘制,重复多次这样的操作,就可以绘制出多级台阶的形状,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:4.绘制线条.py
@time:2020/12/30
"""
import turtle  # 导入海龟绘图模块

turtle.color("blue")  # 设置画笔颜色为蓝色
turtle.forward(40)  # 向前移动
turtle.left(90)  # 逆时针旋转90°
turtle.forward(20)  # 向前移动
turtle.right(90)  # 顺时针旋转90°
turtle.forward(20)  # 向前移动
turtle.left(90)  # 逆时针旋转90°
turtle.forward(20)  # 向前移动
turtle.right(90)  # 顺时针旋转90°
turtle.forward(20)  # 向前移动
turtle.left(90)  # 逆时针旋转90°
turtle.forward(20)  # 向前移动
turtle.right(90)  # 顺时针旋转90°
turtle.forward(20)  # 向前移动
turtle.left(90)  # 逆时针旋转90°
turtle.forward(20)  # 向前移动
turtle.right(90)  # 顺时针旋转90°
turtle.forward(20)  # 向前移动
turtle.left(90)  # 逆时针旋转90°
turtle.forward(20)  # 向前移动
turtle.right(90)  # 顺时针旋转90°
turtle.forward(40)  # 向前移动
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

程序运行结果如下:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
在绘制线条时,结合循环可以绘制出很多复杂、有趣的图案,例如下面的实例。

使用海龟绘图结合 for 循环可以实现回文图案。实现方法:在循环中,不断地增加移动的距离,并向一个方法旋转指定角度即可实现。具体代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:4.绘制线条.py
@time:2020/12/30
"""
import turtle  # 导入海龟绘图模块

turtle.color("green")  # 画笔颜色为绿色
# 输出回文图案
for i in range(32):  # 循环32次
    turtle.forward(i * 2)  # 向前移动
    turtle.left(90)  # 逆时针旋转90°
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

全网最细海龟 (turtle) 画图讲解 (四):绘制图形

1.2 绘制矩形

在海龟绘图中,没有提供绘制矩形的方法,不过可以使用 旋转+移动位置 来实现。下面看一个具体的实例。

绘制一个长 150像素、宽 200像素 的矩形,并且每条边的颜色不一样。代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:5.绘制矩形.py
@time:2020/12/30
"""
import turtle  # 导入海龟绘图模块

turtle.shape("turtle")  # 改变海龟光标的形状为海龟
turtle.width(3)  # 画笔粗细
turtle.color("orange")  # 画笔颜色为橙色
turtle.forward(200)  # 画一条200像素的线
turtle.left(90)  # 逆时针旋转90°
turtle.color("red")  # 画笔颜色为红色
turtle.forward(100)  # 画一条100像素的线
turtle.left(90)  # 逆时针旋转90°
turtle.color("green")  # 画笔颜色为绿色
turtle.forward(200)  # 画一条200像素的线
turtle.left(90)  # 逆时针旋转90°
turtle.color("purple")  # 画笔颜色为紫色
turtle.forward(100)  # 画一条100像素的线
turtle.ht()  # 隐藏海龟光标
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

程序运行结果如下:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
如果将上图所示的矩形重复旋转多次将得到一个圆形图案,修改后的代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:5.绘制矩形.py
@time:2020/12/30
"""
import turtle  # 导入海龟绘图模块


def draw_rect(num):
    for i in range(1, num + 1):
        turtle.left(5)
        turtle.width(3)  # 画笔粗细
        turtle.color("orange")  # 画笔颜色为橙色
        turtle.forward(200)  # 画一条200像素的线
        turtle.right(90)  # 顺时针旋转90°
        turtle.color("red")  # 画笔颜色为红色
        turtle.forward(100)  # 画一条100像素的线
        turtle.right(90)  # 顺时针旋转90°
        turtle.color("green")  # 画笔颜色为绿色
        turtle.forward(200)  # 画一条200像素的线
        turtle.right(90)  # 顺时针旋转90°
        turtle.color("purple")  # 画笔颜色为紫色
        turtle.forward(100)  # 画一条100像素的线


turtle.ht()  # 隐藏海龟光标可以提升速度
draw_rect(100)
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行程序,将看到不断地绘制彩色边框的矩形,最终停留在下图所示的图案上。
全网最细海龟 (turtle) 画图讲解 (四):绘制图形

1.3 绘制圆或弧形

在海龟绘图中,使用circle() 方法可以绘制圆或者弧形。circle() 方法的语法如下:

def circle(self, radius, extent = None, steps = None)

参数说明:

  1. radius:必选参数,用于指定半径,其参数值为数值。圆心在海龟光标左边一个半径值的位置。如果值为正数,则按照逆时针方向绘制圆弧,否则按照顺时针方向绘制。
  2. extent:可选参数,用于指定夹角的大小,数值 (或None),如果设置为 None 或者省略,则绘制整个圆。另外,如果指定的值不是完整圆周,将以当前画笔位置为一个端点绘制圆弧。
  3. steps:可选参数,用于指定边数。对于圆实际上是以其内切正多边形来近似表示的,这里的 steps 就是指定的正多边形的边数。如果 extent 参数省略时,则该参数需要通过关键字参数的形式指定 (即需要使用 steps = 边数)。

例如,绘制一个红色的,半径为 80 的圆,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:6.绘制圆或弧形.py
@time:2020/12/30
"""

import turtle  # 导入海龟绘图模块

turtle.color("red")  # 设置画笔颜色
radius = 80  # 定义半径
turtle.circle(radius, None)  # 绘制圆
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将绘制下图所示的圆:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
再例如,绘制一个绿色,半径为 80 的半圆弧,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:6.绘制圆或弧形.py
@time:2020/12/30
"""

import turtle  # 导入海龟绘图模块

turtle.color("green")  # 设置画笔颜色
radius = 80  # 定义半径
turtle.circle(radius, 180)  # 绘制半圆弧
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将绘制如图所示的半圆弧:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形

1.3.1 绘制五环图案

通过循环绘制 5 个半径为 100 的不同颜色的圆形,通过调整位置组成五环图案。代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:7.绘制五环图案.py
@time:2020/12/30
"""

import turtle  # 导入海龟绘图模块

turtle.resizemode('auto')  # 改变模式为自动
radius = 100  # 圆的半径
turtle.width(10)  # 画笔粗细

color_list = ['royalblue', 'black', 'red', 'yellow', 'green']  # 颜色列表
turtle.penup()  # 抬笔
turtle.back(radius * 2)  # 移动一个圆的距离
turtle.pendown()  # 落笔
for i in range(5):  # 循环5次
    turtle.color(color_list[i])  # 设置画笔颜色
    turtle.circle(radius)  # 绘制圆
    if i != 2:  # 不是第3个圆时
        turtle.penup()  # 抬笔
        turtle.forward(radius * 2)  # 移动一个圆的距离
        turtle.pendown()  # 落笔
    else:
        turtle.penup()  # 抬笔
        turtle.goto(radius * -1, radius * -1)  # 移动到第二行的第一个圆的位置
        turtle.pendown()  # 落笔
turtle.ht()  # 隐藏画笔
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行程序,将在屏幕上绘制由 5 个圆组成的五环图案,效果如下图所示:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
另外,在海龟绘图中,还提供了绘制圆点的dot() 方法。通过该方法可以在屏幕上绘制指定大小和颜色的实心圆点。dot() 方法的语法如下:

 def dot(self, size=None, *color)

参数说明:

  1. size:用于指定圆点的直径,参数值为 >=1 的整型数,省略则取 pensize+4 和 2*pensize 中的较大值。
  2. color:用于指定圆点的颜色,其参数值为颜色字符串或颜色数值元组。

例如,在屏幕上绘制一个蓝色的、直径为 50 的圆点,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:8.绘制圆点.py
@time:2020/12/30
"""

import turtle  # 导入海龟绘图模块

turtle.dot(50, "blue")
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将在屏幕上绘制下图所示的圆点:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形

1.4 绘制多边形

在海龟绘图中,绘制多边形通常有两种方式。一种是通过circle() 方法实现,另一种是通过循环旋转、移动实现。下面分别进行介绍。
(1) 通过circle() 方法实现
将circle() 方法的参数 steps 设置为想要的多边形的边数,即可绘制指定边数的正多边形,例如,绘制一个正8边形的代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:9.绘制多边形.py
@time:2020/12/30
"""
import turtle

turtle.color("red")
turtle.circle(100, steps=8)  # 绘制正8边形
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将绘制一个正八边形,如下图所示:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
(2) 通过循环旋转、移动实现多边形

在之前绘制矩形时,我们通过移动指定距离(表示边长)并旋转(90度) 4次 绘制出了一个矩形。那么如果把矩形换成正方形,就可以通过循环4次的操作来实现。通过这种方式也可以实现绘制其他的正多边形。关键要素如下:

  1. 循环次数=边数。
  2. 旋转角度=180-内角的度数,内角的度数计算公式为:内角=(边数-2)*180/边数。即旋转角度=180-(边数-2)*180/边数)。
  3. 移动的距离=边长。

例如,要绘制一个彩色边框的正8边形,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:9.绘制多边形.py
@time:2020/12/30
"""
import turtle

color_list = ["pink", "purple", "skyblue", "cyan", "green", "lime", "orange", "red"]
turtle.width(2)  # 线粗2像素
side = 8  # 边数
for i in range(8):
    turtle.color(color_list[i])  # 设置边框的颜色
    turtle.forward(60)  # 边长
    turtle.left(180 - (side - 2) * 180 / side)  # 旋转角度

turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将绘制一个彩色边框的正八边形,如下图所示:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形

1.5 绘制填充图形

在海龟绘图中,默认绘制的图形只显示轮廓,不会填充,这时可以使用 begin_fill( )和 end_fill()方法绘制填充图形。其中begin_fill() 方法放置在绘制要填充的形状之前调用,而end_fill() 方法设置在绘制完要填充的形状之后调用,并且要保证前面已经调用了 begin_fill() 方法。

例如,将上面通过 circle() 方法绘制的正八边形填上绿色,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:10.绘制填充图形.py
@time:2020/12/30
"""

import turtle  # 导入海龟绘图模块

turtle.color("green")  # 填充颜色
turtle.begin_fill()  # 标记填充开始
turtle.circle(100, steps=8)  # 绘制正8边形
turtle.end_fill()  # 标记填充结束
turtle.ht()  # 隐藏画笔
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将显示下图所示的绿色实心正八边形。
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
如果在填充图形之前想要判断当前画笔是否为填充状态,可以使用 turtle.filling() 方法实现,如果返回值为 True,则表示为填充状态,否则为非填充状态。

1.6 将绘制的图形定义为画笔形状

海龟绘图提供了 register_shape()/addshape() 方法可以实现自定义画笔形状功能,这两个方法作用是一样的。register_shape()/addshape() 方法的语法如下:

def register_shape(self, name, shape=None):
def addshape(self, name, shape=None):

参数说明:

  1. name:必选参数,用于指定形状的名称或者可作为形状的 GIF 文件名称,参数值为一个字符串。
  2. shape:可选参数,用于指定能构成画笔形状的坐标值对的元组或者形状(Shape) 对象。

使用 register_shape()/addshape() 方法通常有以下 3 种形式。

(1) 指定参数值为一个 GIF 文件名称
通过该方法实现将指定的 GIF 文件作为画笔的形状,例如,下面的代码将实现定义画笔的形状为 mv.gif 的图片。

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:11.将绘制的图形定义为画笔形状.py
@time:2020/12/30
"""

import turtle

turtle.addshape("mv.gif", shape=None)  # 定义形状
turtle.shape("mv.gif")  # 使用形状
turtle.done()

将 mv.gif 与当前的 Python 文件放置在同级目录下,运行上面的代码,效果如下图所示:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
注意:由于当海龟转向时图像形状不会转动,因此无法显示海龟的朝向。在原地旋转时,将看不出图像形状的转动。

(2) 指定参数值为一个形状(Shape) 对象
在海龟绘图中,提供了 begin_poly()和 end_poly() 方法用于记录多边形。通过在绘制图形开始前和结束后添加这两个方法,可以实现记录图形的功能。所记录的图形可以通过 get_poly() 方法获取为形状,该获取到的形状即可以作为 register_shape()/addshape()方法的 shape 参数值,从而实现将绘制的图形作为画笔形状的功能。

将之前绘制的正八边形定义为画笔形状,如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:11.将绘制的图形定义为画笔形状.py
@time:2020/12/30
"""

import turtle  # 导入海龟绘图模块

turtle.color('green')  # 设置画笔颜色为绿色
turtle.begin_poly()  # 开始记录图形
turtle.circle(100, steps=8)  # 绘制正八边形
turtle.end_poly()  # 结束记录图形
p = turtle.get_poly()  # 获取Shape对象
turtle.addshape('mr', p)  # 定义为画笔形状
turtle.shape('mr')  # 设置使用新定义的画笔形状
for i in range(20):  # 循环20次
    turtle.left(90)  # 逆时针旋转90度
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行程序,在屏幕上先绘制一个绿色的正八边形,然后作为画笔形状的绿色实心正八边形逆时针旋转 5 圈后停止,如图所示:
全网最细海龟 (turtle) 画图讲解 (四):绘制图形
从上图中可以看出,在自定画笔形状时,无论原始图形是否为填充图形,设置为画笔形状时,都会被填充为当前的画笔颜色。

(3) 指定参数值为构成画笔形状的坐标值对的元组。由于确定构成画笔形状的坐标值对的元组比较复杂,所以这里不做介绍。

本文地址:https://blog.csdn.net/xw1680/article/details/111940983