网上有好多turtle画图的代码,印象里,至少见过小猪佩奇、多啦A梦等好多个卡通作画源码。由于平时也画过简单的表情、图形啊什么人,就有点飘,想要画一个小时候的卡通人物。想都没多想,就决定来个葫芦娃,毕竟搜了一下,看网上没有源码,适合原创。
于是开始了一个很鸡肋的过程,我发现,这项工程的核心就是画曲线。忽然回想网上流传较多的代码,大部分都是圆啊、线啊这些标准图形,果然还是那些作者们比较鸡贼。
说实话,我也忽然意识到了,这种turtle作图意义不大。但是,自己已经花时间开始了,好歹画完头部吧。就当是一个简笔画的演示?
接下来还是展示这个无聊的过程,就当是致敬经典动画吧。毕竟大朋友小朋友要过节了嘛。
相信你们也发现了,很多细节都没有处理,比如眼睫毛没有加,比如很多该对齐的地方没有对齐。但是,我真的没有耐心再去一点一点修正了哈,我承认,我本来只是想写篇文章来安利一波turtle库的……
接下来,说点有用的吧,毕竟真为了画画,人家各种手绘人员随便一个手写板或者一个PS软件就能分分钟画出栩栩如生的效果。咱们还是来研究下代码吧。
这类绘图,如果真的用程序,就是就是不断的在画曲线。那么问题来了,怎么用计算机画曲线?于是这可能才是本文的重点:
用turtle画曲线的思维
如果是单纯的画圆弧,这个就用circle方法就可以。
如:t.circle(80,30)
画出来的就是一个以起点为圆心,80为半径,30度的一个圆弧。
我们圆弧连接圆弧,确实可以实现这种曲线作图。但是固定的东西,其实有利有弊,弊端在于不够灵活。我们在控制弯的角度的时候,其实是要在中间调整圆心或半径的,并非一次就能画好。
所以就有了另一种更接近画圆本质的画法:
我们用短线加转角的形式,来构造曲线,用角度和短线的步长,来控制曲线的弯曲程度,这个只要控制好这个曲线最初的角度就好。
写成函数,大概如下:
n是短折线的个数,angle是每次转角,step是步长。
注意angle的正负可以控制曲线弯的朝向。
def cir(n,angle,step): s=0.6 for i in range(n): s=s+step t.lt(angle) t.fd(s)
比如网上流传的佩奇画法代码中就有:
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)
其实电脑画圆,本质上也是以上原理。
这样就可以画曲线了,当然起笔之前,要找一个合适的起始角度。
用到的turtle的知识点:
t.seth(90):等同于t.sethead(90)设置起始角度
t.penup():提起画笔
t.pendown():落笔
t.goto(-35,70):换地方画的起点
贴一下代码吧,就重复的画曲线,画曲线。
import turtle as t t.pensize(3)def cir(n,angle,step): s=0.6 for i in range(n): s=s+step t.lt(angle) t.fd(s) #头部轮廓开始t.circle(80,30)t.seth(0)cir(60,2,0.04) t.seth(90)t.circle(90,40)t.seth(120)t.begin_fill()t.fillcolor("black")cir(60,1.8,0.08)cir(60,1.4,0.05)cir(40,1.4,0.04)t.hideturtle() t.seth(120) t.fd(100)t.seth(60) cir(60,-0.8,0.065)t.end_fill()#头部轮廓结束 t.penup()t.goto(30,40)t.pendown()t.seth(20)t.circle(30,25) t.penup()t.goto(0,60)t.pendown()t.begin_fill()t.fillcolor("red")t.seth(10)t.circle(50,50) t.penup()t.goto(5,60)t.pendown()t.seth(-60)t.circle(15,180) t.end_fill()t.penup()t.goto(10,80)t.pendown()t.seth(45)cir(10,1.8,0.1)t.seth(135)cir(10,-3,0.2)t.penup()#左眼t.goto(-35,70)t.pendown()t.seth(40)cir(30,-0.6,0.03)t.seth(110)cir(20,3,0.03)t.seth(210)cir(30,0.1,0.03)t.seth(-45)cir(20,0.6,0.03)t.penup()t.goto(-30,78)t.pendown()t.begin_fill()t.fillcolor("black")t.circle(6.2,360)t.end_fill()t.pensize(5)t.penup()t.goto(-35,110)t.pendown()t.seth(50)cir(20,-3,0.03)t.penup()t.goto(16,130)t.pendown()t.seth(90)cir(20,-3,0.03)t.pensize(3)t.penup()t.goto(20,110)t.pendown()t.seth(30)cir(30,0.6,0.03)t.seth(-70)cir(22,-0.8,0.03)t.seth(220)cir(30,-0.1,0.02)t.seth(120)cir(20,-2,0.04)t.penup()t.goto(42,110)t.pendown()t.begin_fill()t.fillcolor("black")t.circle(6.1,360)t.end_fill()t.penup()t.goto(-120,120)t.pendown()t.begin_fill()t.fillcolor("#0094ff")t.seth(170)cir(50,3,0.03)t.seth(110)cir(40,-1,0.04)t.end_fill()t.penup()t.goto(-130,120)t.pendown()t.begin_fill()t.fillcolor("#0094ff")t.seth(120)cir(43,5,0.04)t.seth(100)cir(30,-1.2,0.04)t.end_fill()t.penup()t.goto(-150,120)t.pendown()t.begin_fill()t.fillcolor("#0094ff")t.seth(135)t.fd(15)t.left(90)t.fd(5)t.left(90)t.fd(15)t.end_fill()#葫芦叶t.penup()t.goto(-120,65)t.pendown()t.begin_fill()t.fillcolor("green")t.seth(180)t.fd(15)t.left(30)t.fd(35)t.left(45)t.fd(20)t.left(90)t.fd(20)t.left(45)t.fd(35)t.left(45)t.fd(15)t.left(30)t.fd(10)t.end_fill()t.penup()t.goto(-120,60)t.seth(210)t.pendown()t.fd(40)t.penup()t.goto(-130,55)t.seth(240)t.pendown()t.fd(15)t.penup()t.goto(-130,55)t.seth(160)t.pendown()t.fd(15)t.penup()t.goto(-140,45)t.seth(240)t.pendown()t.fd(12)t.penup()t.goto(-140,45)t.seth(160)t.pendown()t.fd(12)t.pensize(1)t.penup()t.pencolor("black") t.fillcolor("#FFC9A3")t.goto(-65,32)t.pendown()t.begin_fill()t.seth(120)t.fd(30)t.seth(180)cir(20,2,0.03)t.seth(280)cir(35,2.3,0.03)t.end_fill()t.penup()t.pensize(3)t.goto(-87,45)t.pendown()t.fd(10)t.right(90)t.fd(10)t.penup()t.exitonclick()
画完效果大概就这个样子,各位可以优化改进。