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中 ? : 三元表达式的使用介绍
Oct 09 Python
wxPython事件驱动实例详解
Sep 28 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
Pycharm设置界面全黑的方法
May 23 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
Django REST framwork的权限验证实例
Apr 02 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
Python基于gevent实现高并发代码实例
May 15 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 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
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
Python语言描述KNN算法与Kd树
2017/12/13 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
Python中的面向接口编程示例详解
2021/01/17 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
医学毕业生自荐信
2013/10/11 职场文书
教育局长自荐信范文
2013/12/22 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
物理教育专业求职信
2014/06/25 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android