我使用Pygame进行可视化,并且一切都按计划进行(包括计算),但是我需要极限优化计算速度。目前系统可以以良好的帧率计算大约100-150个粒子。我把所有计算放在一个单独的线程中,这样给了我更多的提升,但远远达不到我的要求。
我看了看Scipy和Numpy,但由于我不是科学家或数学专家,所以感到很困惑。看起来我走在正确的道路上,但我不知道该怎么做。
我需要通过嵌套循环计算我拥有的所有粒子之间的吸引力,而且由于我需要找出是否存在碰撞,我必须再次执行相同的操作。
写那种代码让我心碎......
Numpy能够计算数组与数组,但我还没有找到任何方法可以计算一个数组中所有项与另一个数组中的所有项。有吗?
如果有的话,我可以创建并组合几个数组并进行更快的计算,必须有一种函数可以获取两个数组中值相匹配的索引(即碰撞检测)。
以下是今天的吸引/碰撞计算:
class Particle:
def __init__(self):
self.x = random.randint(10,790)
self.y = random.randint(10,590)
self.speedx = 0.0
self.speedy = 0.0
self.mass = 4
#Attraction
for p in Particles:
for p2 in Particles:
if p != p2:
xdiff = P.x - P2.x
ydiff = P.y - P2.y
dist = math.sqrt((xdiff**2)+(ydiff**2))
force = 0.125*(p.mass*p2.mass)/(dist**2)
acceleration = force / p.mass
xc = xdiff/dist
yc = ydiff/dist
P.speedx -= acceleration * xc
P.speedy -= acceleration * yc
for p in Particles:
p.x += p.speedx
p.y += p.speedy
#Collision
for P in Particles:
for P2 in Particles:
if p != P2:
Distance = math.sqrt( ((p.x-P2.x)**2) + ((p.y-P2.y)**2) )
if Distance < (p.radius+P2.radius):
p.speedx = ((p.mass*p.speedx)+(P2.mass*P2.speedx))/(p.mass+P2.mass)
p.speedy = ((p.mass*p.speedy)+(P2.mass*P2.speedy))/(p.mass+P2.mass)
p.x = ((p.mass*p.x)+(P2.mass*P2.x))/(p.mass+P2.mass)
p.y = ((p.mass*p.y)+(P2.mass*P2.y))/(p.mass+P2.mass)
p.mass += P2.mass
p.radius = math.sqrt(p.mass)
Particles.remove(P2)