思路
通过五角星的不断绘制擦除并设置不追踪轨迹实现动图效果,同时在每次循环中设置合理的前近距离与旋转角度实现不同角度的五角星图形,并结合动图最终实现滚动效果。
代码实现
为了节约绘制时间,在绘制轨迹时设置了阈值,当轨迹点少于20个时,绘制所有的轨迹点,否则只绘制最后15个轨迹点,用来节约时间。该阈值应结合plant_star_with_color函数中length的设定值进行修改,在保证不会被五角星覆盖的情况下尽可能地小。
import time
from turtle import *
import numpy as np
定义绘制多角星的函数,在本实验中绘制五角星
def plant_star_with_color(star_sides, length, colour):
# suggest: star_sides >= 5
pencolor(colour)
# begin_fill()
pensize(3)
places = []
start_star = pos()
for s in range(star_sides):
forward(length)
right(720 / star_sides)
# 保存每一个顶点的轨迹
places.append(pos())
forward(length)
left(360 / star_sides)
# end_fill()
return start_star, places
设置画布以及窗口大小
setup(1000 + 10, 1000 * 0.618 + 10)
screensize(1000, 1000 * 0.618, 'blue')
设置用于绘制追踪轨迹的颜色库
pencolors = ['red', 'green', 'black', 'white', 'pink',
'gold', 'yellowgreen']
# 定义绘制五角星的个数
amount = 150
star_sides = 5
# 设置不追踪轨迹并隐藏画笔
tracer(False)
hideturtle()
# 定义绘制的初始点
start = (-400, 0)
# 定义存储轨迹点的列表
traces = []
for i in range(amount):
# 定义每次循环绘制的初始点坐标
up()
goto(i * 5 - 400, 0)
down()
# 绘制当前图形
start_star, points = plant_star_with_color(star_sides, 30, 'yellow')
# 更新当前绘制的图像
update()
traces.append(points)
# 用于擦除当前绘制的图形,防止出现残影,当绘制最后一个图形时不进行擦除
if i != amount - 1:
# 控制滚动速度
time.sleep(0.02)
plant_star_with_color(star_sides, 30, 'blue')
# 用于绘制轨迹
# 当轨迹点少于20个时,绘制所有的轨迹点,否则只绘制最后15个轨迹点,用来节约时间
# 该阈值应结合plant_star_with_color函数中length的设定值进行修改,在保证不会被五角星覆盖的情况下尽可能地小
if len(traces) >= 20:
select_points = np.array(traces[-20:])
select_starts = traces[-20]
else:
select_points = np.array(traces)
select_starts = traces[0]
for n in range(star_sides):
pensize(2)
# 定义当前要绘制轨迹的角点及使用的颜色
select_start_n = select_starts[n]
select_points_n = select_points[:, n, :]
pencolor(pencolors[n])
up()
goto(select_start_n)
down()
for point in select_points_n:
goto(point)
up()
goto(start_star)
down()
update()
# 设置旋转角度
seth(0)
right(i * 5)
done()
结果
轨迹及五角星均在图形中有所展示,不同角点的轨迹设置不同的颜色,大家可以复制上述代码查看滚动效果,同时该程序还存在一个不足,那就是滚动过程中没有实现在一个平面上滚动,大家可以进入turtle库绘图:实现滚动五角星并绘制轨迹(2)查看改进思路及改进后代码。