Python 显示奇怪行为的二维轨道物理模型

Python 显示奇怪行为的二维轨道物理模型,python,pygame,physics,game-physics,Python,Pygame,Physics,Game Physics,我正在尝试创建一个2D环境,使用pygame模拟基本的轨道物理。但是,当我运行它时,它会显示一些(编辑:和一些),例如卫星从x轴和y轴反弹,以及卫星沿轴向太阳以波浪状模式移动。下面是计算由中心太阳引起的物体加速度的代码。BM是体重,BP是体位[x,y],SM是太阳质量,SP是太阳位置[x,y] def CalcGrav(BM,BP,SM,SP): Dist = SubList(BP,SP) Mass = BM*SM/100 for i in range(0,2

我正在尝试创建一个2D环境,使用pygame模拟基本的轨道物理。但是,当我运行它时,它会显示一些(编辑:和一些),例如卫星从x轴和y轴反弹,以及卫星沿轴向太阳以波浪状模式移动。下面是计算由中心太阳引起的物体加速度的代码。BM是体重,BP是体位[x,y],SM是太阳质量,SP是太阳位置[x,y]

def CalcGrav(BM,BP,SM,SP):  
    Dist = SubList(BP,SP)  
    Mass = BM*SM/100  
    for i in range(0,2):  
        if(Dist[i] == 0):  
            Dist[i] += 0.01  
    AV = [-(Mass/Dist[0]),-(Mass/Dist[1])]  
return AV  
然后在以下上下文中使用该函数:

TraceAcc = CalcGrav(BallMass,TracePosition,SunMass,SunPosition)
TraceVector = SumList(TraceVector, TraceAcc)
TracePosition = SumList(TracePosition,TraceVector)
SumList(A,B)简单地将列表中的项目相加:(1,3)+(2,6)=(3,9)
当前速度矢量和加速度矢量存储为列表:[x,y]

谁能解释一下这种奇怪的行为,或者告诉我我做错了什么吗?

谢谢。

问题是你没有建立一个真实的轨道运动物理模型

你需要做的是建立一个简化的开普勒轨道模型,来进行一个比较真实的模拟。您还需要在极坐标(半径、角度)下工作,并转换为x、y坐标

您需要做的是在代码中为椭圆轨道构造一个开普勒轨道方程

开普勒方程看起来像(有关更多信息,请参阅)

这用轨道v的角度(实际上是希腊语nu)来描述轨道r的半径,其中“近点”处的角度为零,即轨道体和中心体最接近的点

你需要将你自己的偏心率(e)定义为0到1之间的某个值-我建议接近地球轨道偏心率,大约0.02。这将给你一个近似圆形的轨道。如果想要更椭圆的,请增加偏心率,但不要超过1.0

类似地,a是半长轴,即椭圆最长轴的一半。或者定义一个对游戏坐标有意义的值,或者如果你想用身体质量来计算它,你需要从上面的维基百科页面开始查找开普勒轨道上的一些参考


即使开普勒模型也从真实的轨道力学中大大简化了,但它至少会产生一个半真实的游戏模拟。

问题是,你没有建立一个真实的轨道运动物理模型

你需要做的是建立一个简化的开普勒轨道模型,来进行一个比较真实的模拟。您还需要在极坐标(半径、角度)下工作,并转换为x、y坐标

您需要做的是在代码中为椭圆轨道构造一个开普勒轨道方程

开普勒方程看起来像(有关更多信息,请参阅)

这用轨道v的角度(实际上是希腊语nu)来描述轨道r的半径,其中“近点”处的角度为零,即轨道体和中心体最接近的点

你需要将你自己的偏心率(e)定义为0到1之间的某个值-我建议接近地球轨道偏心率,大约0.02。这将给你一个近似圆形的轨道。如果想要更椭圆的,请增加偏心率,但不要超过1.0

类似地,a是半长轴,即椭圆最长轴的一半。或者定义一个对游戏坐标有意义的值,或者如果你想用身体质量来计算它,你需要从上面的维基百科页面开始查找开普勒轨道上的一些参考


即使开普勒模型也从真实的轨道力学中大大简化了,但它至少会产生一个半真实的游戏模拟。

事实证明,它要简单得多。我用单个x,y距离除以,我需要做的是计算出朝向太阳的向量,计算两个物体之间的直线距离,然后用向量的两部分除以距离的平方:

def CalcGrav(MM,MP,SM,SP):
    Vect = SubList(SP,MP)
    D = math.sqrt(Vect[0]**2 + Vect[1]**2)**2
    Vect = TimesList(Vect,[1/D,1/D])
    return Vect

事实证明,这要简单得多。我用单个x,y距离除以,我需要做的是计算出朝向太阳的向量,计算两个物体之间的直线距离,然后用向量的两部分除以距离的平方:

def CalcGrav(MM,MP,SM,SP):
    Vect = SubList(SP,MP)
    D = math.sqrt(Vect[0]**2 + Vect[1]**2)**2
    Vect = TimesList(Vect,[1/D,1/D])
    return Vect

尝试较小的步长(较小的距离增量)。例如,0.002而不是0.01。在我自己的轨道物理实验室里,我也遇到过类似的问题,这是可行的。

尝试小一点的步骤(较小的距离增量)。例如,0.002而不是0.01。在我自己的轨道物理实验室中,我也遇到过类似的问题,这是可行的。

在python中,大写字母通常只用于类名。
Mass/Dist
使用组件是不正确的。我想你想用实际距离除以质量,然后乘以太阳方向的单位向量,得到加速度。在python中,大写字母通常只用于类名。
Mass/Dist
使用组件是不正确的。我想你想用实际距离除以质量,然后乘以太阳方向的单位向量,得到加速度。在python中,大写字母通常只用于类名。
Mass/Dist
使用组件是不正确的。我想你应该把质量除以实际距离,再乘以太阳方向的单位向量,得到加速度。