python基于turtle绘制几何图形


Posted in Python onJune 15, 2021

1. 什么是turtle

turtle模拟了人在画布前画画的过程:给你一支笔(Pen), 下笔(pendown),移动画笔绘制你的图形,然后填色等等。turtle提供了几种简单的命令,通过组合他们的顺序,只要够耐心,turtle可以画出令人惊叹的作品,很适合用来引导小朋友学习编程。

先来感受下作品:

python基于turtle绘制几何图形

2. turtle例子

我们通过一个简单的例子来了解turtle的基本操作

import turtle

# screen 画布属性设置
canvas = turtle.Screen()
canvas.bgcolor("white")

# 画笔设置
pen = turtle.Pen()
pen.hideturtle()
pen.color('red', 'yellow')

# 开始画第一个部分,并填充颜色
pen.begin_fill()
while True:
    pen.forward(200)
    pen.left(170)
    if abs(pen.pos()) < 1:
        break
pen.end_fill()

# 提笔, 移动位置,画第二个部分
pen.penup()
pen.goto(-100, -100)
pen.pendown()

for i in range(5):
    pen.forward(30) #长度300像素
    pen.right(144) #转角144度

turtle.done()

python基于turtle绘制几何图形

从上面可知turtle有两个部分组成画笔Turtle 和 画布Screen, Turtle在Screen上移动来作画。
需要注意的是,turtle起始的位置是(0, 0),位于画布中心,左边和下边的坐标为负值。
画笔Turtle重要操作:

  • 画笔申明:如果画笔上有很多画笔需要 申明 turtle.Pen(),否则 默认是一个画笔,无需申明,如turtle.forward(50)就是表示画笔向前移动50
  • 画笔颜色:color('red', 'yellow'), 第一个red表示画笔颜色, yellow表示填充颜色
  • 填充的范围:begin_fill()和end_fill()之间的部分
  • 画笔的移动:forward是向前多少距离,left是向左角度, 与之对应的是向后backward 和向右right。goto()是移动到某个坐标值
  • 画笔的当前属性:如位置pos()即海龟当前的坐标 (x,y) ,还有如朝向角度值:heading()
  • 画笔的控制:penup和pendown,默认画笔是在pendown状态下,只要有移动就会在画布上画出图形,如果需要调整位置,在另外一个位置下笔,需要先penup,否则移动画笔时也会有线条出来。这个和现实中画画是一样的。
  • 画笔的可见性:正常情况下画笔时一个箭头的形状,可以通过hideturtle()和showturtle()隐藏和显示画笔

Screen重要操作:

  • 设置背景颜色:bgcolor("white")

3. 其他turtle功能

除了上面例子中涉及到turtle常用功能函数,还有一些重要的功能。

  • 圆形circle() 前面的例子给出的是直线的例子(直线可以构成三角形,多边形等),另外一个重要的图形是圆形turtle.circle(radius, extent=None, steps=None)

我们来看一个太极的例子:

import turtle
from turtle import *  #从turtle中导出所有模块
radius = 100     #半径为100
color("black", "black")  #画线颜色黑色,填充颜色黑色
begin_fill()  #开始填充
circle(radius/2, 180)  #逆时针画圈,半径为50,180°
circle(radius, 180)  #逆时针画圈,半径为100,180°
left(180)  #转向180°
circle(-radius/2, 180)  #顺时针画圈,半径50,180°
end_fill()  #填充结束
#移动到画太极图黑色的小圈位置,开始画小白圈
left(90)#左转向90°,海龟头垂直水平线向上
penup()#提笔,不留痕迹
forward(radius*0.35)#向前,半径的0.35=35像素
right(90)#右转向90°,海龟头与右侧水平线同向
pendown()#落笔,开始画线
#开始画太极图黑色部分的小白圈
color("white", "white")#画线颜色为白色,填充颜色为白色
begin_fill()#开始填充
circle(radius*0.15)#逆时针画圈,半径的0.15=15像素(35+15+15+35=100)
end_fill() #填充结束

left(90)#左转向90°
penup()#提笔,不留痕迹
backward(radius*0.7)#后退往下走,为半径的0.7=70,此时海龟头朝上与水平垂直
pendown()#落笔,开始留下痕迹
left(90)#左转90°,此时海龟头与左侧水平同向
#开始画太极图白色部分里的小黑圈
color("black", "black")#画线颜色为黑色,填充为黑色
begin_fill()#开始填充
circle(radius*0.15)#开始逆时针画圈,半径的0.15=15个像素
end_fill() #填充完毕

right(90)#再右转90°,此时海龟头垂直水平线向上
penup()#提笔,不留痕迹
backward(radius*0.65)#后退为半径的0.65=65个像素,往下到达太极图黑色半圈的底点处
right(90)#右转90°,海龟头与右侧水平线同向
pendown()#落笔,开始留下痕迹
circle(radius, 180)#逆时针画圈,半径100,180°,画太极图的白色部分的大圈
hideturtle()#隐藏笔头hideturtle
turtle.done()
  • radius:半径, radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向
  • extent:表示是否画部分的圆,如半圆是180,默认是一整个圆
  • steps:是表示画圆用多少个多边形来画。圆其实是无穷多个多边形来近似得到。不过一般情况下,一定程度的多边形,肉眼就会人为圆的幅度是光滑的

python基于turtle绘制几何图形

可以看出太极图有2个小半圆和2个大半圆,以及2个更小的整圆构成。

  • 动画控制 turtle绘制图像的过程其实是动态的,每绘制一个部分画面可以理解为一个视频帧,画完视频就结束。所以turtle除了可以绘制图形,还可以用来做动画演示或者交互游戏也是可以。下面以一个例子说明下:
  import turtle, time
  # 初始不更新画面
  turtle.tracer(0)

  # 地板墙
  wall = turtle.Pen()
  wall.pencolor('red')
  wall.pensize(10)
  wall.hideturtle()
  wall.penup()
  wall.goto(-300, -200)
  wall.pendown()
  wall.forward(600)

  # 小球
  R = 15
  ball = turtle.Turtle('circle')
  ball.shapesize(R / 10)
  ball.penup()
  pos_x, pos_y = [100, 100]
  pos_x, pos_y = ball.pos()
  ball.goto(pos_x, pos_y)
  wall_x, wall_y = wall.pos()

  # 球参数
  FPS = 60  # 每秒60帧
  G = 0.03  # 模拟重力加速度
  DRAG = 0.9956 # 阻力
  v_y = 1 # 初始速度

  while True:

      # 清除印章
      ball.clearstamps()

      v_y += G  # 模拟重力加速度
      if pos_y - R - 10 < wall_y:  # 撞地面
          v_y *= -1

      pos_x, pos_y = pos_x, pos_y - v_y
      ball.goto(pos_x, pos_y)
      v_y = v_y * DRAG

      # 通过印章显示球
      ball.stamp()

      # 更新画面信息
      turtle.update()
      time.sleep(1 / FPS)

python基于turtle绘制几何图形

4. 更多的例子

玫瑰曲线

from turtle import *
from math import *
color("red")
def draw(a,end):
    t=0
    while t<(14*end):
        x=a*sin(t*3.14)*cos(t)
        y=a*sin(t*3.14)*sin(t)
        goto(x,y)
        t=t+0.03

draw(100,3.14)
done()

python基于turtle绘制几何图形

螺旋

import turtle
t=turtle.Pen()
for x in range(360):
    t.forward(x)
    t.left(59)

done()

python基于turtle绘制几何图形

扇子

from turtle import *
forward(200)
left(90)
fillcolor('red')
begin_fill()
circle(100,180)
end_fill()
left(90)
forward(100)
for i in range(17):
    left(10)
    pencolor('yellow')
    forward(100)
    backward(100)
left(100)
pensize(10)
pencolor('red')
forward(100)
hideturtle()
done()

python基于turtle绘制几何图形

5. 总结

本文分享了python的logo语言turtle库,可以绘制图画和动画。总结如下:

  • turtle两个重要元素:画布Screen和画笔Turtle
  • 默认当前为一个画笔,turtle.Pen()申明多个画笔
  • 画笔属性:颜色color, 大小pensize,位置pos
  • 画笔填充:begin_fill()和end_fill()
  • 画笔移动:前后forward和backward, 角度left和right
  • 圆形画笔:circle
  • 画笔控制:penup 和pendown
  • 动画控制:update和trace追踪

6. 参考资料

https://docs.python.org/zh-cn/3/library/turtle.html#

以上就是python基于turtle绘制几何图形的详细内容,更多关于python turtle绘制几何图形的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python统计日志中每个IP出现次数的方法
Jul 06 Python
python学习 流程控制语句详解
Jun 01 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
Python获取当前路径实现代码
May 08 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
python实现搜索文本文件内容脚本
Jun 22 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
python实现双人五子棋(终端版)
Dec 30 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
详解Flask开发技巧之异常处理
Jun 15 #Python
Python Pandas常用函数方法总结
Jun 15 #Python
深入理解python协程
Jun 15 #Python
2021年最新用于图像处理的Python库总结
Python中的xlrd模块使用整理
Jun 15 #Python
浅谈python中的多态
Jun 15 #Python
如何正确理解python装饰器
Jun 15 #Python
You might like
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
document.documentElement和document.body区别介绍
2013/09/16 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
webpack打包node.js后端项目的方法
2018/03/10 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
vue-cli配置环境变量的方法
2018/07/09 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
Python全局变量用法实例分析
2016/07/19 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
django celery redis使用具体实践
2019/04/08 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
Python如何调用外部系统命令
2019/08/07 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
绝对经典成功的大学生推荐信
2013/11/08 职场文书
考试没考好检讨书
2014/01/31 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
2015高考寄语集锦
2015/02/27 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
Python中的pprint模块
2021/11/27 Python