Python中模拟重力的问题

2024-09-27 07:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我尝试用pygame在python中模拟两个(甚至更多)行星之间的引力。我已经解决了三个主要问题,但我似乎无法解决。第一个问题是,我试图首先模拟的小卫星朝向大行星的方向是完全错误的,如果你复制粘贴下面的代码,你可以看到它向上移动45度,而不是在同一个y轴上,然后正好进入行星内部。我很确定重力不是这样工作的。第二个问题是,我不知道如何给月球增加一个起始速度,使其能够进入轨道。第三个问题是,如果没有很长的代码行,我不知道如何添加更多的行星/卫星。 任何帮助都会得到报答! 代码:

import pygame
import math

''
w = 1280
h = 720
g = 25


def main():
    pygame.init()
    running = True
    xm1 = float(200)
    ym1 = float(660)
    xm2 = float(w/2)
    ym2 = float(h/2)
    mass1 = int(10)
    mass2 = int(100)

    while running:
        screen = pygame.display.set_mode((w, h))
        pygame.draw.circle(screen, (0, 255, 0), (xm1, ym1), 15, 15)
        pygame.draw.circle(screen, (255, 0, 0), (xm2, ym2), 45, 45)
        distance = math.sqrt((xm1-xm2)**2 + (ym1-ym2)**2)
        if ym1 > ym2:
            ym1 += g * mass2 / -distance ** 2
        else:
            ym1 -= g * mass2 / -distance ** 2
        if ym1 < ym2:
            ym2 += g * mass1 / -distance ** 2
        else:
            ym2 -= g * mass1 / -distance ** 2

        if xm1 > xm2:
            xm1 += g * mass2 / -distance ** 2
        else:
            xm1 -= g * mass2 / -distance ** 2
        if xm1 < xm2:
            xm2 += g * mass1 / -distance ** 2
        else:
            xm2 -= g * mass1 / -distance ** 2

        if distance <= 60:
            running = False
            pass
        pygame.display.update()

main()

Tags: 代码if行星floatscreenpygamerunningelse
1条回答
网友
1楼 · 发布于 2024-09-27 07:24:31

我重写了你的代码,所以它实际上模拟了牛顿定律所描述的自由落体。不要紧的是,这种幼稚的实现是非常不稳定的,在小距离的数字上。本质上,这是一个微分方程的数值积分,应该采用Runge-Kutta或类似的方法。总之,要点是

def gravity(m1,r1,m2,r2):
    d = vsub(r2,r1);
    return vmul(d, m1*m2/(vlen(d)**3))

def main():
    pygame.init()
    screen = pygame.display.set_mode((w, h))
    running = True

    r1 = (200., 660.)
    r2 = (w/2., h/2.)

    v1 = ( 0.3, 0)
    v2 = (-0, 0)

    m1 = 10.
    m2 = 100.

    while running:
        screen.fill((0,0,0))
        pygame.draw.circle(screen, map(int, (0, 255, 0)), map(int, r1), 15, 15)
        pygame.draw.circle(screen, map(int, (255, 0, 0)), map(int, r2), 45, 45)

        F = gravity(m1,r1,m2,r2)
        v1 = vadd(v1, vmul(F,  G/m1));
        v2 = vadd(v2, vmul(F, -G/m2));

        r1 = vadd(r1, v1)
        r2 = vadd(r2, v2)

        pygame.display.update()

main()

我将把它作为实现vadd、vsub、vmul和vlen函数的练习

相关问题 更多 >

    热门问题