代码剪贴板2 - Python
Project - 皮卡丘
# -*- coding: utf-8 -*-
import turtle as tur
from math import sin, cos, pi
DRAW_SPEED = 1
PEN_SIZE = 6
WIDTH = 600
HEIGHT = 600
"""
辅助函数
"""
def linear_interp(p1, p2, t):
return p1 * (1 - t) + p2 * t
def bezier1(p1, p2, t):
return (
linear_interp(p1[0], p2[0], t),
linear_interp(p1[1], p2[1], t)
)
def bezier2(p1, p2, p3, t):
return bezier1(
bezier1(p1, p2, t),
bezier1(p2, p3, t),
t
)
def bezier3(p1, p2, p3, p4, t):
return bezier1(
bezier2(p1, p2, p3, t),
bezier2(p2, p3, p4, t),
t
)
def bezier_3(p1, p2, p3, p4):
for t in [x / 15 for x in range(0, 15 + 1)]:
x, y = bezier3(p1, p2, p3, p4, t)
tur.goto(x, y)
def p(c): # 将 SVG 坐标 c 转换为 tur 坐标
return complex(
+ c.real - WIDTH / 2,
- c.imag + HEIGHT / 2
)
def M(c): # 移动到 SVG 坐标 c
tur.goto(p(c).real, p(c).imag)
def L(start, end):
M(start)
M(end)
def C(start, control1, control2, end):
M(start)
bezier_3(
(p(start).real, p(start).imag),
(p(control1).real, p(control1).imag),
(p(control2).real, p(control2).imag),
(p(end).real, p(end).imag))
def f(sp=0j, rgb='red'):
tur.fillcolor(rgb)
M(sp)
tur.begin_fill()
nf = tur.end_fill
def pd(sp, rgb="#E4007F", bold=PEN_SIZE):
tur.color(rgb)
tur.pensize(bold)
M(sp)
tur.pendown()
def pu():
tur.penup()
tur.pensize(PEN_SIZE)
tur.color("black")
def E(
cx, cy,
a, b,
matrix=(1, 0, 0, 1, 0, 0)):
cp = complex(cx, cy) # 中心
sp = cp + a # 绘制起点
tur.penup()
M(transform(sp, matrix))
tur.color("#FB8D8C")
tur.pensize(0.1)
tur.fillcolor("#FB8D8C")
tur.begin_fill()
tur.pendown()
for i in range(0, 360 + 1):
x = a * sin(i * 2 * pi / 360 + pi / 2) + cx
y = b * cos(i * 2 * pi / 360 + pi / 2) + cy
p = complex(x, y)
M(transform(p, matrix))
nf()
pu()
def transform(p, matrix=(1, 0, 0, 1, 0, 0)):
a, b, c = matrix[0], matrix[1], matrix[2],
d, e, f = matrix[3], matrix[4], matrix[5],
return complex(
a * p.real + c * p.imag + e,
b * p.real + d * p.imag + f
)
def Mv(c): # 移动到 SVG 坐标 c
tur.penup()
tur.goto(p(c).real, p(c).imag)
tur.pendown()
"""
绘图代码
"""
screen = tur.Screen()
screen.bgcolor("white")
tur.tracer(3) # 调整作画时间
tur.pensize(PEN_SIZE)
tur.speed(1)
tur.penup()
## pikachu_身体
pd(420.5+130.5j, rgb="#816124", bold=6) # 身体 pd
f(420.5+130.5j, "#FFFC9D")
C(420.5+130.5j, 406.87+122.22j, 376.07+106.14j, 334.5+106.5j)
C(334.5+106.5j, 272.08+107.05j, 231.12+144.27j, 221.5+153.5j)
L(221.5+153.5j, 235.5+141.5j)
C(235.5+141.5j, 212.68+140.71j, 180.37+141.73j, 148.5+147.5j)
C(148.5+147.5j, 107.27+154.96j, 86.82+160.88j, 62.5+172.5j)
C(62.5+172.5j, 75.29+179.74j, 94.99+188.89j, 120.5+193.5j)
C(120.5+193.5j, 152.85+199.34j, 188.71+192.2j, 204.5+188.5j)
C(204.5+188.5j, 200.5+202.5j, 194.15+226.33j, 192.5+244.5j)
C(192.5+244.5j, 190.5+266.5j, 192.5+342.5j, 189.5+355.5j)
C(189.5+355.5j, 184.56+376.91j, 152+435j, 152+435j)
L(152+435j, 112+391j)
L(112+391j, 50+432j)
L(50+432j, 0.5+364.5j)
L(0.5+364.5j, 0.5+431.5j)
L(0.5+431.5j, 49.5+461.5j)
L(49.5+461.5j, 101.5+429.5j)
L(101.5+429.5j, 147.5+450.5j)
C(147.5+450.5j, 147.5+461.83j, 145.77+476.92j, 147.5+485.5j)
C(147.5+485.5j, 148.71+491.51j, 154.1+501.65j, 158.5+508.5j)
C(158.5+508.5j, 164.2+517.37j, 172.68+528.69j, 179.5+531.5j)
C(179.5+531.5j, 228.85+551.83j, 393+531.5j, 393+531.5j)
C(393+531.5j, 393+531.5j, 408.21+525.6j, 420.5+524.5j)
C(420.5+524.5j, 440.25+522.73j, 460.55+528.07j, 467.5+531.5j)
C(467.5+531.5j, 476.45+520.82j, 487.49+502.89j, 496.5+485.5j)
C(496.5+485.5j, 510.46+458.55j, 515.61+429.58j, 518.5+411.5j)
C(518.5+411.5j, 510.7+415.96j, 498.99+424.21j, 488.5+435.5j)
C(488.5+435.5j, 477.86+446.95j, 471.37+458.32j, 467.5+466.5j)
L(467.5+466.5j, 470.5+460.5j)
L(470.5+460.5j, 461.5+319.5j)
L(461.5+319.5j, 453.5+330.5j)
C(453.5+330.5j, 481.5+292.5j, 483.5+275.68j, 483.5+259.5j)
C(483.5+259.5j, 483.5+237.5j, 465.5+214.5j, 463.5+194.5j)
C(463.5+194.5j, 463.23+191.75j, 464.65+184.98j, 462.5+176.5j)
C(462.5+176.5j, 460.44+168.38j, 456.49+162.32j, 453.5+158.5j)
L(453.5+158.5j, 460.5+170.5j)
C(460.5+170.5j, 478.16+163.45j, 497.24+154.06j, 518.5+141.5j)
C(518.5+141.5j, 542.18+127.5j, 560.78+114.84j, 576.5+101.5j)
C(576.5+101.5j, 550.5+98.5j, 503.5+103.5j, 483.5+105.5j)
C(483.5+105.5j, 458.54+108j, 430.8+116.23j, 409.5+124.5j)
L(409.5+124.5j, 420.5+130.5j)
nf()
pu() # 身体 pu
## 左脚
pd(268.5+467.5j, rgb="#816124", bold=6) # 左脚 pd
C(268.5+467.5j, 299.04+420.77j, 308.38+413.95j, 311.5+415.5j)
C(311.5+415.5j, 317.66+418.57j, 304.92+457.13j, 297.5+476.5j)
C(297.5+476.5j, 287.43+502.78j, 275.93+523.1j, 267.5+536.5j)
## 左手
Mv(322.5+490.5j)
f(322.5+490.5j, "#FFFC9D")
C(322.5+490.5j, 344.85+527.85j, 359.51+545.18j, 366.5+542.5j)
C(366.5+542.5j, 372.1+540.35j, 372.77+525.35j, 368.5+497.5j)
nf()
## 右手
Mv(399.5+501.5j)
f(399.5+501.5j, "#FFFC9D")
C(399.5+501.5j, 403.32+521.92j, 407.65+532.25j, 412.5+532.5j)
C(412.5+532.5j, 419.44+532.85j, 427.44+512.52j, 436.5+471.5j)
nf()
pu() # 左脚 pd-pu
## 右眼
pd(252.7+228.84j, rgb="#29ABE2", bold=6) # 右眼-pd
f(252.7+228.84j, "#29ABE2")
C(252.7+228.84j, 261.37+225.51j, 270.03+222.17j, 278.7+218.84j)
C(278.7+218.84j, 284.05+216.78j, 281.73+208.08j, 276.31+210.16j)
C(276.31+210.16j, 267.64+213.49j, 258.98+216.83j, 250.31+220.16j)
C(250.31+220.16j, 244.95+222.22j, 247.28+230.92j, 252.7+228.84j)
L(252.7+228.84j, 252.7+228.84j)
nf()
## 左眼
Mv(415.5+207j)
f(415.5+207j, "#29ABE2")
C(415.5+207j, 423.17+207j, 430.83+207j, 438.5+207j)
C(438.5+207j, 444.29+207j, 444.3+198j, 438.5+198j)
C(438.5+198j, 430.83+198j, 423.17+198j, 415.5+198j)
C(415.5+198j, 409.71+198j, 409.7+207j, 415.5+207j)
L(415.5+207j, 415.5+207j)
nf()
## 嘴
Mv(374.61+224.7j)
C(374.61+224.7j, 373.87+226.96j, 373.41+229.28j, 372.72+231.54j)
C(372.72+231.54j, 371.86+234.36j, 370.89+234.59j, 367.97+233.71j)
C(367.97+233.71j, 364.24+232.59j, 360.67+231.63j, 356.93+233.24j)
C(356.93+233.24j, 354+234.5j, 352.15+236.99j, 349.79+239.01j)
C(349.79+239.01j, 344.75+243.32j, 340.79+240.01j, 336.02+236.9j)
C(336.02+236.9j, 332.78+234.78j, 329.77+239.98j, 332.99+242.08j)
C(332.99+242.08j, 337.32+244.9j, 342.21+248.67j, 347.65+247.05j)
C(347.65+247.05j, 352.57+245.59j, 354.65+240.81j, 359+238.87j)
C(359+238.87j, 364.11+236.6j, 369.61+242.75j, 374.71+239.51j)
C(374.71+239.51j, 378.75+236.95j, 379.07+230.35j, 380.39+226.28j)
C(380.39+226.28j, 381.59+222.62j, 375.8+221.04j, 374.61+224.7j)
L(374.61+224.7j, 374.61+224.7j)
pu() # 右眼 pd-pu
## 腮红 左
E(255.5,282.5, 22.5,23.5)
## 腮红 右
E(425.5,260, 16.5,21)
## 左耳_花纹
f(63.5+172.5j, "#816124")
C(63.5+172.5j, 76.29+179.74j, 95.99+188.89j, 121.5+193.5j)
C(121.5+193.5j, 153.85+199.34j, 147.5+195.5j, 147.5+195.5j)
C(147.5+195.5j, 141.5+192.5j, 132.74+182.44j, 130.5+173.5j)
C(130.5+173.5j, 128.5+165.5j, 134.5+153.5j, 138.5+149.5j)
C(138.5+149.5j, 138.5+149.5j, 87.82+160.88j, 63.5+172.5j)
nf()
## 右耳花纹
f(577.5+101.5j, "#816124")
C(577.5+101.5j, 551.5+98.5j, 495.5+104.5j, 495.5+104.5j)
C(495.5+104.5j, 503.5+104.5j, 518.26+110.08j, 522.5+117.5j)
C(522.5+117.5j, 526.5+124.5j, 523.5+137.5j, 514.5+144.5j)
C(514.5+144.5j, 538.18+130.5j, 561.78+114.84j, 577.5+101.5j)
nf()
## 背部花纹2
f(180.5+381.5j, "#816124")
C(180.5+381.5j, 179.19+388.04j, 174.5+405.5j, 178.5+418.5j)
C(178.5+418.5j, 183.42+434.5j, 194.62+445.6j, 191.5+449.5j)
C(191.5+449.5j, 187.5+454.5j, 175.5+439.5j, 159.5+422.5j)
## 背部花纹1
C(180.5+381.5j, 197.5+404.5j, 206.5+412.5j, 209.5+409.5j)
C(209.5+409.5j, 213.04+405.96j, 194.67+394.75j, 193.5+379.5j)
C(193.5+379.5j, 192.5+366.5j, 192.37+344.38j, 192.5+336.5j)
nf()
## 尾巴花纹
f(120.62+437.37j, "#816124")
C(120.62+437.37j, 120.62+437.37j, 118.5+397.44j, 118.5+396.24j)
L(118.5+396.24j, 155+435.31j)
L(155+435.31j, 150.24+451.25j)
L(150.24+451.25j, 120.62+437.37j)
nf()
tur.hideturtle() # 隐藏乌龟图标
tur.update()
tur.done()
大地也该是从一片类似的光明中冒出来的。
本文作者:MontesquieuE
本文链接:https://www.cnblogs.com/UntitledCpp/articles/Temp2.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 领域模型应用
· 独立项目运营一周年经验分享
· 独立开发,这条路可行吗?
· 文生图:介绍一个文字生成图片的开源工具
· Java简历、面试、试用期、转正
· MySQL 10 MySQL为什么有时候会选错索引?