• turtle 20秒画完小猪佩奇“社会人”


    转载:https://blog.csdn.net/csdnsevenn/article/details/80650456

    640?wx_fmt=jpeg

    图片源自网络

    作者

    丁彦军

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

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

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

    640?wx_fmt=jpeg

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

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

    640?wx_fmt=jpeg

    我画的,哈哈

    640?wx_fmt=jpeg人家的画

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

  • 相关阅读:
    Spark数据读取
    05、TypeScript 中的泛型
    04、TypeScript 中的接口
    03、TypeScript 中的类
    02、TypeScript 中的函数
    01、TypeScript 数据类型
    Vue-router 知识点
    什么是跨域?如何解决跨域问题
    工作中积累的问题、知识点总结100题(0-20)
    封装一个 Promise 对象。了解其原理
  • 原文地址:https://www.cnblogs.com/xudj/p/10291273.html
Copyright © 2020-2023  润新知