当前位置: 首页 > ai >正文

使用Python绘制动态樱花

使用turtle模块创建了一个动态樱花树动画。程序首先绘制缓慢生长的树干和地面,然后生成精致的樱花效果。樱花具有随机颜色、大小和形状(5或6瓣),并带有摆动动画效果。代码实现了分阶段显示樱花、花朵生长动画以及花瓣随风摆动的视觉效果。通过精细控制绘制过程的时间间隔,实现了平滑的动画效果。程序还包含窗口关闭处理和异常处理机制,确保程序稳定运行。整个动画展现了樱花树从无到有、花开满枝的美丽过程。 

import turtle
import random
import math
import time# 设置画布
screen = turtle.Screen()
screen.bgcolor("skyblue")
screen.tracer(0, 0)  # 关闭自动刷新# 创建画笔
pen = turtle.Turtle()
pen.speed(0)
pen.color("brown")
pen.pensize(2)
pen.hideturtle()# 存储树枝信息
branch_info = []# 缓慢绘制树干
def draw_tree_slowly(branch_len, pen, min_len=3):if branch_len > min_len:start_pos = pen.pos()start_heading = pen.heading()# 缓慢绘制主干steps = max(3, int(branch_len / 2))  # 确保至少有3步step_length = branch_len / stepsfor i in range(steps):pen.forward(step_length)screen.update()time.sleep(0.000005)  # 绘制速度end_pos = pen.pos()if branch_len < 20:branch_info.append((end_pos, start_heading))# 右侧分支right_angle = random.randint(15, 45)pen.right(right_angle)draw_tree_slowly(branch_len - random.randint(5, 15), pen)# 返回主干pen.penup()pen.goto(end_pos)pen.setheading(start_heading)pen.pendown()# 左侧分支left_angle = random.randint(15, 45)pen.left(left_angle)draw_tree_slowly(branch_len - random.randint(5, 15), pen)# 返回起始位置pen.penup()pen.goto(start_pos)pen.setheading(start_heading)pen.pendown()# 更精致的樱花类
class EnhancedBlossom:def __init__(self, pos, heading):self.pos = posself.heading = headingself.phase = random.random() * 2 * math.piself.size = 0.5  # 初始大小self.target_size = random.uniform(2.0, 3.0)self.color = random.choice([(255, 182, 193),  # 浅粉(255, 105, 180),  # 热粉(255, 20, 147),  # 深粉(219, 112, 147)  # 淡紫粉])self.growth_rate = random.uniform(0.02, 0.05)self.fully_grown = Falseself.petal_count = random.choice([5, 6])  # 5或6瓣self.petal_shape = random.choice(["rounded", "pointed"])  # 花瓣形状def draw(self, t):# 生长过程if not self.fully_grown:self.size += self.growth_rateif self.size >= self.target_size:self.size = self.target_sizeself.fully_grown = True# 计算摆动位置offset = math.sin(t + self.phase) * 2x = self.pos[0] + offsety = self.pos[1] + abs(offset) * 0.3# 设置颜色turtle.colormode(255)turtle.color(self.color)# 绘制花瓣turtle.penup()turtle.goto(x, y)turtle.setheading(self.heading)turtle.pendown()# 更精致的绘制方式turtle.begin_fill()if self.petal_shape == "rounded":# 圆形花瓣for _ in range(self.petal_count):turtle.circle(5 * self.size, 180)turtle.left(180 - (360 / self.petal_count))else:# 尖形花瓣for _ in range(self.petal_count):for _ in range(3):turtle.forward(8 * self.size)turtle.left(120)turtle.left(360 / self.petal_count)turtle.end_fill()# 花蕊turtle.penup()turtle.goto(x, y)turtle.dot(4 * self.size, "gold")# 绘制地面(缓慢)
def draw_ground_slowly():g = turtle.Turtle()g.hideturtle()g.speed(1)g.penup()g.goto(-400, -200)g.pendown()g.color("lightgreen")g.begin_fill()for i in range(2):g.forward(800)screen.update()time.sleep(0.2)g.right(90)g.forward(50)screen.update()time.sleep(0.2)g.right(90)g.end_fill()# 主函数
def main():# 初始化位置pen.penup()pen.goto(0, -200)pen.pendown()pen.left(90)# 缓慢绘制地面draw_ground_slowly()screen.update()time.sleep(0.5)# 缓慢绘制树干draw_tree_slowly(80, pen)screen.update()time.sleep(0.5)# 创建樱花blossoms = [EnhancedBlossom(pos, heading) for pos, heading in branch_info if random.random() > 0.5]# 分阶段显示樱花for i in range(1, 11):for blossom in blossoms:if random.random() < i / 10:blossom.draw(0)screen.update()time.sleep(0.3)# 动画循环start_time = time.time()running = Truedef on_close():nonlocal runningrunning = False# 设置关闭窗口的处理函数root = screen.getcanvas().winfo_toplevel()root.protocol("WM_DELETE_WINDOW", on_close)try:while running:t = (time.time() - start_time) * 0.5turtle.clearstamps()for blossom in blossoms:blossom.draw(t)screen.update()time.sleep(0.05)# 检查窗口是否仍然存在if not turtle.Turtle._screen:breakexcept turtle.Terminator:pass# 确保完全退出turtle.bye()if __name__ == "__main__":main()

http://www.xdnf.cn/news/16315.html

相关文章:

  • CentOS 镜像源配置与 EOL 后的应对策略
  • 【C++篇】STL的关联容器:unordered_map和unordered_set(上篇):哈希表的模拟实现
  • Triton Shared编译
  • Linux网络-------2.应⽤层⾃定义协议与序列化
  • 大模型算法面试笔记——常用优化器SGD,Momentum,Adagrad,RMSProp,Adam
  • Spring MVC设计精粹:源码级架构解析与实践指南
  • AI Coding IDE 介绍:Cursor 的入门指南
  • 深度学习计算(深度学习-李沐-学习笔记)
  • Python 程序设计讲义(23):循环结构——循环控制语句 break 与 continue
  • 【笔记】Einstein关系式 D = ukBT 的推导与应用研究
  • 【自动化运维神器Ansible】Ansible常用模块之hostname模块详解
  • Java面试实战:企业级性能优化与JVM调优全解析
  • 【编号444】雅鲁藏布江(上中下)游8级水系湖泊数据合集
  • cacti漏洞CVE-2022-46169的复现
  • Java:采用mybatis+pagehealper优雅的实现分页功能
  • 如何筛选适合自己阅读的文献?高效文献调研流程?
  • 【C++高效编程】STL queue深度剖析:从底层原理到高级应用
  • FastAPI入门:安装、Pydantic、并发和并行
  • 嵌入式硬件篇---有线串口通信问题解决
  • 使用Clion开发STM32(Dap调试)
  • Android WorkManager 详解:高效管理后台任务
  • hot100-每日温度
  • Python爬虫实战:诗词名句网《三国演义》全集
  • obd运维OceanBase数据库的常见场景
  • 0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)
  • 【Canvas技法】绘制正N角星
  • 机器学习的工作流程
  • Windows 平台源码部署 Dify教程(不依赖 Docker)
  • 手写PPO_clip(FrozenLake环境)
  • 【LeetCode 热题 100】79. 单词搜索——回溯