程序员骚操作,用 Python 20 秒画完小猪佩奇“社会人”!

2018 年 6 月 13 日 开源中国


每天写代码的程序员,你们知道今年社交平台上最火的带货女王是谁吗?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇。


如果你经常用抖音、快手、B 站、知乎、微博……或者类似的任何一个内容或社交平台,那你很大概率能答出这道题:



答案是:掌声送给社会人。


随着口号喊响,社会人小猪佩奇似乎一夜之间就在短视频平台和社交网络上爆火了,同时网络上遍布了小猪佩奇九步画法。于是我在儿童节这一天画了一下,结果,不忍直视......



我画的o(╯□╰)o



人家的画


观察这个图像可以发现,小猪佩奇在构图基本是各种曲线,类抛物线、类圆、类椭圆、类二次贝塞尔曲线。这里说的都是“类”,这也正是小猪佩奇的构图精髓,一种手绘风格,而不是标准刻板的线条。在前端技术选型上,画图首先想到的是 SVG、Canvas,但它们本身就擅长画图,而且网上都有在线编辑 SVG 的工具,这就没意思了,我想佩奇也不会答应的。于是我想用纯粹的 Python 来做,这样更有挑战,因为画图画曲线不是 Python 擅长的事情。


基本思路如下:


选好画板大小,设置好画笔颜色、粗细,定位好位置,依次画鼻子、头、耳朵、眼睛、腮、嘴、身体、手脚、尾巴,完事儿。


都知道,Turtle 是 Python 内置的一个比较有趣味的模块,俗称“海龟绘图”,它是基于 Tkinter 模块打造,提供一些简单的绘图工具。


在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片。使用海龟作图,我们不仅能够只用几行代码就创建出令人印象深刻的视觉效果,而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑。


所以,海龟作图也常被用作新手学习 Python 的一种方式。更丰富详细的功能及知识可以参考官方文档:


https://docs.python.org/3/library/turtle.html


了解了 Tuttle 的用法之后就可以开始实战了。先来看看效果视频:




详细代码如下:

from turtle import*
def nose(x,y):#鼻子
   penup()#提起笔
   goto(x,y)#定位
   pendown()#落笔,开始画
   setheading(-30)#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南)
   begin_fill()#准备开始填充图形
   a=0.4
   for i in range(120):
       if 0<=i<30 or 60<=i<90:
           a=a+0.08
           left(3#向左转3度
           forward(a) #向前走a的步长
       else:
           a=a-0.08
           left(3)
           forward(a)
   end_fill()#填充完成
   penup()
   setheading(90)
   forward(25)
   setheading(0)
   forward(10)
   pendown()
   pencolor(255,155,192)#画笔颜色
   setheading(10)
   begin_fill()
   circle(5)
   color(160,82,45)#返回或设置pencolor和fillcolor
   end_fill()
   penup()
   setheading(0)
   forward(20)
   pendown()
   pencolor(255,155,192)
   setheading(10)
   begin_fill()
   circle(5)
   color(160,82,45)
   end_fill()
def head(x,y):#头
   color((255,155,192),"pink")
   penup()
   goto(x,y)
   setheading(0)
   pendown()
   begin_fill()
   setheading(180)
   circle(300,-30)
   circle(100,-60)
   circle(80,-100)
   circle(150,-20)
   circle(60,-95)
   setheading(161)
   circle(-300,15)
   penup()
   goto(-100,100)
   pendown()
   setheading(-30)
   a=0.4
   for i in range(60):
       if 0<=i<30 or 60<=i<90:
           a=a+0.08
           lt(3#向左转3度
           fd(a) #向前走a的步长
       else:
           a=a-0.08
           lt(3)
           fd(a)
   end_fill()
def ears(x,y): #耳朵
   color((255,155,192),"pink")
   penup()
   goto(x,y)
   pendown()
   begin_fill()
   setheading(100)
   circle(-50,50)
   circle(-10,120)
   circle(-50,54)
   end_fill()
   penup()
   setheading(90)
   forward(-12)
   setheading(0)
   forward(30)
   pendown()
   begin_fill()
   setheading(100)
   circle(-50,50)
   circle(-10,120)
   circle(-50,56)
   end_fill()
def eyes(x,y):#眼睛
   color((255,155,192),"white")
   penup()
   setheading(90)
   forward(-20)
   setheading(0)
   forward(-95)
   pendown()
   begin_fill()
   circle(15)
   end_fill()
   color("black")
   penup()
   setheading(90)
   forward(12)
   setheading(0)
   forward(-3)
   pendown()
   begin_fill()
   circle(3)
   end_fill()
   color((255,155,192),"white")
   penup()
   seth(90)
   forward(-25)
   seth(0)
   forward(40)
   pendown()
   begin_fill()
   circle(15)
   end_fill()
   color("black")
   penup()
   setheading(90)
   forward(12)
   setheading(0)
   forward(-3)
   pendown()
   begin_fill()
   circle(3)
   end_fill()
def cheek(x,y):#腮
   color((255,155,192))
   penup()
   goto(x,y)
   pendown()
   setheading(0)
   begin_fill()
   circle(30)
   end_fill()
def mouth(x,y): #嘴
   color(239,69,19)
   penup()
   goto(x,y)
   pendown()
   setheading(-80)
   circle(30,40)
   circle(40,80)
def setting():          #参数设置
   pensize(4)
   hideturtle()        #使乌龟无形(隐藏)
   colormode(255)      #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
   color((255,155,192),"pink")
   setup(840,500)
   speed(10)
def main():
   setting()           #画布、画笔设置
   nose(-100,100)      #鼻子
   head(-69,167)       #头
   ears(0,160)         #耳朵
   eyes(0,140)         #眼睛
   cheek(80,10)        #腮
   mouth(-20,30)       #嘴
   done()
if __name__ == '__main__':
   main()


转自:恋习Python

作者:丁彦军

文章属作者原创,转载请联系授权



推荐阅读

Linus 又开怼:有时候标准就是一坨屎!

从 Java 到 Kotlin,再从 Kotlin 回归 Java

“王者对战”之 MySQL 8 vs PostgreSQL 10

传微软将全资收购 GitHub,价格达 50 亿美元或更高

C++ 协程的近况、设计与实现中的细节和决策

点击“阅读原文”查看更多精彩内容

登录查看更多
14

相关内容

国内分享经济住宿平台,已连接301个城市超过10万套优质房源和500万活跃用户。小猪倡导居住自由,让用户在出行中发现住宿之美,体验人情之暖,感受分享之乐。 小猪-短租民宿预订首选,独一无二的社交住宿体验
专知会员服务
53+阅读 · 2020年7月4日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
189+阅读 · 2020年6月29日
【实用书】Python数据科学从零开始,330页pdf
专知会员服务
139+阅读 · 2020年5月19日
Python导论,476页pdf,现代Python计算
专知会员服务
252+阅读 · 2020年5月17日
【干货书】数值计算C编程,319页pdf,Numerical C
专知会员服务
66+阅读 · 2020年4月7日
英伟达又现神操作,程序员也能成画家!
大数据技术
7+阅读 · 2019年4月24日
已删除
架构文摘
3+阅读 · 2019年4月17日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
已删除
将门创投
18+阅读 · 2019年2月18日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
python pandas 数据处理
Python技术博文
3+阅读 · 2017年8月30日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
Arxiv
3+阅读 · 2019年9月5日
VIP会员
相关VIP内容
专知会员服务
53+阅读 · 2020年7月4日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
189+阅读 · 2020年6月29日
【实用书】Python数据科学从零开始,330页pdf
专知会员服务
139+阅读 · 2020年5月19日
Python导论,476页pdf,现代Python计算
专知会员服务
252+阅读 · 2020年5月17日
【干货书】数值计算C编程,319页pdf,Numerical C
专知会员服务
66+阅读 · 2020年4月7日
相关资讯
英伟达又现神操作,程序员也能成画家!
大数据技术
7+阅读 · 2019年4月24日
已删除
架构文摘
3+阅读 · 2019年4月17日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
已删除
将门创投
18+阅读 · 2019年2月18日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
python pandas 数据处理
Python技术博文
3+阅读 · 2017年8月30日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
Top
微信扫码咨询专知VIP会员