python 3d物理引擎_如何优化一个非常简单的Python-tkinter粒子“物理引擎”?

本文档展示了使用Python 3.x、Numpy和Tkinter创建一个粒子系统的尝试,目的是实现一个高效的3D物理引擎。作者面临的问题是,代码只能处理大约100个粒子,远低于预期。代码中定义了粒子类,并包含了更新位置、碰撞检测等方法。作者寻求关于代码性能优化和可能存在的编码错误的建议。
摘要由CSDN通过智能技术生成

我希望用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个粒子,这比我预期的要少。有没有什么明显的东西让我的代码变慢了。

我的编码经验是非常有限的,主要是自学,所以请告诉我,我犯下的任何编码错误。这段代码主要是我自己的一个学习练习,因为我知道他们是现有的工具。

提前谢谢你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值