社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 20秒画完小猪佩奇“社会人”

Python中文社区 • 6 年前 • 1040 次点击  

Python中文社区
全球Python中文开发者的
精神部落


今年社交平台上最火的带货女王是谁?范冰冰?杨幂?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模块实现基本的圆,椭圆,曲线等,难点在于,如何定位每个部位的位置(建议先草图画画)。完整代码需要300行,为了限于篇幅,只放了一部分代码,需要完整源码的盆友,可在公众号底部回复社会人可获得。


赞赏作者


作者:菜鸟分析,一个痴恋于Python语言的程序猿  

知乎专栏|恋习Python:

https://zhuanlan.zhihu.com/p/35667053


最近热门文章

用Python分析苹果公司股价数据

Nginx+uwsgi部署Django应用

用文本挖掘剖析近5万首《全唐诗》

Python自然语言处理分析倚天屠龙记

Python 3.6实现单博主微博文本、图片及热评爬取


Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。

▼ 点击下方阅读原文免费成为社区会员


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Gs1DLIDXfv
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/12919
 
1040 次点击