中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用python畫煙花的方法

發布時間:2020-10-22 11:16:13 來源:億速云 閱讀:986 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關用python畫煙花的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

用python畫煙花的方法:首先創建一個所有粒子同時擴大的二維列表;然后實現粒子范圍擴大,以自由落體墜落;接著移除超過最高時長的粒子;最后循環調用保持不停。

用python畫煙花的方法:

# -*- coding: utf-8 -*-
# Nola
import tkinter as tk
from PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians
# 模擬重力
GRAVITY = 0.05
# 顏色選項(隨機或者按順序)
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
'''
particles 類
粒子在空中隨機生成隨機,變成一個圈、下墜、消失
屬性:
    - id: 粒子的id
    - x, y: 粒子的坐標
    - vx, vy: 在坐標的變化速度
    - total: 總數
    - age: 粒子存在的時長
    - color: 顏色
    - cv: 畫布
    - lifespan: 最高存在時長
'''
class Particle:
    def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2,
                 **kwargs):
        self.id = idx
        self.x = x
        self.y = y
        self.initial_speed = explosion_speed
        self.vx = vx
        self.vy = vy
        self.total = total
        self.age = 0
        self.color = color
        self.cv = cv
        self.cid = self.cv.create_oval(
            x - size, y - size, x + size,
            y + size, fill=self.color)
        self.lifespan = lifespan
    def update(self, dt):
        self.age += dt
        # 粒子范圍擴大
        if self.alive() and self.expand():
            move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed
            move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
            self.cv.move(self.cid, move_x, move_y)
            self.vx = move_x / (float(dt) * 1000)
        # 以自由落體墜落
        elif self.alive():
            move_x = cos(radians(self.id * 360 / self.total))
            # we technically don't need to update x, y because move will do the job
            self.cv.move(self.cid, self.vx + move_x, self.vy + GRAVITY * dt)
            self.vy += GRAVITY * dt
        # 移除超過最高時長的粒子
        elif self.cid is not None:
            cv.delete(self.cid)
            self.cid = None
    # 擴大的時間
    def expand (self):
        return self.age <= 1.2
    # 粒子是否在最高存在時長內
    def alive(self):
        return self.age <= self.lifespan
'''
循環調用保持不停
'''
def simulate(cv):
    t = time()
    explode_points = []
    wait_time = randint(10, 100)
    numb_explode = randint(6, 10)
    # 創建一個所有粒子同時擴大的二維列表
    for point in range(numb_explode):
        objects = []
        x_cordi = randint(50, 550)
        y_cordi = randint(50, 150)
        speed = uniform(0.5, 1.5)
        size = uniform(1, 3)
        color = choice(colors)
        explosion_speed = uniform(0.2, 1)
        total_particles = randint(10, 50)
        for i in range(1, total_particles):
            r = Particle(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
                         vx=speed, vy=speed, color=color, size=size, lifespan=uniform(0.6, 1.75))
            objects.append(r)
        explode_points.append(objects)
    total_time = .0
    # 1.8s內一直擴大
    while total_time < 1.8:
        sleep(0.01)
        tnew = time()
        t, dt = tnew, tnew - t
        for point in explode_points:
            for item in point:
                item.update(dt)
        cv.update()
        total_time += dt
    # 循環調用
    root.after(wait_time, simulate, cv)
def close(*ignore):
    """退出程序、關閉窗口"""
    global root
    root.quit()
if __name__ == '__main__':
    root = tk.Tk()
    cv = tk.Canvas(root, height=400, width=600)
    # 繪制一個黑色背景
    cv.create_rectangle(0, 0, 600, 400, fill='black')
    # cv = tk.Canvas(root, height=400, width=600)
    # # 選一個好看的背景會讓效果更驚艷!
    # image = Image.open("./image.jpg")
    # photo = ImageTk.PhotoImage(image)
    #
    # cv.create_image(0, 0, image=photo, anchor='nw')
    cv.pack()
    root.protocol("WM_DELETE_WINDOW", close)
    root.after(100, simulate, cv)
    root.mainloop()

實現效果圖:

用python畫煙花的方法

關于用python畫煙花的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永宁县| 大英县| 囊谦县| 蕲春县| 盐源县| 玛沁县| 玉溪市| 汝州市| 印江| 八宿县| 泰安市| 德清县| 巴青县| 海伦市| 广宁县| 浮山县| 都匀市| 宁夏| 恩施市| 昭苏县| 邢台市| 渑池县| 澄城县| 富蕴县| 班戈县| 西林县| 宜昌市| 额尔古纳市| 泸州市| 呼图壁县| 广宗县| 台南市| 长宁县| 安义县| 神池县| 盐边县| 石狮市| 土默特右旗| 云林县| 上栗县| 德令哈市|