python turtle库实现图形边绘画边旋转的方法

写在开头:受限于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()

最后结果:对其余的补充:对于基础旋转效果,可参考其余的教程。图形灵感来源于冰与火之舞的大雪花

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值