基于Python+Turtle实现绘制简易的大风车
作者:朱小五 发布时间:2021-02-25 18:52:11
前言
大风车,吱呀吱呦呦地转,
这里的风景呀真好看!天好看,地好看……
一首熟悉的歌曲,是否已经把你拉回了童年?
这首歌,估计是每个80后、90后的童年记忆!
小时候守着家里的电视,只要听到这个主题曲,就代表马上会有各种好看的动画片播出。
又是一年6·1儿童节,作为一个Python号,当然又要想想能用python做点什么啦——
Turtle绘制大风车
第一步,先观察风车的重要组成部分,四个扇叶和一个支撑杆。
其中扇叶可以通过构建一个函数,重复绘制4次获得。
以下是绘制风车扇叶的代码部分。
def draw_sector(col1,col2):
turtle.color(col1,col1)
turtle.circle(30,90)
turtle.right(90)
turtle.begin_fill()
turtle.fd(120)
turtle.right(90)
turtle.fd(150)
turtle.right(135)
turtle.fd(150*(1.414)-30)
turtle.end_fill()
turtle.color(col2,col2)
turtle.begin_fill()
turtle.right(90)
turtle.circle(30,90)
turtle.right(90)
turtle.fd(75*1.414-30)
turtle.right(90)
turtle.fd(150/1.414)
turtle.right(135)
turtle.fd(120)
turtle.end_fill()
turtle.right(90)
而我们只需要循环四次,即可获得风车的最核心部分。
# 绘制四个扇形
turtle.pensize(3)
draw_sector('green','darkgreen')
draw_sector((26,188,156),(22,160,133))
draw_sector((241,196,15),(243,156,18))
draw_sector((231,76,60),(192,57,43))
具体绘制过程如下图所示
注:为了能在turtle库使用RGB色彩表示法,小五额外在代码中添加一行:
turtle.Screen().colormode(255)
这样最核心的部分已经画完,那支撑杆就更简单了。
只需要设置合适的宽度和颜色,画一条线段即可。
turtle.pensize(50)
turtle.goto(0,32)
turtle.right(90)
turtle.color('lightgray')
turtle.fd(350)
最终呈现效果:point_down:
这样我们就画好了一个可以手持的风车,但故事才刚刚开始。
如何让大风车,吱呀吱呦地转起来,才是今天文章的重中之重。
这里我采用的方法是:
用Turtle绘制旋转不同角度的大风车
将Turtle绘制的界面保存成本地图片
将所有角度的图片合成一个 gif 动图
上述这几步,都可以用python实现自动处理,那就简单多了。
保存为jpg图片
首先,海龟绘图(Turtle Graphics)库是一个非常好用的矢量绘图工具。
但想将其绘图结果保存为本地图片还需要好几步。
# 保存eps
ts = turtle.getscreen()
ts.getcanvas().postscript(file=r"结果.eps")
上面两行代码只能将Turtle绘图保存为eps矢量格式。
eps格式图片可以用PS打开,再手动另存为png、jpg等。但太麻烦了,学会了python肯定优先考虑python批量转换。
通过查找,发现可以用PIL来进行图片格式转换。
from PIL import Image
im = Image.open("结果.eps")
im.save("结果.jpg", "JPEG")
但是大家如果直接运行我代码的话,会有报错:OSError: Unable to locate Ghostscript on paths
意思是没有在环境变量中找到 Ghostscript,这就需要下载安装软件
官网下载地址
安装跟自己电脑匹配的版本,然后再配置环境变量。
比如我自己是直接安装到C盘上了,就要将C:\Program Files\gs\gs9.54.0\bin加到path上,来配置好环境变量。
最后,再重启下IDE或命令行,就可以正常用了(因为修改path后,当前运行环境下需重启才能生效)。
经过以上步骤的设置,我们以后就可以直接下载turtle的绘图结果了,而不再需要去截图。
绘制不同角度的图片
绘制不同角度的图片,其实有很多办法,这里我只讲一种方案。
圆周长 = 圆周率 × 半径 × 2,用字母公式就是C = 2πr。
我的方案就是:海龟箭头先绕着半径30的圆,每次前进不同的周长,然后再正常绘图。这样,就相当于绕着这个中心不停旋转地作图。
再搭配上前面学到的保存Turtle为保存jpg,这样就能生成360°不同角度的风车图片了。
for i in range(116):
draw_windmill(i)
批量绘制+另存为
这样我们生成了大概100多张图片。
图片合成 gif 动图
如何将图片合成 gif 动图?
我直接参考了黄同学之前的文章[2]代码来用,关键的步骤都有注释。
这样就可以用python合成图片为gif动图了:point_down:
def func(DURATION):
# 获取当前的工作路径
path = os.getcwd()
# 获取当前工作路径下的文件列表
file_list = os.listdir(path)
# 复制文件列表到另外一个列表
jpg_list = file_list.copy()
# 移除结尾不是png的图片,只保留结尾都是png的图片
for file in file_list:
if file[-3:]!= "jpg":
jpg_list.remove(file)
# 将图片中的数字,升序排列
jpg_list.sort(key=lambda x: float(x[:-4]))
# 获取每张图片的绝对路径,并获取每张照片的RGB通道值,将7张照片的RGB通道值,保存在一个列表中
print(jpg_list)
frames = []
for png in jpg_list:
image_path = os.path.join(path, png)
frames.append(imageio.imread(image_path))
# 将图片保存为gif图,并设置间隔时间
gif_path = os.path.join(path, "my_gif.gif")
imageio.mimsave(gif_path, frames, 'GIF', duration=DURATION)
设置好间隔时间,执行一下
func(0.008)
看看效果
旋转的手持大风车 :point_down:
池塘边的榕树上,知了在声声叫着夏天......
希望我画的这个大风车,能带给大家关于童年的回忆。
来源:https://developer.51cto.com/article/710765.html


猜你喜欢
- 今天主要来实现一个权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样,首先先看下数据库总共
- 本文实例讲述了python查找指定具有相同内容文件的方法。分享给大家供大家参考。具体如下:python代码用于查找指定具有相同内容的文件,可
- 1.Word文档如下:2.代码# -*- coding: UTF-8 -*-from docx import Documentdef rea
- 下面是在深度学习数据集处理过程中可能会用到的一个小程序,帮助我们根据图片文件的名字来分开图片:import osimport shutilp
- mysql数据库数据表和数据表关联--问题??用户数据表user 字词作品数据表article 短信 message外键ID 主键,之间的关
- 直接给源代码了:$current_dir = 'E:/temp/';$dir = opendir($current_dir)
- Python lxml安装失败针对windows系统LXML安装失败而且pip升级也失败解决方案原因可能是pip没有安装到python我们需
- fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件readlines()方法,区
- 做开发中难免时间类型之间的转换, 最近就发现前端js和后端django经常要用到这个转换, 其中jsDate.now()精确到毫秒,而Pyt
- 1,前端样式2,html代码{% load asset_filter %}<div class="col-sm-2"
- 踩了很多坑,记录一下这次试验,本次测试环境:Linux centos7 64位。pyenv是一个python版本管理工具,它能够进行全局的p
- Function getIpvalue(clientIP)'得到客户端的IP转换成长整型,返回值getIpvalue&nb
- Data Points Archive 有时, 为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整。啊,但关键在于确定如
- 报错[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE]问题描述pandas读取网络表格时pd.read_excel(u
- 对于PyQT4, PyQT5在一些使用上有着比较明显的变化有很大的变化,让人惊讶是在emit和connect上的一些变化比较有意思,相信也是
- paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Lin
- 科讯sql商业版中用到的ajax空间与分页函数,他们的js代码学习是非常不错的//ajax 控件 function Pa
- 使用django启动命令行和脚本,可以方便的使用django框架做开发,例如,数据库的操作等。下面分别介绍使用方法。django shell
- 人丑就要多读书,颜值不够知识来凑,至少你可以用书籍来武装你的大脑,拯救你的人生。TIOBE编程语言排行榜前20的语言入门书籍推荐
- 装饰器一、介绍器:代表函数的意思。装饰器本质就是是函数功能:装饰其他函数,就是为其他函数添加附加功能 被装饰函数感受不到装饰器的存