千家信息网

python实现烟花的实例代码怎么编写

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇文章给大家分享的是有关python实现烟花的实例代码怎么编写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现代码如下:# -*-
千家信息网最后更新 2024年09月22日python实现烟花的实例代码怎么编写

本篇文章给大家分享的是有关python实现烟花的实例代码怎么编写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

实现代码如下:

# -*- coding: utf-8 -*-import math, random,timeimport threadingimport tkinter as tkimport re#import uuidFireworks=[]maxFireworks=8height,width=600,600class firework(object):    def __init__(self,color,speed,width,height):        #uid=uuid.uuid1()        self.radius=random.randint(2,4)  #粒子半径为2~4像素        self.color=color   #粒子颜色        self.speed=speed  #speed是1.5-3.5秒        self.status=0   #在烟花未爆炸的情况下,status=0;爆炸后,status>=1;当status>100时,烟花的生命期终止        self.nParticle=random.randint(20,30)  #粒子数量        self.center=[random.randint(0,width-1),random.randint(0,height-1)]   #烟花随机中心坐标        self.oneParticle=[]    #原始粒子坐标(100%状态时)        self.rotTheta=random.uniform(0,2*math.pi)  #椭圆平面旋转角        #椭圆参数方程:x=a*cos(theta),y=b*sin(theta)        #ellipsePara=[a,b]        self.ellipsePara=[random.randint(30,40),random.randint(20,30)]           theta=2*math.pi/self.nParticle        for i in range(self.nParticle):            t=random.uniform(-1.0/16,1.0/16)  #产生一个 [-1/16,1/16) 的随机数            x,y=self.ellipsePara[0]*math.cos(theta*i+t), self.ellipsePara[1]*math.sin(theta*i+t)    #椭圆参数方程            xx,yy=x*math.cos(self.rotTheta)-y*math.sin(self.rotTheta),  y*math.cos(self.rotTheta)+x*math.sin(self.rotTheta)     #平面旋转方程            self.oneParticle.append([xx,yy])                self.curParticle=self.oneParticle[0:]     #当前粒子坐标        self.thread=threading.Thread(target=self.extend)   #建立线程对象            def extend(self):         #粒子群状态变化函数线程        for i in range(100):            self.status+=1    #更新状态标识            self.curParticle=[[one[0]*self.status/100, one[1]*self.status/100] for one in self.oneParticle]   #更新粒子群坐标            time.sleep(self.speed/50)        def explode(self):        self.thread.setDaemon(True)    #把现程设为守护线程        self.thread.start()          #启动线程                def __repr__(self):        return ('color:{color}\n'                  'speed:{speed}\n'                'number of particle: {np}\n'                'center:[{cx} , {cy}]\n'                'ellipse:a={ea} , b={eb}\n'                'particle:\n{p}\n'                ).format(color=self.color,speed=self.speed,np=self.nParticle,cx=self.center[0],cy=self.center[1],p=str(self.oneParticle),ea=self.ellipsePara[0],eb=self.ellipsePara[1])def colorChange(fire):    rgb=re.findall(r'(.{2})',fire.color[1:])    cs=fire.status        f=lambda x,c: hex(int(int(x,16)*(100-c)/30))[2:]    #当粒子寿命到70%时,颜色开始线性衰减    if cs>70:        ccr,ccg,ccb=f(rgb[0],cs),f(rgb[1],cs),f(rgb[2],cs)    else:        ccr,ccg,ccb=rgb[0],rgb[1],rgb[2]            return '#{0:0>2}{1:0>2}{2:0>2}'.format(ccr,ccg,ccb)def appendFirework(n=1):   #递归生成烟花对象    if n>maxFireworks or len(Fireworks)>maxFireworks:        pass    elif n==1:        cl='#{0:0>6}'.format(hex(int(random.randint(0,16777215)))[2:])   # 产生一个0~16777215(0xFFFFFF)的随机数,作为随机颜色        a=firework(cl,random.uniform(1.5,3.5),width,height)        Fireworks.append( {'particle':a,'points':[]} )   #建立粒子显示列表,'particle'为一个烟花对象,'points'为每一个粒子显示时的对象变量集        a.explode()    else:        appendFirework()        appendFirework(n-1)def show(c):    for p in Fireworks:                #每次刷新显示,先把已有的所以粒子全部删除        for pp in p['points']:            c.delete(pp)        for p in Fireworks:                #根据每个烟花对象,计算其中每个粒子的显示对象        oneP=p['particle']        if oneP.status==100:        #状态标识为100,说明烟花寿命结束            Fireworks.remove(p)     #移出当前烟花            appendFirework()           #新增一个烟花            continue        else:            li=[[int(cp[0]*2)+oneP.center[0],int(cp[1]*2)+oneP.center[1]] for cp in oneP.curParticle]       #把中心为原点的椭圆平移到随机圆心坐标上            color=colorChange(oneP)   #根据烟花当前状态计算当前颜色            for pp in li:                p['points'].append(c.create_oval(pp[0]-oneP.radius,  pp[1]-oneP.radius,  pp[0]+oneP.radius,  pp[1]+oneP.radius,  fill=color))  #绘制烟花每个粒子    root.after(50, show,c)  #回调,每50ms刷新一次if __name__=='__main__':    appendFirework(maxFireworks)        root = tk.Tk()    cv = tk.Canvas(root, height=height, width=width)    cv.create_rectangle(0, 0, width, height, fill="black")    cv.pack()    root.after(50, show,cv)    root.mainloop()

图片展示:

以上就是python实现烟花的实例代码怎么编写,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

烟花 粒子 对象 坐标 状态 椭圆 线程 颜色 代码 方程 实例 参数 寿命 平面 更多 标识 知识 篇文章 随机数 更新 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 大数据和数据库的关系 软件开发是一个长久的职业吗 凯迪兴业网络技术有限公司 网络安全领域需要注意什么 网络安全审查新政策 校园局域网网络技术选型 女生学习软件开发难度大吗 服务器系统如何更新驱动 数据库游标使用过程 合作软件开发的优势 国家网络安全学院西电 oppo云服务器安全吗 大专学软件开发费钱吗 网络技术部招聘要求 数据库分离后提示错误 手机网易我的世界服务器怎么备份 数据库的时间索引怎么设置 数据库基础语法约束 橙社网络技术公司 技术好的oa办公软件开发 河北节能软件开发服务价钱 计算机网络安全属性包括 网络安全微信网警 wde服务器是干什么的 检索中文期刊文献的数据库有哪些 更改数据库中一个字段值 地平线5商店一直连接不上服务器 服务器证书无效或不存在怎么办 计算机网络安全的重要事件 苹果软件开发费用
0