提问人:Frog 提问时间:10/28/2023 更新时间:10/28/2023 访问量:77
Python 粒子物理学
Python particle physics
问:
好的,我正在尝试在 Python 中创建一个简单的粒子物理模拟。基本的想法是,有些粒子在远处时会吸引,在近距离时会排斥,我似乎找不到合适的公式。我尝试了很多东西,但我想说我做的最好的版本是这个。
import sys, pygame, time, math
import random
import os
rtod = math.pi/180 # x radians devided by rtod = x degrees
#os.environ['SDL_AUDIODRIVER'] = 'dsp'
pygame.init()
size = width, height = 480, 360
screen = pygame.display.set_mode(size)
particles = [] #[[100,100,0,0],[50,100,0,1]]
for i in range(100):
particles.append([random.randint(0,480),random.randint(0,360),0,0])
while True:
#start = time.time()
clock = pygame.time.Clock()
# Limit to 60 frames per second
screen.fill([0,0,0])
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
matrix = []
for i in range(len(particles)):
j_list = []
for j in range(i):
j_list.append(matrix[j][i])
for j in range(i,len(particles)):
d=((((((particles[i][0]-particles[j][0])**2)+ ((particles[i][1]-particles[j][1])**2)))))
if d != 0:
j_list.append(1/d)
else: j_list.append(0)
matrix.append(j_list)
partlenrng=range(len(particles))
start = time.time()
for particle in partlenrng:
cx = particles[particle][0]
cy = particles[particle][1]
for subparticle in partlenrng:
if subparticle!=particle:
#dist =((((particle[0]-subparticle[0])**2)+ ((particle[1]-subparticle[1])**2))**0.5)
#dist = matrix[particle][subparticle]
dx = cx - particles[subparticle][0]
dy = cy - particles[subparticle][1]
inv_dist = matrix[particle][subparticle]
particles[subparticle][2] += dx * inv_dist
particles[subparticle][3] += dy * inv_dist
#print(theta/rtod)
print(round((time.time()-start)*1000))
for particle in particles:
particle[2] = pygame.math.clamp(particle[2],-20,20)
particle[3] = pygame.math.clamp(particle[3],-20,20)
if particle[0] < 0 or particle[0] > 480:
particle[2] = 0-particle[2]
if particle[1] < 0 or particle[1] > 360:
particle[3] = 0-particle[3]
particle[0] = pygame.math.clamp(particle[0],0,480)
particle[1] = pygame.math.clamp(particle[1],0,360)
particle[0] += particle[2]
particle[1] += particle[3]
brightness = pygame.math.clamp(((abs(particle[2]) + abs(particle[3]))*5),50,255)
pygame.draw.circle(screen, [brightness, 50, 50], [particle[0],particle[1]], 4)
pygame.display.update()
对不起,如果它写得不好。我不是最擅长编码的。
我为它找到了一个非常好的方程:f= 6/d - 10/d^4(f 是施加的力,d 是两个粒子之间的距离),但是当我尝试实现它时,要么方程本身有缺陷,要么我实现了错误。我不知道,但我无法得到我想要的结果。我想要这样的东西:https://www.youtube.com/watch?v=SFf3pcE08NM 有没有人知道我是否在做一些非常愚蠢的事情(我可能是),或者我的方程式不够好(你能告诉我一个更好的方程式吗)?
还有一件事:我知道这个网站的审核很严格,所以我可能不被允许将两个问题放在一个问题中,但如果有人看到任何提高性能的方法,告诉我将不胜感激(我想我可以使用 Numpy 或其他东西来让它更快,但我不知道如何)。
答: 暂无答案
评论
if d != 0: