今天早上看到朋友圈被小猪佩奇刷屏了,然后中午看到推送有用代码实现小猪佩奇的绘制过程,但是代码不全,所以自己尝试着实现了一下。
大致分两步:
- 手绘小猪佩奇,然后算出几个关键点的坐标点
- 鼻子、头、耳朵、眼睛、腮、嘴、身体、手、脚、尾巴
绘图使用turtle库,下面简单讲解几个重要函数:
- setheading() 选择绘制方向(0-东、90-北、180-西、270-南)
- goto() 定位坐标
- penup() 提起笔
- pendown() 放下笔
- fd() 向前绘画
- color() 画笔颜色
- fillcolor() 填充颜色
- circle() 画圆
详细的功能及知识可以参考官方文档:https://docs.python.org/3/library/turtle.html。
详细代码如下:
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 += 0.08
left(3) # 向左转3度
fd(a) # 向前走a的步长
else:
a -= 0.08
left(3)
fd(a)
end_fill() # 填充完成
penup()
goto(-90,125)
pendown()
color(255,155,192) # 画笔颜色
setheading(10)
begin_fill()
circle(5)
color(160,82,45)
end_fill()
penup()
setheading(0)
goto(-70,125)
pendown()
color(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 += 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)
fd(-12)
setheading(0)
fd(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)
fd(-20)
setheading(0)
fd(-95)
pendown()
begin_fill()
circle(15)
end_fill()
color("black")
penup()
setheading(90)
fd(12)
setheading(0)
fd(-3)
pendown()
begin_fill()
circle(3)
end_fill()
color((255, 155, 192), "white")
penup()
setheading(90)
fd(-25)
setheading(0)
fd(40)
pendown()
begin_fill()
circle(15)
end_fill()
color("black")
penup()
setheading(90)
fd(12)
setheading(0)
fd(-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 body(x,y): # 身体
color("red", (255, 99, 71))
penup()
goto(x,y)
pendown()
begin_fill()
setheading(-130)
circle(100, 10)
circle(300, 30)
setheading(0)
fd(230)
setheading(90)
circle(300, 30)
circle(100, 3)
color((255, 155, 192), (255, 100, 100))
seth(-135)
circle(-80, 63)
circle(-150, 24)
end_fill()
def hands(x,y): # 手
color((255, 155, 192))
penup()
goto(x,y)
pendown()
setheading(-160)
circle(300, 15)
penup()
setheading(90)
fd(15)
setheading(0)
fd(0)
pendown()
setheading(-10)
circle(-20, 90)
penup()
setheading(90)
fd(30)
setheading(0)
fd(237)
pendown()
setheading(-20)
circle(-300, 15)
penup()
setheading(90)
fd(20)
setheading(0)
fd(0)
pendown()
setheading(-170)
circle(20, 90)
def foot(x,y): # 脚
pensize(10)
color((240, 128, 128))
penup()
goto(x,y)
pendown()
setheading(-90)
fd(40)
setheading(-180)
color("black")
pensize(15)
fd(20)
pensize(10)
color((240, 128, 128))
penup()
setheading(90)
fd(40)
setheading(0)
fd(90)
pendown()
setheading(-90)
fd(40)
setheading(-180)
color("black")
pensize(15)
fd(20)
def tail(x,y): # 尾巴
pensize(4)
color((255, 155, 192))
penup()
goto(x,y)
pendown()
setheading(0)
circle(70, 20)
circle(10, 330)
circle(70, 30)
def setting(): #参数设置
pensize(4)
hideturtle() #使乌龟无形(隐藏)
colormode(255) #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
color((255,155,192),"pink")
setup(840,500)
speed(20)
def main():
setting() # 画布、画笔设置
nose(-100,100) # 鼻子
head(-69,167) # 头
ears(6,157) # 耳朵
eyes(-15,110) # 眼睛
cheek(80,10) # 腮
mouth(-20,30) # 嘴
body(-30,-9) # 身体
hands(-54,-47) # 手
foot(3,-178) # 脚
tail(150,-136) # 尾巴
done()
if __name__ == '__main__':
main()
代码已上传至github,点击这里可直接查看。