写在开头:受限于turtle库的局限,实现及其笨拙,如果有更好的办法,欢迎私信告诉我让我更多学习。
基本思想:图形的动态效果最终仍是一帧一帧的图像,若想实现动态的效果可以通过快速的刷新并重绘得到,而同时旋转和绘画理论也是如此,即画出下一时刻的图像时,抹除前边的全部内容,并增加一步并重绘,对于turtle来说,通过将语句变为数组,通过exec()函数遍历数组执行,重复多次最终实现绘画结果。
源代码:
import turtle as t
import math as m
import time
# 基础设置
t.colormode(255)
t.bgcolor(200, 213, 250)
t.pencolor(255, 255, 255)
t.pensize(6)
t.hideturtle()
t.speed(0)
t.tracer(0)
screen = t.Screen()
screen.setup(width=1.0, height=1.0) # 将窗口设置为全屏
screen.screensize(canvwidth=2000, canvheight=2000) # 设置绘图区域的大小
#旋转角度控制
a=0
#归为函数
def home():
t.penup()
t.home()
t.pendown()
#122行为第二个图形的绘画开始
# 使用多行字符串存储绘图命令
commands_str = """
t.left(135)
t.fd(m.sqrt(8)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(20)
t.left(90)
t.fd(20)
t.right(135)
t.fd(m.sqrt(2)*10)
t.right(45)
t.fd(10)
t.left(90)
t.fd(20)
t.left(45)
t.fd(m.sqrt(2)*10)
t.circle(m.sqrt(2)*5,180)
t.right(135)
t.circle(-10,180)
t.right(180)
t.circle(-10,180)
t.right(135)
t.circle(m.sqrt(2)*5,180)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.right(90)
for i in range(3): t.fd(10); t.left(90)
t.left(135)
t.fd(m.sqrt(2)*10)
t.left(135)
t.fd(10)
t.right(135)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(20)
for i in range(2): t.left(135); t.fd(m.sqrt(8)*10); t.right(135); t.fd(10); t.right(45); t.fd(m.sqrt(8)*10); t.left(45); t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.right(45)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(-20)
t.right(90)
t.fd(20)
t.right(45)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.right(45)
t.fd(20)
t.left(90)
t.fd(20)
t.right(135)
t.fd(m.sqrt(2)*10)
t.right(45)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
for i in range(2): t.left(45); t.fd(m.sqrt(8)*10); t.right(45); t.fd(10); t.right(135); t.fd(m.sqrt(8)*10); t.left(135); t.fd(10)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.right(135)
t.fd(10)
t.left(135)
t.fd(m.sqrt(2)*10)
t.right(135)
for i in range(3): t.fd(10); t.left(90)
t.right(180)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.circle(m.sqrt(2)*5,180)
t.right(135)
t.circle(-10,180)
t.right(180)
t.circle(-10,180)
t.right(135)
t.circle(m.sqrt(2)*5,180)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(20)
t.left(90)
t.fd(10)
t.right(45)
t.fd(m.sqrt(2)*10)
t.right(135)
t.fd(20)
t.left(90)
t.fd(20)
t.left(45)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(8)*10)
t.right(45)
t.fd(m.sqrt(8)*10)
t.right(90)
t.fd(m.sqrt(8)*10)
t.left(90)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.left(45)
t.fd(m.sqrt(8)*10)
t.right(45)
for i in range(3):t.fd(10);t.right(90);
t.left(135)
t.fd(m.sqrt(2)*10)
t.left(135)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(90)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.right(45)
t.fd(m.sqrt(2)*10)
t.right(135)
t.fd(30)
t.left(90)
t.fd(5)
t.left(90)
t.fd(15)
t.right(90)
t.fd(5)
t.right(90)
t.fd(15)
t.left(135)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(20)
for i in range(2):t.left(135);t.fd(m.sqrt(8)*10);t.right(135);t.fd(10);t.right(45);t.fd(m.sqrt(8)*10);t.left(45);t.fd(10);
t.left(45)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.right(45)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(-20)
t.right(90)
t.fd(20)
t.right(45)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.right(45)
t.fd(20)
t.left(90)
t.fd(20)
t.right(135)
t.fd(m.sqrt(2)*10)
t.right(45)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
for i in range(2):t.left(45);t.fd(m.sqrt(8)*10);t.right(45);t.fd(10);t.right(135);t.fd(m.sqrt(8)*10);t.left(135);t.fd(10);
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(135)
t.fd(15)
t.right(90)
t.fd(5)
t.right(90)
t.fd(15)
t.left(90)
t.fd(5)
t.left(90)
t.fd(30)
t.right(135)
t.fd(m.sqrt(2)*10)
t.right(45)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.left(90)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.left(135)
t.fd(m.sqrt(2)*10)
t.left(45)
t.fd(10)
t.right(90)
for i in range(2):t.fd(10);t.right(90);
t.left(45)
t.fd(m.sqrt(8)*10)
t.left(45)
t.fd(10)
t.left(45)
t.fd(m.sqrt(2)*10)
t.right(90)
t.fd(m.sqrt(2)*10)
t.left(90)
t.fd(m.sqrt(8)*10)
t.right(90)
t.fd(m.sqrt(8)*10)
"""
# 将命令字符串拆分为列表
commands = commands_str.strip().split('\n')
# 定义一个主函数来执行命令
def main(commands_to_execute):
for command in commands_to_execute:
exec(command)
#定义新列表用来储存
all_commands = []
for i in range(4):
rotated_commands = commands.copy()
all_commands.extend(rotated_commands) # 使用extend将其展开并加入all_command
#执行
for i in range(2, len(all_commands) + 1, 2):
t.clear()
t.right(round(a,1))
main(all_commands[:i])
t.update()
time.sleep(0.1)
home()
a += 1.67
# 保持窗口打开
t.done()
最后结果:对其余的补充:对于基础旋转效果,可参考其余的教程。图形灵感来源于冰与火之舞的大雪花