用Python标准库turtle画一头金牛,祝您新年牛气冲天!

今年是牛年,祝大家新年牛气冲天!嗨皮牛Year!

前几天在百度图片里下载了一张金牛的图片,就是上面的这张。想着用Python标准库turtle肯定可以画出这张图,所以说干就干,花两天时间实现了。

运行效果如下图:

同时我也把绘图过程录成了视频,视频可以免费下载,下载连接:https://download.csdn.net/download/weixin_43790276/15123907

画图虽然不是Python的主要功能,但绘制这头金牛还是展示了Python无所不能的强大属性。接下来介绍实现的过程。

一、图片分析

初看图片,深红色的背景下,一头金光闪闪的金牛。简单分析,图形主要分为两大部分,外面的圆环和内部的金牛。

圆环由同心圆和折线形的圆盘构成,同心圆直接画圆就可以,折线形的圆盘是旋转对称的,每一个部分由圆弧和半径方向的线组成,一共有26个相同的部分,计算出每个部分的弧形比例即可依次绘制。

金牛图形是不规则的,里面有很多不同弧度和不同长度的不规则曲线,控制画笔边前进边旋转,每次前进不同的距离和旋转不同的角度,可以绘制出这些曲线。里面的图案,如五瓣花就是用这种方式完成。

对图形有了基本的了解,就看turtle中有哪些方法可以用于实现这些操作了。

二、用到的Turtle方法介绍

turtle是Python的标准库,直接导入即可使用。

from turtle import *

1. 画布设置

setup(width, height, x, y): 设置窗口大小和窗口左上角在屏幕中的位置。

title(): 设置窗口的标题。

screensize(width, height, color): 设置画布大小,背景颜色。

done(): 绘图结束后,不自动关闭窗口。

2. 画笔设置

pencolor(color): 设置画笔颜色。

penup(): 提起画笔,提起后移动画笔不会留下痕迹。

pendown(): 落下画笔,开始绘图前先将画笔落下。

speed(int): 设置画笔的速度,传入1~10的数字,1最慢,10最快。传入其他值会更快,但是没有鼠标移动的动画效果。

setx(value): 设置画笔的x轴坐标。

sety(value): 设置画笔的y轴坐标。

towards(x, y): 设置画笔指向的点。

setheading(): 设置画笔的方向。与towards()配合可以设置画笔指向某个点,如setheading(towards(0, 0))可以设置画笔指向原点。

3. 画笔操作

circle(radius[, extent=arc]): 画一个圆,传入圆的半径,根据画笔的方向控制圆心的位置,圆心与画笔的方向垂直。传入弧度值可以画出指定弧度的圆弧。

left(angle): 画笔左转,传入任意一个目标角度。

right(angle): 画笔右转。

forward(distance): 画笔前进一段距离。

backward(distance): 画笔后退一段距离。

goto(x, y): 移动画笔到指定坐标。

4. 颜色填充

begin_fill(): 开始填充。

fillcolor(color): 设置图形中填充的颜色。

end_fill(): 结束填充。

有了这些方法,就可以实现金牛图中的各种图案了。如画五瓣花轮廓的代码如下:

def draw_flower(a, color):pencolor('red')begin_fill()for j in range(5):for i in range(40):if 0 <= i < 20:a = a - 0.08else:a = a + 0.08forward(a)left(6)right(168)fillcolor(color)end_fill()

三、实现举例

我的绘图顺序是从外到内,这样较小的图形会置于较大的图形之上,填充的颜色不会被遮挡。

最开始绘制的是外围的同心圆。先penup()提起画笔,sety()将画笔从圆心向下移动半径的距离,然后调整画笔方向,pendown()落下画笔,circle()画圆。

为了避免篇幅过长,这里就不一一分析了。再放一张最后画眼睛的动图,可以参照上面同心圆的方式拆分步骤。

其他的图案,如果会相互覆盖,要先画大的图形,再画小的图形。如果不会相互覆盖,顺序可以随意调整。

四、总结

对比原图和turtle绘制的图形,整体上还是很像的,但部分细节并没有完全还原。因为没有原图的任何参数,绘制过程中全靠目测(像素尺子),很难避免误差,再花一些时间调试应该可以更像。

代码很长,有1000多行,都是重复上面介绍的那些方法。代码重构优化的空间很大,如将重复的代码抽取重用,调整代码的顺序减少画笔的移动距离,将填充颜色的代码写成装饰器等。不过,因为实现功能已经花了两天时间,所以懒得改了,如果下次还会使用,再改吧,比如明年画一只金虎,到时候肯定是先重构代码然后调用会更快。

文中没有附代码,如果需要完整代码可以扫码关注公众号“Python碎片”,然后在后台回复“金牛”关键字获取。

用Python标准库turtle画一头金牛,祝您新年牛气冲天!相关推荐

  1. 用Python标准库turtle画一头金牛,祝您新年牛气冲天!(附源码)

    今年是牛年,祝大家新年牛气冲天!嗨皮牛Year! 前几天在百度图片里下载了一张金牛的图片,就是封面的这张.想着用Python标准库turtle肯定可以画出这张图,所以说干就干,花两天时间实现了. 画图 ...

  2. 用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利

    用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利! 虎年到了,祝大家新年虎虎生威!大吉大利! 去年我用Python画了一头金牛,参考:https://blog.csdn.net/ ...

  3. 用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利!

    大家好,我是辰哥~ 点击下方名片关注和星标『Python研究者』!

  4. Python第三方库turtle画小人发射爱心

    废话不多说直接上代码 import turtle as trdef Mini_people():tr.pensize(3)tr.up()tr.goto(-200, 165) # 脖子坐标tr.down ...

  5. Python标准库〖 turtle 〗

    Python标准库[ turtle ] 1. 简介 2. 基础知识 2.1 画布(canvas) 2.2 画笔 2.2.1 画笔的状态 2.2.2 画笔的属性 2.2.3 绘图命令 2.2.3.1 运 ...

  6. Python标准库:turtle库的简单快速入门

    在计算机二级Python的计算生态(其实也就是库)考察中,可以分为两大类:标准库和第三方库. 而标准库中明确要求掌握的就是turtle库和random库,第三方库大都是掌握其在各个常用领域的一些主流库 ...

  7. python标准库random中函数的作用_Python随机函数库random的使用方法详解

    Python随机函数库random的使用方法详解 前言 众所周知,python拥有丰富的内置库,还支持众多的第三方库,被称为胶水语言,随机函数库random,就是python自带的标准库,他的用法极为 ...

  8. 第 9 章 Python 标准库概览

    整理的文章内容主要来源为高教版<计算机等级考试二级 Python>教程视频讲义,并且更正了原讲义中的错误的地方. 专栏文章索引如下: 考试大纲 第 1 章 程序设计基本方法 第 2 章 P ...

  9. Python标准库介绍

    1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...

最新文章

  1. 2022-2028年中国云服务市场深度调研及投资前景预测报告
  2. elasticsearch外网访问
  3. 深入理解Java注解Annotation及自定义注解
  4. 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' 的异常
  5. face recognition[翻译][深度人脸识别:综述]
  6. 成功解决ImportError: Could not find ‘cudart64_90.dll‘. TensorFlow requires that this DLL be installed in
  7. error LNK2001: unresolved external symbol _WinMain@16
  8. Postman转换为Jmeter
  9. java多线程【线程安全问题】
  10. 随想录(关于dsp)
  11. 1006. Sign In and Sign Out (25)-PAT甲级真题
  12. svr测试用MATLAB,基于MATLAB的SVR回归模型的设计方案.doc
  13. 新手教程:采用AD9软件画原理图
  14. 主成分分析(PCA)原理详解
  15. 基于FPGA的密码锁
  16. python3+selenium3+ie9初体验
  17. c++字符串与c字符串
  18. matlab dx dy dt,y/(y^2+1)dy=dx/(x^2-1)
  19. 微信小程序 生成小程序码 + Java后台
  20. 嵌入式开发专业术语概念汇总

热门文章

  1. 中矿新生赛 H 璐神看岛屿【BFS/DFS求联通块/连通块区域在边界则此连通块无效】...
  2. 计算概论(A)/基础编程练习1(8题)/3:晶晶赴约会
  3. [Matlab]求解线性方程组
  4. log4net简单配置内容
  5. cornerstone 库删除 后 重新添加 ,引用找不到,
  6. 通过组策略批量安装Lync 2010客户端
  7. Docker的今生前世,关于Docker的一些见解
  8. 阿里云原生数据库POLARDB压力测试报告
  9. C语言,利用数组编写程序输入30个数,分别统计正整数,0,负数个数,并求和
  10. c语言 指正判断字符串大小