基于Python+Turtle实现绘制简易的大风车

作者:朱小五 时间:2021-02-25 18:52:11 

前言

大风车,吱呀吱呦呦地转,

这里的风景呀真好看!天好看,地好看……

一首熟悉的歌曲,是否已经把你拉回了童年?

这首歌,估计是每个80后、90后的童年记忆!

小时候守着家里的电视,只要听到这个主题曲,就代表马上会有各种好看的动画片播出。

基于Python+Turtle实现绘制简易的大风车

又是一年6·1儿童节,作为一个Python号,当然又要想想能用python做点什么啦——

Turtle绘制大风车

第一步,先观察风车的重要组成部分,四个扇叶和一个支撑杆。

其中扇叶可以通过构建一个函数,重复绘制4次获得。

基于Python+Turtle实现绘制简易的大风车

以下是绘制风车扇叶的代码部分。

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))

具体绘制过程如下图所示

基于Python+Turtle实现绘制简易的大风车

注:为了能在turtle库使用RGB色彩表示法,小五额外在代码中添加一行:

turtle.Screen().colormode(255)

这样最核心的部分已经画完,那支撑杆就更简单了。

只需要设置合适的宽度和颜色,画一条线段即可。

turtle.pensize(50)
turtle.goto(0,32)
turtle.right(90)
turtle.color('lightgray')
turtle.fd(350)

最终呈现效果:point_down:

基于Python+Turtle实现绘制简易的大风车

这样我们就画好了一个可以手持的风车,但故事才刚刚开始。

如何让大风车,吱呀吱呦地转起来,才是今天文章的重中之重。

这里我采用的方法是:

  • 用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")

基于Python+Turtle实现绘制简易的大风车

但是大家如果直接运行我代码的话,会有报错:OSError: Unable to locate Ghostscript on paths

意思是没有在环境变量中找到 Ghostscript,这就需要下载安装软件

官网下载地址

基于Python+Turtle实现绘制简易的大风车

安装跟自己电脑匹配的版本,然后再配置环境变量。

比如我自己是直接安装到C盘上了,就要将C:\Program Files\gs\gs9.54.0\bin加到path上,来配置好环境变量。

最后,再重启下IDE或命令行,就可以正常用了(因为修改path后,当前运行环境下需重启才能生效)。

经过以上步骤的设置,我们以后就可以直接下载turtle的绘图结果了,而不再需要去截图。

绘制不同角度的图片

绘制不同角度的图片,其实有很多办法,这里我只讲一种方案。

基于Python+Turtle实现绘制简易的大风车

圆周长 = 圆周率 × 半径 × 2,用字母公式就是C = 2πr。

我的方案就是:海龟箭头先绕着半径30的圆,每次前进不同的周长,然后再正常绘图。这样,就相当于绕着这个中心不停旋转地作图。

再搭配上前面学到的保存Turtle为保存jpg,这样就能生成360°不同角度的风车图片了。

for i in range(116):
  draw_windmill(i)

批量绘制+另存为

基于Python+Turtle实现绘制简易的大风车

这样我们生成了大概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:

基于Python+Turtle实现绘制简易的大风车

池塘边的榕树上,知了在声声叫着夏天......

希望我画的这个大风车,能带给大家关于童年的回忆。

来源:https://developer.51cto.com/article/710765.html

标签:Python,Turtle,大风车
0
投稿

猜你喜欢

  • 实例演练ASP+XML编程

    2007-10-11 13:53:00
  • python3的数据类型及数据类型转换实例详解

    2022-06-30 11:24:45
  • python模块的安装以及安装失败的解决方法

    2023-09-14 06:33:04
  • 使用C#配合ArcGIS Engine进行地理信息系统开发

    2023-06-25 16:35:01
  • Sql Server 和 Access 操作数据库结构Sql语句

    2008-02-11 18:59:00
  • 简析 IOS 程序图标的设计

    2011-04-28 09:39:00
  • Pandas实现自定义Excel格式并导出多个sheet表

    2022-10-04 18:46:34
  • Python input函数使用实例解析

    2022-01-05 21:00:34
  • centos 安装mysql中遇到问题的解决办法

    2010-12-14 15:11:00
  • python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现

    2023-07-25 16:29:47
  • 人工智能学习Pytorch梯度下降优化示例详解

    2023-02-11 16:28:02
  • SQL根据指定分隔符分解字符串实现步骤

    2023-07-13 03:09:14
  • Python实现快速保存微信公众号文章中的图片

    2021-02-18 23:03:25
  • CSS改变字体而不影响网页

    2010-10-20 20:11:00
  • 奇怪的PHP引用效率问题分析

    2023-10-29 14:36:04
  • Python中导入模块的几种方式总结

    2023-08-04 17:03:54
  • 国外404错误页面的创意设计欣赏

    2007-08-19 15:44:00
  • python解释器pycharm安装及环境变量配置教程图文详解

    2021-10-13 22:50:44
  • Dreamweaver MX 2004新特点

    2008-02-03 11:35:00
  • 基于Python实现图片一键切割九宫格的工具

    2022-07-05 00:22:31
  • asp之家 网络编程 m.aspxhome.com