基于Python和Turtle库绘制樱花树及飘落效果

实现效果

在这里插入图片描述

介绍

本项目使用Python的Turtle库实现了一个简单的樱花树生成及花瓣飘落效果的动画。通过随机生成樱花树的枝干和颜色,以及在树枝上绘制樱花,并模拟樱花花瓣飘落的动画效果,展示了Turtle库在动画和图形绘制方面的应用。

环境配置

  • Python版本: 3.x
  • 需要的库: Turtle(Python标准库,无需额外安装)

项目分布

  1. 绘制树枝和樱花的函数定义

    • draw_branch(branch_len, angle, trunk_color): 绘制樱花树的分枝。
    • draw_sakura(x, y): 绘制樱花的函数。
  2. 樱花飘落的类定义

    • Sakura: 定义樱花对象,包括位置、颜色、大小等属性,并实现绘制和飘落的方法。
  3. 花瓣飘动效果的实现

    • petal_movement(sakura, petals): 实现花瓣飘动效果,通过Turtle对象模拟花瓣的飘落轨迹。
  4. 主函数及动画循环

    • main(): 主函数,负责初始化画布、绘制樱花树、创建樱花对象和花瓣对象,并实现动画效果的循环播放。

详细代码

import turtle
import random
import math

# 设置画布
turtle.setup(width=800, height=600)
turtle.bgcolor("lightblue")

# 创建画笔
t = turtle.Turtle()
t.speed(0)
t.hideturtle()
t.width(2)

# 定义绘制树枝的函数
def draw_branch(branch_len, angle, trunk_color):
    if branch_len > 10:
        t.pensize(branch_len / 10)
        t.color(trunk_color)  # 设置树干颜色
        t.forward(branch_len)
        # 绘制樱花
        draw_sakura(t.xcor(), t.ycor())
        # 右侧树枝
        right_angle = random.randint(15, 45)
        right_length = random.uniform(0.6, 0.8) * branch_len
        t.right(right_angle)
        draw_branch(right_length, angle, trunk_color)
        # 左侧树枝
        left_angle = random.randint(15, 45)
        left_length = random.uniform(0.6, 0.8) * branch_len
        t.left(right_angle + left_angle)
        draw_branch(left_length, angle, trunk_color)
        # 返回到起始点
        t.right(left_angle)
        t.up()
        t.backward(branch_len)
        t.down()

# 定义绘制樱花的函数
def draw_sakura(x, y):
    petal_color = random.choice(["pink", "lightpink", "hotpink", "deeppink"])
    t.up()
    t.goto(x, y)
    t.down()
    t.color("lightpink", petal_color)
    t.begin_fill()
    t.circle(random.uniform(3, 5))
    t.end_fill()

# 定义樱花飘落的类
class Sakura:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.dy = random.uniform(1, 2)
        self.dx = random.uniform(-0.5, 0.5)
        self.color = random.choice(["pink", "lightpink", "hotpink", "deeppink"])
        self.size = random.randint(3, 10)
        self.draw()

    def draw(self):
        t.up()
        t.goto(self.x, self.y)
        t.down()
        t.color(self.color)
        t.begin_fill()
        t.circle(self.size)
        t.end_fill()

    def fall(self):
        self.y -= self.dy
        self.x += self.dx
        # 随机飘动
        self.x += math.sin(self.y / random.uniform(5, 15))
        self.draw()

# 添加花瓣飘动的效果
def petal_movement(sakura, petals):
    for petal in petals:
        petal.penup()
        petal.goto(sakura.x, sakura.y)
        petal.pendown()
        petal.color(sakura.color)
        petal.speed(0)
        angle = random.uniform(0, 360)
        distance = random.uniform(50, 150)
        petal.left(angle)
        petal.forward(distance)
        petal.right(90)
        petal.forward(distance / 2)
        petal.backward(distance / 2)
        petal.left(180)
        petal.forward(distance / 2)
        petal.backward(distance / 2)
        petal.right(90)
        petal.forward(distance / 2)
        petal.backward(distance / 2)
        petal.left(180)
        petal.forward(distance / 2)
        petal.hideturtle()

# 主函数,绘制整棵樱花树和樱花飘落效果
def main():
    t.up()
    t.goto(0, -250)
    t.down()
    t.left(90)
    trunk_color = "sienna"
    t.color(trunk_color)
    draw_branch(100, 65, trunk_color)

    sakuras = []
    petals = []
    for _ in range(80):
        x = random.randint(-400, 400)
        y = random.randint(1, 150)
        sakuras.append(Sakura(x, y))
        petals += [turtle.Turtle() for _ in range(6)]

    while True:
        t.clear()
        t.up()
        t.goto(0, -250)
        t.down()
        t.left(90)
        t.color(trunk_color)
        draw_branch(100, 65, trunk_color)
        
        for sakura in sakuras:
            sakura.fall()
            if sakura.y < -300:
                sakura.y = random.randint(200, 300)

        for sakura in sakuras:
            petal_movement(sakura, petals)
        
        turtle.update()

# 调用主函数
main()

# 显示完成的画布并保持显示
turtle.done()

总结

通过本项目,展示了如何使用Python中的Turtle库创建动画效果,具体实现了樱花树的生长和花瓣的飘落效果。通过调整参数和添加随机性,使得每次运行生成的樱花树和花瓣飘落轨迹都具有一定的随机性,增强了视觉上的动态感和真实感。这种项目既可以用于展示动画制作的基本原理,也可以作为学习Turtle库和随机数生成的一个有趣的例子。

猜你喜欢

转载自blog.csdn.net/weixin_49602952/article/details/139997508