page contents

手把手教你用Python画小猪佩奇

我们先来看一下小猪佩奇的样子,如下图所示。 观察这个图像可以发现,小猪佩奇基本是由各种曲线构成的。 她的鼻子是个椭圆,头是几条弧线连接而成,耳朵也是由几条弧线构成的,眼睛是大圆套...

我们先来看一下小猪佩奇的样子,如下图所示。

attachments-2019-12-eefHDGxb5e03015c31fba.png

观察这个图像可以发现,小猪佩奇基本是由各种曲线构成的。

她的鼻子是个椭圆,头是几条弧线连接而成,耳朵也是由几条弧线构成的,眼睛是大圆套小圆,腮是一个实心圆,嘴巴就是一条弧线。然后是身体,左边和右边两条曲线,下面是一条直线。

胳膊可以通过直线表示,手指用曲线表示。我们还可以用两条竖线表示左腿和右腿,用两条横线表示脚。最后用3条弧线画出带卷的小尾巴。

我们使用自定义函数,按照小猪佩奇的部位来定义各个绘制函数:nose(鼻子)、head(头)、ears(耳朵)、eyes(眼睛)、cheek(腮)、mouth(嘴巴)、body(身体)、hands(手)、foot(脚)和tail(尾巴)。

函数的名字就表明了该函数负责绘制的身体部位。


第1步:绘制弧线和椭圆

小猪佩奇很多部位都是用弧线画出来的。

circle()函数有3个参数,分别是radius(半径)、extent(弧度)和steps(做半径为radius的圆的内切正多边形),其中后面两个参数是可选的。

我们用circle()函数画圆,要么只给这个函数传递一个参数,要么在传递第2个参数的时候将其设置为360。如果用circle()函数画弧线,那就要为第2个参数指定相应的弧度。

我们通过一个简单的示例,来看看如何画弧线。

import turtleturtle.pencolor("red")turtle.setheading(-80) turtle.circle(100,120)

执行结果如下所示,在窗口中画出了一个条红色弧线:

attachments-2019-12-bbNCIjx15e03018f1fc40.png

因为turtle中并没有直接画椭圆的函数,所以我们要换一个思路。

如果我们想利用一个正多边形来模拟圆的话,当边足够多的时候,就可以模拟出一个非常接近的圆。例如,正120边形,看上去就很接近圆了。

我们来试着做一做:

import turtle turtle.pendown()for j in range(120):     # 重复执行120次turtle.forward(5)     # 移动5个像素    turtle.left(3)            # 左转3度turtle.penup()

我们执行一个循环120次,每次循环中移动5个像素,然后左转3度。这样完成循环后,正好左转了360度,回到了最初的位置。

执行过程中,在窗口中,我们会看到光标从初始位置出发,按逆时针方向画出了一个近似的圆。

attachments-2019-12-fiKw1k8k5e0301b3bbf61.png

如果修改forward()中的参数,还可以画出不同半径的圆。这样就给了我们更大的自由度。

在角度范围内,通过修改forward()中的参数来影响画弧的速度。我们还是画120个弧线,但是这次通过if-else条件语句,在前30步让画弧的速度由慢到快,接下来的30步速度由快到慢,此后的30步让画弧的速度再次由慢到快,最后的30步速度又由快到慢,这样不匀速的画法,就可以形成一个椭圆。

我们来试着做一做:

import turtle turtle.pendown()segment=1for i in range(120):if 0<=i<30 or 60<=i<90:        segment= segment+0.2        turtle.left(3)         turtle.forward(segment) else:         segment= segment-0.2        turtle.left(3)        turtle.forward(segment)

运行这段代码,可以看到turtle画出了一个椭圆:

attachments-2019-12-5Mk7eZiM5e0301c6269f9.png


第2步:导入turtle模块

从这里开始,我们要介绍如何绘制小猪佩奇,要使用海龟绘图,需要先导入turtle模块。

from turtle import *

这样就可以导入turtle模块中所有的方法和变量,然后就可以直接调用方法了,而不需要再添加“turtle.”前缀。


第3步:设置画布和画笔

首先,我们定义一个setting()函数,用它来设置画布和画笔。setting()函数的代码如下所示。

def setting():    setup(800,500)    pensize(4)    hideturtle()    colormode(255)    speed(10)

setting()函数主要做一些绘制前的设置和准备工作。

它先将画布设置为800像素宽和500像素高的大小,然后设置画笔的大小为4,隐藏小海龟图标。调用colormode(255)设置RGB色彩值范围为0~255,调用speed(10) 将画笔速度设置为10。


第4步:nose()函数

接下来,我们先定义绘制鼻子的函数,该函数的代码如下所示。

def nose():     penup()goto(-100,100)     setheading(-30)    color((255,155,192),"pink") #画笔色是浅粉,填充色是粉色    pendown()     begin_fill()#绘制一个椭圆作为鼻子的轮廓    segment=0.4for i in range(120):if 0<=i<30 or 60<=i<90:            segment= segment+0.08   #加速            left(3)                                 #向左转3度            forward(segment)              #画直线else:            segment= segment-0.08   #减速            left(3)                                 #向左转3度            forward(segment)              #画直线    end_fill()#左鼻孔    penup()    setheading(90)    forward(25)    setheading(0)    forward(10)    color((255,155,192),(160,82,45)) #画笔色是浅粉,填充色是黄土赭色        pendown()    begin_fill()    circle(5)     end_fill()#右鼻孔    penup()    setheading(0)    forward(20)    pendown()    begin_fill()    circle(5)    end_fill()

首先调用penup()函数拿起画笔,避免在画布上留下痕迹。

再调用goto()函数将画笔定位到指定坐标,调用setheading()设置画笔启动时运动的方向。

然后调用color()函数,将画笔的颜色设置为浅粉色,将填充的颜色也设置为粉色,这是佩奇的标志性的颜色。

然后调用pendown()函数,落下画笔,现在画笔的任何移动都会留下轨迹。接下来,我们绘制了一个椭圆,这样鼻子的轮廓就绘制完成了。

下面我们来绘制佩奇的鼻孔。

还是拿起画笔,将画笔定位到指定坐标,设置启动时运动的方向,指定画笔颜色和填充颜色,落下画笔,然后画一个圆。

这样就画好了左鼻孔,右鼻孔的代码也类似,这里就不再赘述。调用这个函数,看一下绘制效果。

attachments-2019-12-4kwTgM3E5e0301e3409fe.png


第5步:head()函数

接下来我们定义head()函数,它用来绘制头部。

head()函数的代码如下所示。

def head():     penup()goto(-69,167)    pendown()    color((255,155,192),"pink")     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)    segment=0.4for i in range(60):if 0<=i<30 or 60<=i<90:            segment= segment+0.08            left(3)             forward(segment) else:            segment= segment-0.08            left(3)            forward(segment)    end_fill()

拿起画笔,将画笔定位到指定坐标,落下画笔。

指定画笔颜色和填充颜色,调用begin_fill()函数开始填充。设置启动时运动的方向,然后通过绘制几条弧线把头绘制出来。

接下来,又重新拿起画笔,将画笔定位到(−100,100),这是画鼻子时的位置。然后勾画出右半个鼻子的轮廓,也就是半个椭圆,这样做是为了避免填充头的时候把鼻子覆盖掉。最后调用end_fill()函数结束填充。

调用这个函数,看一下其绘制效果。

attachments-2019-12-NrTHnoMi5e0301fa271a4.png


第6步:ears()函数

接下来我们定义ears()函数,用来绘制耳朵。

ears()函数的代码如下所示。

def ears():     color((255,155,192),"pink")#左耳朵    penup()goto(0,160)    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()

代码和前面类似,这里不再赘述。

调用这个ears()函数,看一下其绘制效果。

attachments-2019-12-fBU5r08H5e03020ea43d3.png


第7步:eyes()函数

接下来我们定义eyes()函数,用来绘制眼睛。

eyes()函数的代码如下所示。

def eyes(): #左眼眶        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()    setheading(90)    forward(-25)    setheading(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()

调用这个函数,看看绘制效果。

attachments-2019-12-qk0k9xjE5e030222a0b69.png


第8步:cheek()函数

接下来,我们定义cheek()函数,它绘制一个红色的圆,用来表示腮红。

cheek()函数代码如下所示。

def cheek():     penup()goto(80,10)    setheading(0)    color((255,155,192))    pendown()     begin_fill()    circle(30)    end_fill()

调用这个函数,看一下其绘制效果。

attachments-2019-12-jhiJip6z5e03023528e62.png


第9步:mouth()函数

接下来我们定义mouth()函数,就是绘制一个红色弧线,用来表示嘴巴。

mouth函数的代码如下所示。

def mouth():     penup()goto(-20,30)    color(239,69,19)    pendown()    setheading(-80)    circle(35,120)

调用这个函数,看一下绘制效果。

attachments-2019-12-c7w16Bgz5e030247e7dda.png


第10步:body()函数

接下来,我们定义body()函数,用来绘制身体。

body()函数的代码如下所示。

def body():     color("red",(255,99,71))#身体左边的曲线    penup()goto(-32,-8)    pendown()    begin_fill()    setheading(-130)    circle(100,10)    circle(300,30)#身体底边    setheading(0)    forward(230)#身体右边的曲线    setheading(90)    circle(300,30)    circle(100,3)    color((255,155,192),(255,100,100))#把脸上的下巴颏画出来,避免填充时覆盖掉    setheading(-135)    circle(-80,63)    circle(-150,24)    end_fill()

调用这个函数,看一下绘制效果。

attachments-2019-12-VDWPqc965e03025c5ec29.png


第11步:hands()函数

接下来,我们定义hands()函数用来绘制手。

hands()函数的代码如下所示。

def hands():     color((255,155,192))# 左手的中间手指    penup()goto(-56,-45)    pendown()    setheading(-160)    circle(300,15)#通过一个弧形表示左手另外两根手指    penup()    setheading(90)    forward(15)    setheading(0)     pendown()    setheading(-10)    circle(-20,90)# 右手的中间手指    penup()    setheading(90)    forward(30)    setheading(0)    forward(237)    pendown()    setheading(-20)    circle(-300,15)#通过一个弧形表示另外两根手指    penup()    setheading(90)    forward(20)    setheading(0)    pendown()    setheading(-170)    circle(20,90)

调用这个函数,看看绘制效果。

attachments-2019-12-DnIoGPaz5e03026eb142a.png


第12步:feet()函数

接下来,我们定义feet()函数,用来绘制脚。

feet()函数的代码如下所示。

def feet(): #左腿    pensize(10)    color((240,128,128))    penup()goto(2,-177)    pendown()    setheading(-90)    forward(40)    setheading(-180)#左脚    color("black")    pensize(15)    forward(20)#右腿    pensize(10)    color((240,128,128))    penup()    setheading(90)    forward(40)    setheading(0)    forward(90)    pendown()    setheading(-90)    forward(40)    setheading(-180)#右脚    color("black")    pensize(15)    forward(20)

为了简单起见,我们就用直线来表示腿和脚。

调用这个函数,看一下绘制效果。

attachments-2019-12-8Iz8sjNR5e03028088a85.png


第13步:tail()函数

这里定义了tail()函数,用来绘制尾巴。

tail()函数的代码如下所示。

def tail():     pensize(4)    color((255,155,192))    penup()goto(148,-155)    pendown()    setheading(0)#打卷的尾巴    circle(70,20)    circle(10,330)    circle(70,30)

调用这个函数,来看一下效果。

attachments-2019-12-xXTD94hF5e030291b5990.png

到这里,我们的小猪佩奇就绘制完成了,看上去是不是和原版很像呢?

attachments-2019-12-JpoBaHa75e03029eeda93.png

  • 发表于 2019-12-25 14:33
  • 阅读 ( 726 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章