使用Python和Turtle模块绘制樱花树

在这个博文中,我们将介绍如何使用Python的Turtle模块绘制一棵美丽的樱花树。Turtle是一个简单而强大的绘图库,非常适合初学者进行图形绘制练习。以下是一个详细的代码解释,展示了如何一步步绘制出一棵樱花树。

1、导入模块

# -*- coding: utf-8 -*-
import turtle as T      # 导入turtle模块,用于绘图,并简写为T
import random           # 导入random模块,用于生成随机数

首先,我们导入了turtlerandom两个模块。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模块的基本用法,还通过递归和随机数生成等技巧实现了复杂的图形绘制。希望这个博文对你有所帮助,如果你有任何问题或建议,请随时在评论区留言。

### 使用PythonTurtle绘制樱花树 以下是使用PythonTurtle绘制樱花树的一个完整代码示例。该代码实现了樱花树的枝干花朵的绘制,并通过递归方法生成自然的效果。 ```python import turtle import random # 设置画布背景颜色 def set_background(): screen = turtle.Screen() screen.bgcolor("#87CEEB") # 天空蓝背景 # 定义树枝绘制函数 def draw_branch(branch_length): if branch_length > 5: # 绘制当前分支 turtle.color("brown") turtle.pensize(max(branch_length / 10, 2)) turtle.forward(branch_length) # 随机生成左侧子分支 angle_left = random.randint(15, 30) sub_length_left = random.uniform(0.6, 0.8) * branch_length turtle.right(angle_left) draw_branch(sub_length_left) # 返回到原位置后,随机生成右侧子分支 angle_right = random.randint(15, 30) sub_length_right = random.uniform(0.6, 0.8) * branch_length turtle.left(angle_left + angle_right) draw_branch(sub_length_right) # 返回原始方向 turtle.right(angle_right) turtle.penup() turtle.backward(branch_length) turtle.pendown() # 定义樱花花瓣绘制函数 def draw_flower(num_petals=50): turtle.color("pink") for _ in range(num_petals): petal_x = random.randint(-200, 200) petal_y = random.randint(-200, 0) turtle.penup() turtle.goto(petal_x, petal_y) turtle.pendown() turtle.begin_fill() turtle.circle(random.randint(3, 6)) turtle.end_fill() # 主程序入口 def main(): turtle.speed(0) turtle.penup() turtle.left(90) turtle.backward(200) turtle.pendown() # 绘制樱花树主体 draw_branch(100) # 添加樱花花瓣 draw_flower() # 结束绘图 turtle.hideturtle() turtle.done() if __name__ == "__main__": set_background() main() ``` #### 说明 - 上述代码利用了`turtle`库中的基本功能来完成樱花树绘制[^1]。 - `draw_branch()` 函数采用递归方式构建树的分叉结构,使树木看起来更加真实[^4]。 - 花瓣部分由`draw_flower()`函数负责,在随机位置绘制粉色圆形表示花瓣[^3]。 此代码不仅展示了如何使用`turtle`库创建复杂的图形,还体现了递归算法在实际编程中的应用价值[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值