使用Python和Turtle模块绘制樱花树
在这个博文中,我们将介绍如何使用Python的Turtle模块绘制一棵美丽的樱花树。Turtle是一个简单而强大的绘图库,非常适合初学者进行图形绘制练习。以下是一个详细的代码解释,展示了如何一步步绘制出一棵樱花树。
1、导入模块
# -*- coding: utf-8 -*-
import turtle as T # 导入turtle模块,用于绘图,并简写为T
import random # 导入random模块,用于生成随机数
首先,我们导入了turtle
和random
两个模块。turtle
模块用于绘图,而random
模块用于生成随机数,这些随机数将用于决定树枝的长度、角度以及花瓣的位置和颜色。
2、定义樱花树类
class SakuraTree:
接下来,我们定义了一个名为SakuraTree
的类,这个类包含了绘制樱花树所需的所有方法和属性。
3、初始化画布和画笔
def __init__(self):
self.screen = T.Screen() # 创建一个画布对象
self.screen.bgcolor('white') # 设置画布背景颜色为白色
self.screen.tracer(5, 0) # 设置画布刷新速度,加快绘图过程
self.turtle = T.Turtle() # 创建一个画笔对象
self.turtle.hideturtle() # 隐藏画笔图标,使绘图过程更美观
self.turtle.left(90) # 将画笔向左旋转90度,调整初始方向
self.turtle.up() # 提起画笔,不绘制移动路径
self.turtle.backward(150) # 向后移动150个单位,为树干位置做准备
self.turtle.down() # 放下画笔,开始绘制
self.turtle.color('sienna') # 设置画笔颜色为深褐色,用于绘制树干
在类的初始化方法__init__
中,我们创建了画布和画笔对象,并设置了画布的背景颜色为白色。tracer
方法用于控制画布的刷新速度,以加快绘图过程。我们还调整了画笔的初始方向,并将其移动到合适的位置开始绘制树干。
4、绘制树枝的函数
def draw_tree_branch(self, branch_length):
if branch_length > 3:
color_choice = random.choice(['snow', 'lightcoral']) if branch_length <= 12 else 'sienna'
pensize = branch_length / 3 if 8 <= branch_length <= 12 else (branch_length / 2 if branch_length < 8 else branch_length / 10)
self.turtle.color(color_choice)
self.turtle.pensize(pensize)
self.turtle.forward(branch_length)
angle_a = 1.5 * random.random()
self.turtle.right(20 * angle_a)
branch_reduction = 10 * (1.5 * random.random())
self.draw_tree_branch(branch_length - branch_reduction)
self.turtle.left(40 * angle_a)
self.draw_tree_branch(branch_length - branch_reduction)
self.turtle.right(20 * angle_a)
self.turtle.up()
self.turtle.backward(branch_length)
self.turtle.down()
draw_tree_branch
函数用于递归地绘制树枝。当树枝长度大于3时,函数会根据树枝的长度选择颜色(短树枝使用随机颜色,长树枝使用深褐色),并设置画笔的粗细。然后,函数会向前绘制树枝,并根据随机角度和长度减少量递归地绘制左右两侧的树枝。
5、绘制花瓣的函数
def draw_petals(self, num_petals):
for _ in range(num_petals):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
self.turtle.up()
self.turtle.forward(b)
self.turtle.left(90)
self.turtle.forward(a)
self.turtle.down()
self.turtle.color('lightcoral')
self.turtle.circle(1)
self.turtle.up()
self.turtle.backward(a)
self.turtle.right(90)
self.turtle.backward(b)
draw_petals
函数用于绘制花瓣。它会循环绘制指定数量的花瓣,每个花瓣的位置由随机生成的横纵坐标决定。然后,函数会移动到花瓣的位置,绘制一个半径为1的圆作为花瓣。
6、绘制樱花树的函数
def draw(self):
self.draw_tree_branch(65)
self.draw_petals(300)
self.screen.exitonclick()
draw
函数是绘制樱花树的主要入口。它首先调用draw_tree_branch
函数从初始树枝长度开始绘制樱花树的树枝,然后调用draw_petals
函数绘制花瓣。最后,exitonclick
方法用于等待用户点击画布后关闭窗口。
7、运行结果
8、完整代码
# -*- coding: utf-8 -*-
# @Time : 2021/5/9 13:11
# @Author : Leuanghing Chen
# @Blog : https://blog.youkuaiyun.com/weixin_46153372?spm=1010.2135.3001.5421
# @File : 樱花(类).py
# @Software : PyCharm
import turtle as T # 导入turtle模块,用于绘图,并简写为T
import random # 导入random模块,用于生成随机数
# 定义樱花树类
class SakuraTree:
# 初始化画布和画笔
def __init__(self):
self.screen = T.Screen() # 创建一个画布对象
self.screen.bgcolor('white') # 设置画布背景颜色为白色
self.screen.tracer(5, 0) # 设置画布刷新速度,加快绘图过程
self.turtle = T.Turtle() # 创建一个画笔对象
self.turtle.hideturtle() # 隐藏画笔图标,使绘图过程更美观
self.turtle.left(90) # 将画笔向左旋转90度,调整初始方向
self.turtle.up() # 提起画笔,不绘制移动路径
self.turtle.backward(150) # 向后移动150个单位,为树干位置做准备
self.turtle.down() # 放下画笔,开始绘制
self.turtle.color('sienna') # 设置画笔颜色为深褐色,用于绘制树干
# 绘制树枝的函数,branch_length为当前树枝的长度
def draw_tree_branch(self, branch_length):
# 当树枝长度大于3时,继续绘制
if branch_length > 3:
# 根据树枝长度选择颜色,长度较小时使用随机颜色,较长时保持深褐色
color_choice = random.choice(['snow', 'lightcoral']) if branch_length <= 12 else 'sienna'
# 根据树枝长度设置画笔粗细
pensize = branch_length / 3 if 8 <= branch_length <= 12 else (branch_length / 2 if branch_length < 8 else branch_length / 10)
self.turtle.color(color_choice) # 设置画笔颜色
self.turtle.pensize(pensize) # 设置画笔粗细
self.turtle.forward(branch_length) # 向前绘制树枝
# 计算随机角度和树枝长度减少量
angle_a = 1.5 * random.random() # 生成一个随机角度
self.turtle.right(20 * angle_a) # 右转一定角度
branch_reduction = 10 * (1.5 * random.random()) # 生成树枝长度减少量
self.draw_tree_branch(branch_length - branch_reduction) # 递归绘制右侧树枝
self.turtle.left(40 * angle_a) # 左转两倍的角度,准备绘制左侧树枝
self.draw_tree_branch(branch_length - branch_reduction) # 递归绘制左侧树枝
self.turtle.right(20 * angle_a) # 右转回原来的角度
self.turtle.up() # 提起画笔
self.turtle.backward(branch_length) # 回到绘制前的位置
self.turtle.down() # 放下画笔,准备下一次绘制
# 绘制花瓣的函数,num_petals为花瓣数量
def draw_petals(self, num_petals):
# 循环绘制每个花瓣
for _ in range(num_petals):
a = 200 - 400 * random.random() # 生成花瓣的横向位置
b = 10 - 20 * random.random() # 生成花瓣的纵向位置
self.turtle.up() # 提起画笔
self.turtle.forward(b) # 向前移动到花瓣的纵向位置
self.turtle.left(90) # 左转90度,调整方向
self.turtle.forward(a) # 向前移动到花瓣的横向位置
self.turtle.down() # 放下画笔
self.turtle.color('lightcoral') # 设置画笔颜色为浅珊瑚色
self.turtle.circle(1) # 绘制一个半径为1的圆,作为花瓣
self.turtle.up() # 提起画笔
self.turtle.backward(a) # 回到花瓣的横向起始位置
self.turtle.right(90) # 右转90度,调整方向
self.turtle.backward(b) # 回到花瓣的纵向起始位置
# 绘制樱花树的函数
def draw(self):
self.draw_tree_branch(65) # 从初始树枝长度65开始绘制樱花树
self.draw_petals(300) # 绘制300个花瓣
self.screen.exitonclick() # 等待用户点击画布后关闭窗口
if __name__ == '__main__':
sakura_tree = SakuraTree() # 创建樱花树对象
sakura_tree.draw() # 调用绘制函数,开始绘制樱花树
9、总结
通过以上步骤,我们成功地使用Python的Turtle模块绘制了一棵美丽的樱花树。这个示例不仅展示了Turtle模块的基本用法,还通过递归和随机数生成等技巧实现了复杂的图形绘制。希望这个博文对你有所帮助,如果你有任何问题或建议,请随时在评论区留言。