我希望用python3.x、Numpy和Tkinter从头开始创建一个简单但优化良好的粒子系统来显示它,允许模拟最大数量的相同粒子。
我的密码。
import numpy as np
import tkinter as tk
import random as rm
class particle:
def __init__(self, p, v, a=np.array([0,10]), colour="blue"):
self.shape = canvas.create_oval(p[0]-2, p[1]-2, p[0]+2, p[1]+2, fill = colour)
self.p = np.array([float(i) for i in p]) #position
self.v =np.array([float(i) for i in v]) #velocity
self.oldv = np.copy(v)
self.a = np.array([float(i) for i in a]) # accelleration
self.colour = colour
def update(self, delay):
self.v += self.a*delay
self.p += (self.v*delay)
canvas.move(self.shape, self.v[0]*delay, self.v[1]*delay)
if not 0
self.v *= np.array([-1,1])
if not 0
self.v *= np.array([1,-1])
def collide(self, other):
x = self.p-other.p
mag = np.sqrt(x.dot(x)) # checks distance
if 0
self.oldv = np.copy(self.v)
x /= mag
inline = x*x.dot(self.v)
inlineo = x*x.dot(other.oldv)
self.v -= inline - inlineo
#---------------------------------------------------------------------------------
def main():
[i.update(Time_per_frame) for i in particles]
[[j.collide(i) for i in particles] for j in particles]
canvas.after(int(Time_per_frame*1000),main)
#---------------------------------------------------------------------------------
#creates the window
root = tk.Tk()
root.title("Ball Bouncer")
root.resizable(False,False)
canvas = tk.Canvas(root, width = 800, height = 400)
canvas.pack()
canvas.config(bg="white")
#---------------------------------------------------------------------------------
#set variables
Time_per_frame = 0.02
NoParticles = 100
particles = [particle([rm.randint(100,700),rm.randint(100,300)], [rm.randint(-100,100),rm.randint(-100,100)],[0,0]) for i in range(100)]
#particles = [particle([50,53],[50,0],[0,0]),particle([150,50],[-50,0],[0,0])]
#---------------------------------------------------------------------------------
main()
root.mainloop()
我的代码是能够顺利运行约100个粒子,这比我预期的要少。有没有什么明显的东西让我的代码变慢了。
我的编码经验是非常有限的,主要是自学,所以请告诉我,我犯下的任何编码错误。这段代码主要是我自己的一个学习练习,因为我知道他们是现有的工具。
提前谢谢你。