48

20秒画完小猪佩奇“社会人”,程序猿的手法是你想不到的独特

 5 years ago
source link: http://www.10tiao.com/html/320/201806/2651004610/1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事


图片源自网络

作者

丁彦军

如需转载,请联系原作者授权。


今年社交平台上最火的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇。

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

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

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

我画的,哈哈

人家的画

观察这个图像可以发现,小猪佩奇在构图基本是各种曲线,类抛物线、类圆、类椭圆、类二次贝塞尔曲线。这里说的都是“类”,这也正是小猪佩奇的构图精髓,一种手绘风格,而不是标准刻板的线条。在前端技术选型上,画图首先想到的是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()


思路其实很简单,就是通过 Trutle 模块实现基本的圆、椭圆、曲线等,难点在于,如何定位每个部位的位置(建议先草图画画)。

本文为作者投稿,版权归作者所有。

- The End -


点击图片get往期内容



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK