一只程序媛呀 发表于 2021-9-25 13:59:17

我见过的Turtle天花板:居然还能画出邪术少女?我惊了「附源码」

导语

小孩子的童话故事!都喜欢的魔法少女来袭。
https://p6.toutiaoimg.com/large/pgc-image/e4960ba571c349ac8465d230a1ee3bc7
这种卡通动漫形象但是我那个时代小孩子最喜欢看的动漫之一,哈哈哈,袒露年事......
在学习中进步,在进步中学习——这款开源的turtle代码非常ok,分享给大家一起学习!
正文

这款turtle代码的话非常多!先上效果图吧~
https://p6.toutiaoimg.com/large/pgc-image/96a69f1cabe947b4bb53e3cc058ac0c4
附源码:
import turtle as teimport timeWriteStep = 15# 贝塞尔函数的取样次数Speed = 5Width = 600# 界面宽度Height = 500# 界面高度Xh = 0# 记录前一个贝塞尔函数的手柄Yh = 0def Bezier(p1, p2, t):# 一阶贝塞尔函数    return p1 * (1 - t) + p2 * tdef Bezier_2(x1, y1, x2, y2, x3, y3):# 二阶贝塞尔函数    te.goto(x1, y1)    te.pendown()    for t in range(0, WriteStep + 1):      x = Bezier(Bezier(x1, x2, t / WriteStep),                   Bezier(x2, x3, t / WriteStep), t / WriteStep)      y = Bezier(Bezier(y1, y2, t / WriteStep),                   Bezier(y2, y3, t / WriteStep), t / WriteStep)      te.goto(x, y)    te.penup()def Bezier_3(x1, y1, x2, y2, x3, y3, x4, y4):# 三阶贝塞尔函数    x1 = -Width / 2 + x1    y1 = Height / 2 - y1    x2 = -Width / 2 + x2    y2 = Height / 2 - y2    x3 = -Width / 2 + x3    y3 = Height / 2 - y3    x4 = -Width / 2 + x4    y4 = Height / 2 - y4# 坐标变换    te.goto(x1, y1)    te.pendown()    for t in range(0, WriteStep + 1):      x = Bezier(Bezier(Bezier(x1, x2, t / WriteStep), Bezier(x2, x3, t / WriteStep), t / WriteStep),                   Bezier(Bezier(x2, x3, t / WriteStep), Bezier(x3, x4, t / WriteStep), t / WriteStep), t / WriteStep)      y = Bezier(Bezier(Bezier(y1, y2, t / WriteStep), Bezier(y2, y3, t / WriteStep), t / WriteStep),                   Bezier(Bezier(y2, y3, t / WriteStep), Bezier(y3, y4, t / WriteStep), t / WriteStep), t / WriteStep)      te.goto(x, y)    te.penup()def Moveto(x, y):# 移动到svg坐标下(x,y)    te.penup()    te.goto(-Width / 2 + x, Height / 2 - y)def line(x1, y1, x2, y2):# 连接svg坐标下两点    te.penup()    te.goto(-Width / 2 + x1, Height / 2 - y1)    te.pendown()    te.goto(-Width / 2 + x2, Height / 2 - y2)    te.penup()def lineto(dx, dy):# 连接当前点和相对坐标(dx,dy)的点    te.pendown()    te.goto(te.xcor() + dx, te.ycor() - dy)    te.penup()def Lineto(x, y):# 连接当前点和svg坐标下(x,y)    te.pendown()    te.goto(-Width / 2 + x, Height / 2 - y)    te.penup()def Horizontal(x):# 做到svg坐标下横坐标为x的水平线    te.pendown()    te.setx(x - Width / 2)    te.penup()def horizontal(dx):# 做到相对横坐标为dx的水平线    te.seth(0)    te.pendown()    te.fd(dx)    te.penup()def vertical(dy):# 做到相对纵坐标为dy的垂直线    te.seth(-90)    te.pendown()    te.fd(dy)    te.penup()    te.seth(0)def polyline(x1, y1, x2, y2, x3, y3):# 做svg坐标下的折线    te.penup()    te.goto(-Width / 2 + x1, Height / 2 - y1)    te.pendown()    te.goto(-Width / 2 + x2, Height / 2 - y2)    te.goto(-Width / 2 + x3, Height / 2 - y3)    te.penup()def Curveto(x1, y1, x2, y2, x, y):# 三阶贝塞尔曲线到(x,y)    te.penup()    X_now = te.xcor() + Width / 2    Y_now = Height / 2 - te.ycor()    Bezier_3(X_now, Y_now, x1, y1, x2, y2, x, y)    global Xh    global Yh    Xh = x - x2    Yh = y - y2def curveto_r(x1, y1, x2, y2, x, y):# 三阶贝塞尔曲线到相对坐标(x,y)    te.penup()    X_now = te.xcor() + Width / 2    Y_now = Height / 2 - te.ycor()    Bezier_3(X_now, Y_now, X_now + x1, Y_now + y1,             X_now + x2, Y_now + y2, X_now + x, Y_now + y)    global Xh    global Yh    Xh = x - x2    Yh = y - y2def Smooth(x2, y2, x, y):# 平滑三阶贝塞尔曲线到(x,y)    global Xh    global Yh    te.penup()    X_now = te.xcor() + Width / 2    Y_now = Height / 2 - te.ycor()    Bezier_3(X_now, Y_now, X_now + Xh, Y_now + Yh, x2, y2, x, y)    Xh = x - x2    Yh = y - y2def smooth_r(x2, y2, x, y):# 平滑三阶贝塞尔曲线到相对坐标(x,y)    global Xh    global Yh    te.penup()    X_now = te.xcor() + Width / 2    Y_now = Height / 2 - te.ycor()    Bezier_3(X_now, Y_now, X_now + Xh, Y_now + Yh,             X_now + x2, Y_now + y2, X_now + x, Y_now + y)    Xh = x - x2    Yh = y - y2te.tracer(10)te.setup(Width, Height, 0, 0)te.pensize(1)te.speed(Speed)te.penup()# 图层_2time.sleep(20)te.color("black", "#F2F2F2")# 外套Moveto(61, 462)te.begin_fill()smooth_r(12, -41, 27, -58)curveto_r(-6, -36, 6, -118, 9, -132)curveto_r(-15, -27, -23, -51, -26, -74)curveto_r(4, -66, 38, -105, 65, -149)Horizontal(486)curveto_r(12, 24, 40, 99, 33, 114)curveto_r(39, 82, 55, 129, 39, 144)smooth_r(-31, 23, -39, 28)smooth_r(-12, 37, -12, 37)lineto(50, 92)Horizontal(445)smooth_r(-29, -38, -31, -46)smooth_r(78, -107, 72, -119)Smooth(355, 178, 340, 176)Smooth(272, 63, 264, 64)smooth_r(-29, 67, -27, 73)Curveto(99, 292, 174, 428, 173, 439)smooth_r(-8, 23, -8, 23)Lineto(61, 462)te.end_fill()Moveto(60.5, 461.5)# 阴影te.color("black", "#D3DFF0")te.begin_fill()curveto_r(0, 0, 17, -42, 27, -59)curveto_r(-6, -33, 6, -128, 10, -133)curveto_r(-15, -10, -27, -66, -27.285, -75)te.pencolor("#D3DFF0")curveto_r(12.285, 11, 82.963, 156, 82.963, 156)te.pencolor("black")smooth_r(12.322, 75, 19.322, 86)curveto_r(-1, 11, -8, 25, -8, 25)Horizontal(60.5)te.end_fill()Moveto(444.5, 464)te.begin_fill()curveto_r(0, 0, -29, -36, -31, -46)smooth_r(53.59, -82.337, 53.59, -82.337)te.pencolor("#D3DFF0")smooth_r(86.41, -47.663, 96.072, -54.85)Curveto(563.5, 297.5, 570.5, 299.5, 518.5, 334)te.pencolor("black")curveto_r(-2, 16, -12, 33, -12, 37)smooth_r(50, 92, 50, 93)Horizontal(444.5)te.end_fill()Moveto(195, 49)te.begin_fill()te.pencolor("#D3DFF0")polyline(195, 49, 175.5, 106.5, 202.522, 49)te.pencolor("black")Horizontal(195)te.pencolor("#D3DFF0")te.end_fill()Moveto(327.997, 49)te.begin_fill()te.pencolor("#D3DFF0")curveto_r(0, 0, 11.503, 121.087, 13.503, 128.087)curveto_r(11, 2, 54, 37, 54, 37)lineto(-40, -165.087)te.pencolor("black")Horizontal(327.997)te.pencolor("#D3DFF0")te.end_fill()te.pencolor("black")line(94.5, 397.5, 107.5, 373.5)# 皱纹line(122.5, 317.5, 95.875, 274.699)line(122.5, 341.5, 141.5, 402.5)line(141.5, 409.5, 153.5, 431.5)# line(328,47.712,344,175.977)line(340.023, 49, 360.5, 144)# line(353.5,47.5,395.5,208.5)line(478.5, 95.5, 518.5, 161.5)line(518.5, 332.5, 460.5, 359.5)polyline(506.5, 369.5, 493.5, 402.5, 502.5, 443.5)Moveto(530, 429)curveto_r(4, 16, -5, 33, -5, 33)# 图层_3te.color("black", "#2b1d2a")# 外套内侧Moveto(225, 462)te.begin_fill()Horizontal(165)smooth_r(9, -15, 8, -25)curveto_r(-47, -126, 6, -212, 12, -225)Curveto(185, 305, 202, 428, 225, 462)Lineto(225, 462)te.end_fill()Moveto(390, 462)te.begin_fill()curveto_r(10, -23, 34, -180, 35, -222)# !!!227curveto_r(7, 4, 54, 45, 61, 61)# 61smooth_r(-73, 101, -72, 118)curveto_r(5, 15, 31, 46, 31, 45)Lineto(390, 462)te.end_fill()# 图层_4te.color("black", "#2b1d29")# 外套内侧Moveto(225, 462)te.begin_fill()curveto_r(-28, -50, -40, -166, -40, -250)curveto_r(6, 51, -6, 87, 45, 106)smooth_r(64, 27, 89, 24)smooth_r(49, -18, 56, -20)smooth_r(50, -10, 51, -85)curveto_r(0, 29, -25, 201, -36, 225)Lineto(225, 462)te.end_fill()# 图层_5te.color("black", "#3D3D3D")# 衣服Moveto(225, 462)te.begin_fill()curveto_r(-5, -5, -22, -53, -23, -70)lineto(32, -13)curveto_r(3, -25, 6, -28, 12, -36)smooth_r(13, -12, 16, -12)vertical(-2)curveto_r(45, 20, 64, 14, 94, 1)vertical(2)curveto_r(8, -2, 15, 2, 17, 4)smooth_r(0, 6, -2, 9)curveto_r(10, 10, 10, 29, 11, 33)smooth_r(23, 4, 25, 6)smooth_r(-17, 83, -17, 78)Lineto(225, 462)te.end_fill()# 图层_6te.color("black", "#968281")# 脖子Moveto(262, 329)te.begin_fill()vertical(17)curveto_r(1, 2, 44, 14, 45, 15)smooth_r(3, 12, 3, 12)horizontal(3)vertical(-5)curveto_r(1, -3, 4, -6, 5, -7)lineto(36, -14)curveto_r(1, -1, 3, -16, 2, -17)Curveto(318, 348, 296, 344, 262, 329)te.end_fill()# 图层_8te.color("black", "#E7F1FF")# 白色褶皱Moveto(225, 462)te.begin_fill()lineto(-3, -5)# -3,-3,-3,-5curveto_r(0, -2, 4, -4, 5, -6)smooth_r(16, 3, 19, -8)smooth_r(0, -7, 0, -11)smooth_r(5, -8, 9, -5)smooth_r(19, -8, 19, -11)smooth_r(6, -7, 6, -7)smooth_r(7, -2, 9, -4)lineto(41, -2)lineto(12, 9)smooth_r(3, 15, 7, 18)smooth_r(15, 4, 17, 4)smooth_r(4, -4, 6, -4)smooth_r(6, 4, 5, 9)smooth_r(0, 9, 0, 9)smooth_r(1, 7, 7, 6)smooth_r(8, 0, 8, 0)lineto(-2, 8)Lineto(225, 462)te.end_fill()te.pensize(2)Moveto(240, 450)smooth_r(0, 9, 3, 12)Moveto(372, 462)curveto_r(-2, -4, -5, -29, -7, -28)te.pensize(1)# 图层_7te.color("black", "#A2B8D6")# 衣领Moveto(262, 331)te.begin_fill()curveto_r(0, 8, -1, 13, 0, 15)smooth_r(43, 14, 45, 15)lineto(3, 12)horizontal(3)smooth_r(-1, -3, 0, -5)lineto(5, -7)lineto(36, -14)curveto_r(1, -1, 2, -12, 2, -15)smooth_r(25, -2, 15, 13)curveto_r(-2, 4, -7, 29, -7, 32)smooth_r(-35, 19, -41, 22)smooth_r(-9, 14, -12, 14)smooth_r(-7, -12, -14, -15)curveto_r(-19, -2, -41, -25, -41, -25)smooth_r(-10, -26, -10, -30)Smooth(255, 332, 262, 331)te.end_fill()Moveto(262, 346)lineto(-12, -6)Moveto(369, 333)curveto_r(2, 4, -6, 10, -15, 14)# 图层_9te.color("black", "#151515")# 领结Moveto(247, 358)te.begin_fill()curveto_r(-5, 3, -8, 20, -6, 23)curveto_r(25, 21, 50, 17, 50, 17)lineto(-23, 64)horizontal(22)smooth_r(1, -13, 2, -16)lineto(13, -50)curveto_r(2, 2, 7, 3, 10, 1)smooth_r(18, 65, 18, 65)horizontal(19)lineto(-24, -65)curveto_r(21, 5, 39, -10, 44, -13)curveto_r(5, -20, 1, -21, 0, -24)curveto_r(-18, -2, -49, 15, -52, 17)smooth_r(-11, -3, -15, -1)Smooth(252, 356, 247, 358)te.end_fill()# 图层_10te.color("black", "#A2B8D6")# 衣领(透过领结)Moveto(297, 387)te.begin_fill()lineto(-11, 6)curveto_r(-1, 0, -20, -7, -30, -19)Curveto(259, 373, 297, 385, 297, 387)te.end_fill()Moveto(323, 384)te.begin_fill()lineto(8, 7)lineto(30, -14)curveto_r(1, -1, 5, -6, 4, -7)Smooth(329, 379, 323, 384)te.end_fill()# 图层_11te.color("black", "#F3EEEB")# 脸Moveto(185, 212)te.begin_fill()curveto_r(4, -9, 46, -77, 52, -75)curveto_r(-2, -17, 19, -68, 27, -73)curveto_r(16, 15, 71, 108, 76, 112)smooth_r(76, 53, 86, 60)curveto_r(0, 65, -27, 75, -31, 76)curveto_r(-50, 28, -70, 30, -85, 30)smooth_r(-77, -22, -86, -26)Curveto(180, 302, 186, 228, 185, 212)te.end_fill()# 图层_12te.color("black", "#2B1D29")# 头发Moveto(189, 202)te.begin_fill()curveto_r(-1, 22, 19, 51, 19, 51)smooth_r(-10, -42, 7, -92)Curveto(212, 168, 196, 189, 189, 202)te.end_fill()Moveto(221, 155)te.begin_fill()curveto_r(-2, 6, 5, 48, 5, 48)smooth_r(18, -28, 20, -48)curveto_r(-5, 24, 4, 43, 7, 50)curveto_r(-10, -49, 3, -72, 13, -106)curveto_r(-2, -7, -3, -32, -3, -35)curveto_r(-17, 18, -27, 71, -27, 71)Lineto(221, 155)te.end_fill()Moveto(264, 64)te.begin_fill()curveto_r(-4, 5, 14, 100, 14, 100)smooth_r(-6, -79, -5, -85)curveto_r(0, 98, 49, 139, 49, 139)smooth_r(8, -50, 3, -65)Smooth(272, 64, 264, 64)te.end_fill()Moveto(342, 176)te.begin_fill()curveto_r(-1, 27, -10, 57, -10, 57)smooth_r(20, -33, 17, -54)Lineto(342, 176)te.end_fill()te.penup()te.begin_fill()polyline(349, 180, 353, 203, 361, 203)polyline(361, 203, 362, 188, 349, 180)te.end_fill()# 图层_13te.pensize(2)Moveto(210, 180)# 眉毛curveto_r(5, -4, 63, 9, 63, 14)Moveto(338, 193)curveto_r(0, -3, 18, -6, 18, -6)te.pensize(1)# 图层_14te.color("black", "#D1D1D1")# 眼睛1te.pensize(2)Moveto(206, 212)te.begin_fill()lineto(15, -7)curveto_r(4, -1, 26, -2, 30, 0)smooth_r(10, 3, 12, 7)te.pencolor("#D1D1D1")te.pensize(1)smooth_r(2, 27, -1, 30)smooth_r(-39, 5, -44, 1)Smooth(206, 212, 206, 212)te.end_fill()Moveto(384, 204)te.begin_fill()te.pencolor("black")te.pensize(2)curveto_r(-3, -1, -18, -1, -28, 1)smooth_r(-9, 6, -10, 9)te.pencolor("#D1D1D1")te.pensize(1)smooth_r(3, 18, 6, 23)smooth_r(38, 6, 40, 4)smooth_r(10, -9, 13, -22)te.pencolor("black")te.pensize(2)Lineto(384, 204)te.end_fill()# 图层_15te.color("#0C1631", "#0C1631")# 眼睛2te.pensize(1)Moveto(216, 206)te.begin_fill()curveto_r(-1, 5, 0, 26, 7, 35)smooth_r(30, 2, 33, 0)smooth_r(5, -31, 2, -34)Smooth(219, 203, 216, 206)te.end_fill()Moveto(354, 207)te.begin_fill()curveto_r(-2, 1, 2, 29, 4, 31)smooth_r(30, 3, 33, 1)smooth_r(6, -24, 4, -27)lineto(-11, -8)Curveto(382, 204, 357, 206, 354, 207)te.end_fill()# 图层_17te.color("#F5F5F5", "#F5F5F5")# 眼睛3Moveto(253, 211)te.begin_fill()curveto_r(-3, 0, -8, 8, 1, 10)Smooth(258, 210, 253, 211)te.end_fill()Moveto(392, 209)te.begin_fill()lineto(4, 3)vertical(4)lineto(-4, 2)Curveto(386, 214, 392, 209, 392, 209)te.end_fill()# 图层_18te.color("#352F53", "#352F53")# 眼睛4Moveto(219, 229)te.begin_fill()smooth_r(2, -5, 6, -4)smooth_r(18, 13, 27, 1)curveto_r(3, 0, 5, 3, 5, 3)vertical(13)Horizontal(224)Lineto(219, 229)te.end_fill()Moveto(357, 227)te.begin_fill()smooth_r(4, -6, 10, -2)smooth_r(10, 13, 19, 1)curveto_r(6, 0, 8, 6, 8, 6)lineto(-2, 9)curveto_r(-12, 3, -29, 0, -32, -2)Smooth(357, 227, 357, 227)te.end_fill()# 图层_19te.color("#9A90CB", "#9A90CB")# 眼睛5Moveto(227, 231)te.begin_fill()curveto_r(-6, 0, -5, 5, -3, 8)smooth_r(24, 2, 27, 0)smooth_r(0, -8, -1, -8)Smooth(234, 231, 227, 231)te.end_fill()Moveto(361, 227)te.begin_fill()curveto_r(2, 18, 26, 14, 30, 6)smooth_r(-1, -3, -2, -4)smooth_r(-15, 9, -24, -4)Curveto(363, 224, 361, 225, 361, 227)te.end_fill()# 图层_16te.pencolor("black")# 眼睛(线条)te.pensize(3)# Moveto(206,213)# lineto(14,-8)# curveto_r(3,-1,30,0,33,1)# lineto(10,6)Moveto(225, 215)curveto_r(10, 28, 22, 16, 24, 6)Moveto(365, 219)curveto_r(4, 14, 18, 24, 22, -3)te.pensize(2)line(240.5, 207.5, 227.5, 211.5)line(245.5, 209.5, 227.5, 214.5)line(247.5, 211.5, 227.5, 217.5)line(247.5, 214.5, 229.5, 220.5)line(247.5, 218.5, 230.5, 223.5)line(246.5, 222.5, 232.5, 226.5)line(244.5, 225.5, 234.5, 228.5)line(377.5, 207.5, 367.5, 210.5)line(384.5, 207.5, 366.5, 212.5)line(385.5, 210.5, 366.5, 215.5)line(384.5, 213.5, 366.5, 218.5)line(384.5, 215.5, 367.5, 220.5)line(384.5, 218.5, 368.5, 223.5)# line(383.5,220.5,368.5,225.5)line(382.5, 223.5, 370.5, 227.5)# line(381.5,226.5,373.5,229.5)# 图层_20te.pencolor("black")Moveto(309, 270)# 鼻子、嘴curveto_r(0, 0, 4, 7, 1, 9)line(296.5, 307.5, 303.5, 307.5)Moveto(315, 307)smooth_r(10, -1, 10, 2)te.penup()te.hideturtle()te.update()te.done()附:可可爱爱卡通形象是不是很悦目~
https://p26.toutiaoimg.com/large/pgc-image/2a86a21bae7944078a9a7e84337a3788
总结

在学习中乐成、在学习中进步!我们一起学习不放弃~
如需完整的项目源码+全部的素材老规矩源码基地见:#私信小编06#即可免费获取打包的源码!
记得三连哦~mua 你们的支持是我最大的动力!!欢迎大家阅读往期文章哈~
页: [1]
查看完整版本: 我见过的Turtle天花板:居然还能画出邪术少女?我惊了「附源码」