日记240. 画一个毕导的圣诞节水饺笑脸?

作者: | 更新日期:

画了一个水饺,并进行了几轮优化。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

一、问题背景

圣诞节这一天,网红毕导分享了一个动图。

看到动图的背景就是源码,我突然想去研究下这些动画都是怎么画的。

于是就分析了背景中的源码,并进行了优化。

最终源码已上传,关注公众号,对话框中回复“圣诞节水饺”获取。

二、图片中模糊的源码

背景中的源码其实非常模糊,但是使用 ipad 截图并放大,还是大概看清楚了。

可以得到三个信息。

1、左右两列代码一模一样,仅仅是为了样式好看。
2、根据下面的执行命令,可以发现是 python 写的,用了 turtle 库。
3、代码全文都是 turtle 前缀,说明这个库是图形库,可以用来画图。

所以,我们自己想要画图,安装一下 python 语言和 turtle 库,把代码抄下来运行就行了。

网上查阅资料后,发现 turtle 库是 python 语言自带的。
所以环境安装更简单了,去 python 官网下载自己操作系统的二进制,双击即可安装。

三、脑补的代码

图片中的代码虽然看不清,但是还是可以看清一些。

于是我就把代码抄下来了。

由于代码不全,运行结果是这样。

所以剩余的部分,需要我们自己脑补出来。

脑补之前,就需要先学习 turtle 库的语法了。

于是我去官网的 doc 简单浏览了下,发现这个图形库果然比较简单。

官网地址: https://docs.python.org/zh-cn/3/library/turtle.html

简单看了文档,再看一遍毕导的代码,给每个函数补充了注释说明。

注释写了一遍,turtle 库我经已经完全掌握了。

然后就脑补除了所有代码,画出了毕导的水饺。

四、优化:函数封装

毕导的代码是典型的初学者代码。

最大的特征就是没有函数封装,像写汇编代码那样,从上到下就是所有代码。

所以第一步是进行简单的封装,避免重复代码。

封装后,逻辑就清晰多了。

分为几大步骤:初始化画板、画脸的轮廓、画头发、画眼睛、画嘴、画脸颊。

wait 是 turtle 库需要的,否则程序一闪就关了。

五、优化:算法推导

毕导背景图的代码,很长的一段代码都是在画头发。

如下图,毕导的实现方式先画四个一模一样的大弧形,再化两个微调后的弧形来形成封闭曲线。
最后 5 根直线也都是人工微调出来的。

简单的理解,所有参数都是微调出来的,不具备复用性。

复用性的含义就是,假设我们想画一个更大的水饺,就很难做到。

针对这个,我做了两个优化。

第一: 6 个大弧形与 5 个小弧形全部在循环内,大小保持一致。

第二:5 个直线的坐标聪哥小弧形自动推导出来,而不是微调出坐标与方向。

自动推导的原理如上图,小弧形与上部轮廓线都是半圆,两个圆心画个直线,两个交点画出的直线就比较好看。

不过这个自动推导就涉及到大量的几何算法了。

六、优化:面向对象

回到复用性的话题:怎么才能画出任意大小的水饺呢?
想画出水饺怎么办?

这时候就需要面向对象编程了。

把画水饺的行为封装一个对象。
任意大小代表这需要传入一个大小因子。
画多个水饺,代表水饺的中心不再是坐标原点,而是传入的坐标。

于是我就简单封装了一下,代码如下:

就这样,我画出了更大的水饺,更多的水饺。

七、最后

画完水饺,我发现还可以画很多东西。
比如圣诞老人,玫瑰花等等,主要看我们的想象力。

你想画什么呢?

代码已经上传到后台了。
你可以关注公众号,对话框中回复“圣诞节水饺”获取源码。
之后你可以自己改一改,画出自己想画的图片。

对了,我还会做一期视频来讲解这个过程,视频可以看到动画,效果更好。

感兴趣的可以关注我的 B 站,这两天在团建,晚点我会做出这个视频来。

我的 B 站地址:https://space.bilibili.com/30571241

《完》

-EOF-

本文公众号:天空的代码世界 个人微信号:tiankonguse

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越