《Python 动画:实现多种不同速度的炫酷烟花效果》

《Python 动画:实现多种不同速度的炫酷烟花效果》

前言

烟花绽放是一个经典的视觉效果,通过 Python 和 Matplotlib,我们可以轻松实现动态的烟花动画效果。本篇文章将教你如何实现多个不同速度、位置的烟花动画,让它们在屏幕上绚丽绽放,占满整个画布。

效果预览

本代码的最终效果如下,完整代码底部获取:

多个烟花随机从屏幕不同位置升空。
烟花绽放时,粒子以随机颜色和方向扩散。
不同烟花有快有慢,呈现出真实的烟花表演效果。

代码实现

  1. 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib
matplotlib.use('TkAgg')  # 确保兼容后端

我们使用 numpy 来处理随机数和数组操作,matplotlib 来绘制动画。

  1. 设置画布和参数

创建画布

fig, ax = plt.subplots()
ax.set_xlim(-2, 2)  # 横向范围
ax.set_ylim(0, 3)   # 纵向范围
ax.set_aspect('equal')
ax.axis('off')

参数设置

num_fireworks = 5  # 烟花数量
num_particles = 300  # 每个烟花的粒子数量
lifetime = 150  # 每个烟花的总生命周期
firework_intervals = np.random.randint(30, 60, num_fireworks)  # 烟花触发间隔

初始化烟花的参数

firework_positions = np.random.uniform(-1.5, 1.5, (num_fireworks, 2))  # 烟花初始位置 (x, y)
firework_lifetimes = np.random.randint(100, 200, num_fireworks)  # 每个烟花的寿命
firework_rising_speeds = np.random.uniform(0.02, 0.1, num_fireworks)  # 烟花上升速度
  1. 初始化粒子数据

初始化粒子

particles_x = np.zeros((num_fireworks, num_particles))  # 粒子x坐标
particles_y = np.zeros((num_fireworks, num_particles))  # 粒子y坐标
particles_dx = np.zeros((num_fireworks, num_particles))  # 粒子x速度
particles_dy = np.zeros((num_fireworks, num_particles))  # 粒子y速度
particles_colors = np.random.rand(num_fireworks, num_particles, 3)  # 每个粒子随机颜色

创建散点图

scatters = [ax.scatter(particles_x[i], particles_y[i], s=10, c=particles_colors[i], alpha=1) for i in range(num_fireworks)]
我们为每个烟花定义了粒子的初始坐标、速度以及随机颜色。
  1. 更新函数
    核心部分是 update 函数,它将根据当前帧数更新烟花的状态(上升或绽放)。

动态更新函数

def update(frame):
    for i in range(num_fireworks):
        firework_lifetime = firework_lifetimes[i]
        cycle_frame = frame % firework_lifetime  # 当前烟花的相对帧数
        x, y = firework_positions[i]  # 烟花的初始位置
        
        if cycle_frame < firework_intervals[i]:
            # 烟花上升阶段
            particles_x[i][:] = x  # 固定横向位置
            particles_y[i][:] = y + cycle_frame * firework_rising_speeds[i]  # 垂直方向上升
            scatters[i].set_sizes(np.full(num_particles, 10))  # 固定粒子尺寸
            scatters[i].set_alpha(1.0)  # 完全不透明
        else:
            # 绽放阶段
            explosion_frame = cycle_frame - firework_intervals[i]  # 绽放阶段的帧数
            explosion_duration = firework_lifetime - firework_intervals[i]
            
            if explosion_frame == 0:
                # 初始化粒子速度和角度
                angles = np.random.uniform(0, 2 * np.pi, num_particles)
                speeds = np.random.uniform(0.3, 1.5, num_particles)
                particles_dx[i][:] = speeds * np.cos(angles)
                particles_dy[i][:] = speeds * np.sin(angles)
            
            # 更新粒子位置
            particles_x[i] += particles_dx[i] * 0.1
            particles_y[i] += particles_dy[i] * 0.1
            
            # 计算衰减
            decay = explosion_frame / explosion_duration
            scatters[i].set_sizes(50 * (1 - decay) * np.ones(num_particles))  # 粒子尺寸逐渐减小
            scatters[i].set_alpha(1 - decay)  # 透明度逐渐衰减

        # 更新粒子位置
        scatters[i].set_offsets(np.c_[particles_x[i], particles_y[i]])

    return scatters

总结

如果你喜欢这篇文章,可以点个 赞 或 收藏,后续我会持续分享更多有趣的Python小项目,包括动态图形、小游戏开发和数据可视化,欢迎关注!

《Python无限弹窗小程序:给你一个流氓表白小妙招!》

《教你用Python写出浪漫的表白代码》

《Python浪漫的烟花表白特效》

《Python制作动态爱心粒子特效》

《如何用Python实现丝滑粒子爱心特效,惊艳朋友圈!》

  • 30 个必看的 Python 项目:初学者到进阶的最佳选择!
  • Python 小白必备!5 个超简单、超好玩的编程项目
  • 从入门到精通:Python 必学的 20 个实战项目
  • 经典 Python 爬虫项目合集:带你轻松爬遍全网!
  • 大学生不可错过的 10 大 Python 项目,让简历更出彩!
  • Python 零基础到大神之路:精选 15 个实战项目!
  • 快速提升编程技能:5 个简单又实用的 Python 项目
  • 学会这 8 个 Python 项目,你就是校园编程高手!
  • 30 天挑战!30 个 Python 实战项目,天天不重样!
  • 新手友好的 10 个 Python 项目,马上动手试试吧!
  • 编程入门必备:最适合大学生的 20 个 Python 项目
  • Python 数据分析必修!6 大经典项目等你来挑战
  • 程序员的第一步:5 个经典的 Python 实战项目
  • Python 高手的秘密武器!15 个项目助你脱颖而出
  • Python 入门到进阶的 12 个项目,掌握编程核心技能
  • 解锁编程思维!15 个 Python 项目带你进入代码世界
  • Python 自动化项目:10 个必学小工具,让生活更高效!
  • 从入门到简历加分:大学生必学的 20 个 Python 项目
  • 爬虫入门实战!5 个带你上手的 Python 爬虫项目
  • Python 技能提升指南:最适合初学者的 10 个项目

有问题后台私信我

你可能感兴趣的:(python,开发语言,新手入门,表白,表白代码,爱心,烟花)