Python 粒子物理学

Python particle physics

提问人:Frog 提问时间:10/28/2023 更新时间:10/28/2023 访问量:77

问:

好的,我正在尝试在 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 或其他东西来让它更快,但我不知道如何)。

python numpy 数学 物理 三角学

评论

1赞 k314159 10/28/2023
此等式在代码中的哪一行上实现?
1赞 Simon Goater 10/28/2023
物理学中的力是多少 1/d?静电力和重力为 1/(d^2)。
0赞 Frog 10/28/2023
K314159 ITS 第 28 行
0赞 Frog 10/28/2023
西蒙·戈特(Simon Goater):这不是一种力量,我只是让它像那样工作得最好
0赞 k314159 10/29/2023
它不是第 28 行。第 28 行说:这不是在计算力。if d != 0:

答: 暂无答案