您现在的位置是:首页 > 数码 > 

小朋友们,你试过用Python绘制小猪佩奇吗?来开始创作吧

2025-07-27 19:57:36
小朋友们,你试过用Python绘制小猪佩奇吗?来开始创作吧   在上一章中,我们用海龟绘图绘制了机器猫的卡通图像。在本章中,我们介绍如何用海龟绘图来绘制小朋友们喜欢的另一个卡通形象——小猪佩奇。   1 程序分析   我们先来看一下小猪佩奇的样子,如图1所示。      图1   观察这个图像可以发现,小猪佩奇基本是由各种曲线

小朋友们,你试过用Python绘制小猪佩奇吗?来开始创作吧

  在上一章中,我们用海龟绘图绘制了机器猫的卡通图像。在本章中,我们介绍如何用海龟绘图来绘制小朋友们喜欢的另一个卡通形象——小猪佩奇。

  1 程序分析

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

  

  图1

  观察这个图像可以发现,小猪佩奇基本是由各种曲线构成的。她的鼻子是个椭圆。头是几条弧线连接而成,耳朵也是由几条弧线构成的。眼睛是大圆套小圆。腮是一个实心圆。嘴巴就是一条弧线。然后就是身体,左边和右边两条曲线,下面是一条直线。胳膊可以通过直线表示,手指用曲线表示。我们还可以用两条竖线表示左腿和右腿,用两条横线表示脚。最后用条弧线画出带卷的小尾巴。

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

  2 绘制弧线和椭圆

  可以看到很多部位都是用弧线画出来的。我们在第12章介绍circle()函数时曾提到过,这个函数有个参数,分别是radius(半径)、extent(弧度)和steps(做半径为radius的圆的内切正多边形),其中后面两个参数是可选的。

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

  我们通过一个简单的示例,来看看如何画弧线,代码请参见ch14\1.py。

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

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

  

  图2

  因为turtle中并没有直接画椭圆的函数,所以我们要换一个思路。如果我们想利用一个正多边形来模拟圆的话,当边足够多的时候,就可以模拟出一个非常接近的圆。例如,正120边形,看上去就很接近圆了。我们来试着做一做,代码请参见ch14\2.py。

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

  我们执行一个循环120次,每次循环中移动5个像素,然后左转度。这样完成循环后,正好左转了60度,回到了最初的位置。执行过程中,在窗口中,我们会看到光标从初始位置出发,按逆时针方向画出了一个近似的圆,如图所示。

  

  图

  如果修改forward()中的参数,还可以画出不同半径的圆。这样就给了我们更大的自由度。在角度范围内,通过修改forward()中的参数来影响画弧的速度。我们还是画120个弧线,但是这次通过if-else条件语句,在前0步让画弧的速度由慢到快,接下来的0步速度由快到慢,此后的0步让画弧的速度再次由慢到快,最后的0步速度又由快到慢,这样不匀速的画法,就可以形成一个椭圆。我们来试着做一做,代码请参见ch14\.py。

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

  运行这段代码,可以看到turtle画出了一个椭圆,如图4所示。

  

  图4

   导入turtle模块

  从这里开始,我们要介绍如何绘制小猪佩奇,完整代码请参见ch14\4.py。

  还是和上一章中提到的情况相同,要使用海龟绘图,我们需要先导入turtle模块。我们还是采用第11章介绍的导入模块的第2种方法:

  from turtle import *

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

  4 绘制程序

  4.1 设置画布和画笔

  首先,我们定义一个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.2 nose()函数

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

  def nose(): penup() goto(-100,100) setheading(-0) color((255,155,192),pink) #画笔是浅粉,填充是粉 pendown() begin_fill() #绘制一个椭圆作为鼻子的轮廓 segment=0.4 for i in range(120): if 0<=i<0 or 60<=i<90: segment=segment0.08 #加速 left() #向左转度 forward(segment) #画直线 else: segment=segment-0.08 #减速 left() #向左转度 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()函数,落下画笔,现在画笔的任何移动都会留下轨迹。接下来,我们绘制了一个椭圆,绘制方法在2节已经介绍过,这里不再详述。这样鼻子的轮廓就绘制完成了。

  下面我们来绘制佩奇的鼻孔。还是拿起画笔,将画笔定位到指定坐标,设置启动时运动的方向,指定画笔颜和填充颜,落下画笔。然后画一个圆。这样就画好了左鼻孔,右鼻孔的代码也类似,这里就不再赘述。调用这个函数,看一下绘制效果,如图5所示。

  

  图5

  4. head()函数

  接下来我们定义head()函数,它用来绘制头部。head()函数的代码如下所示。

  def head(): penup() goto(-69,167) pendown() color((255,155,192),pink) begin_fill() setheading(180) circle(00,-0) circle(100,-60) circle(80,-100) circle(150,-20) circle(60,-95) setheading(161) circle(-00,15) #勾画出右半个鼻子的轮廓,避免填充时覆盖掉 penup() goto(-100,100) pendown() setheading(-0) segment=0.4 for i in range(60): if 0<=i<0 or 60<=i<90: segment=segment0.08 left() forward(segment) else: segment=segment-0.08 left() forward(segment) end_fill()

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

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

  调用这个函数,看一下其绘制效果,如图6所示。

  

  图6

  4.4 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(0) pendown() begin_fill() setheading(100) circle(-50,50) circle(-10,120) circle(-50,56) end_fill()

  代码和前面类似,这里不再赘述。调用这个ears()函数,看一下其绘制效果,如图7所示。

  

  图7

  4.5 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(-) pendown() begin_fill() circle() 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(-) pendown() begin_fill() circle() end_fill()

  调用这个函数,看看古董绘制效果,如图8所示。

  

  图8

  4.6 cheek()函数

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

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

  调用这个函数,看一下其绘制效果,如图9所示。

  

  图9

  4.7 mouth()函数

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

  def mouth(): penup() goto(-20,0) color(29,69,19) pendown() setheading(-80) circle(5,120)

  调用这个函数,看一下绘制效果,如图10所示。

  

  图10

  4.8 body()函数

  接下来,我们定义body()函数,用来绘制身体。body()函数的代码如下所示。

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

  调用这个函数,看一下绘制效果,如图11所示。

  

  图11

  4.9 hands()函数

  接下来,我们定义hands()函数用来绘制手。hands()函数的代码如下所示。

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

  调用这个函数,看看绘制效果,如图12所示。

  

  图12

  4.10 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)

  为了简单起见,我们就用直线来表示腿和脚,调用这个函数,看一下绘制效果,如图1所示。

  

  图1

  4.11 tail()函数

  这里定义了tail()函数,用来绘制尾巴。tail()函数的代码如下所示。

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

  调用这个函数,来看一下效果,如图14所示。

  

  图14

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

  5 小结

  在本章中,我们使用海龟绘图绘制了一个小猪佩奇的形象,进一步加深读者对海龟绘图的了解和掌握。读者也可以尝试使用海龟绘图绘制自己喜欢的其他图案。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/856971.html

相关标签:无
上传时间: 2024-02-10 04:17:32
留言与评论(共有 16 条评论)
本站网友 杜蕾丝是什么
27分钟前 发表
在角度范围内,通过修改forward()中的参数来影响画弧的速度
本站网友 松原电影院
5分钟前 发表
  def cheek()
本站网友 诚如神之所说
28分钟前 发表
这样就给了我们更大的自由度
本站网友 脊髓损伤
3分钟前 发表
mouth(嘴巴)
本站网友 爱k线
23分钟前 发表
128
本站网友 诚信企业
20分钟前 发表
函数的名字就表明了该函数负责绘制的身体部位
本站网友 瑞蓝2号玻尿酸
19分钟前 发表
然后设置画笔的大小为4,隐藏小海龟图标
本站网友 成骨不全
4分钟前 发表
  4.2 nose()函数   接下来,我们先定义绘制鼻子的函数,该函数的代码如下所示
本站网友 李沧租房网
8分钟前 发表
-20) circle(60
本站网友 费洛蒙是什么
27分钟前 发表
  def feet()
本站网友 金地国际花园
22分钟前 发表
  我们通过一个简单的示例,来看看如何画弧线,代码请参见ch14\1.py
本站网友 segougou
18分钟前 发表
pink) #左耳朵 penup() goto(0
本站网友 唐妮
1分钟前 发表
在角度范围内,通过修改forward()中的参数来影响画弧的速度
本站网友 源码是什么
28分钟前 发表
segment=segment-0.08 left() forward(segment) end_fill()   拿起画笔,将画笔定位到指定坐标,落下画笔
本站网友 胆结石是怎么形成的
27分钟前 发表
  def head()