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出现segfault错误解决方法
Apr 16 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
Python enumerate索引迭代代码解析
Jan 19 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
Python 移动光标位置的方法
Jan 20 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
python+tkinter实现学生管理系统
Aug 20 Python
详解Python中的分支和循环结构
Feb 11 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
详解python方法之绑定方法与非绑定方法
Aug 17 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
分享下php5类中三种数据类型的区别
2015/01/26 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
python实现2048小游戏
2015/03/30 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
考博自荐信
2013/10/25 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
大学新生入学感想
2015/08/07 职场文书
电台广播稿范文
2015/08/19 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python