屏幕录制 2024-06-21 155836
通过递归函数tree绘制了一棵分形的樱花树,并通过draw_sakura函数实现了樱花飘落的动画效果。程序使用了Turtle库的基本命令,如forward、right、left、circle等来绘制图形,并通过ontimer实现了定时重复执行某个函数的功能。
from turtle import *
from random import *
from math import *
导入Turtle图形库、random和math模块。
def tree(n, l):
pd() # 下笔
# 阴影效果
t = cos(radians(heading() + 45)) / 8 + 0.25
pencolor(t, t, t)
pensize(n / 3)
forward(l) # 画树枝
定义一个绘制树枝的函数tree,参数n代表树枝分叉的层次,l代表树枝的长度。pd()是Turtle库的命令,表示将画笔放下(开始绘制)。
if n > 0:
b = random() * 15 + 10 # 右分支偏转角度
c = random() * 15 + 10 # 左分支偏转角度
d = l * (random() * 0.25 + 0.7) # 下一个分支的长度
如果树枝的层次n大于0,就计算左右分支的角度和下一个分支的长度。
# 右转一定角度,画右分支
right(b)
tree(n - 1, d)
# 左转一定角度,画左分支
left(b + c)
tree(n - 1, d)
# 转回来
right(c)
通过递归调用tree函数来绘制左右分支。
else:
# 画叶子
right(90)
n = cos(radians(heading() - 45)) / 4 + 0.5
ran = random()
# 这里相比于原来随机添加了填充的圆圈,让樱花叶子看起来更多一点
if (ran > 0.7):
begin_fill()
circle(3)
fillcolor('pink')
# 把原来随机生成的叶子换成了统一的粉色
pencolor("pink")
circle(3)
if (ran > 0.7):
end_fill()
left(90)
如果树枝的层次n不大于0,就绘制叶子。叶子是随机填充的粉色圆圈。
# 添加0.3倍的飘落叶子
if (random() > 0.7):
pu()
# 飘落
t = heading()
an = -40 + random() * 40
setheading(an)
dis = int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)
forward(dis)
setheading(t)
# 画叶子
pd()
right(90)
n = cos(radians(heading() - 45)) / 4 + 0.5
pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)
circle(2)
left(90)
pu()
# 返回
t = heading()
setheading(an)
backward(dis)
setheading(t)
添加飘落的叶子,通过随机数决定是否绘制飘落的叶子,以及叶子的位置和颜色。
pu()
backward(l) # 退回
将画笔抬起,并退回到上一级树枝的起点。
def draw_sakura():
# 随机生成樱花的位置和颜色
x = randrange(-600, 600)
y = randrange(-600, 600)
n = random()
pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)
定义一个绘制樱花的函数draw_sakura,随机生成樱花的位置和颜色。
# 移动到随机位置并绘制樱花
up()
goto(x, y)
down()
begin_fill()
circle(2)
fillcolor('pink')
end_fill()
up()
# 设置ontimer以便在一段时间后再次调用此函数
ontimer(draw_sakura, 50)
移动到随机位置,绘制一个填充为粉色的圆作为樱花,并设置一个定时器ontimer,这样在50毫秒后会再次调用draw_sakura函数,从而产生樱花飘落的效果。
# 设置屏幕
setup(800, 600)
bgcolor(0.956, 0.9255, 0.9882)
ht()
speed(0)
tracer(0, 0)
设置屏幕的大小为800x600像素,背景颜色为浅色调,隐藏turtle的箭头,设置绘制速度为最快,并且关闭动画效果(即立即显示绘制结果)。
# 绘制树
pu()
backward(50)
left(90)
pu()
backward(300)
tree(12, 100)
移动到起始位置,并调用tree函数开始绘制树,树枝的层次为12,初始长度为100。
# 开始绘制樱花动画
draw_sakura()
调用draw_sakura函数开始绘制樱花动画。
# 启动事件循环
done()
启动Turtle的事件循环,这样程序会一直运行,直到用户关闭图形窗口。