我目前正在尝试使用pygame开发按比例缩放的宇宙模型。目前,当我计算行星w.r.t.的x,y位置时。太阳,尽管仅使用基于行星的距离和角度的位置方程(无力),但行星正在缓慢地朝着太阳下落。
这是当前用于计算距给定星的距离的代码段:
def d_obj(self, reference):
x_diff_sq = pow(self.x - reference.pos[0], 2)
y_diff_sq = pow(self.y - reference.pos[1], 2)
return pow(x_diff_sq + y_diff_sq, 0.5)
然后我将此函数返回的内容传递给下一个用于计算位置的函数
def move(self, d):
self.theta += self.d_theta
self.x = int(d * math.cos(self.theta)) + total_d/2
self.y = int(d * math.sin(self.theta)) + total_d/2
total_d / 2是坐标偏移,self.d_theta是给定行星的旋转周期。
每个行星的初始位置都经过硬编码,我用它来计算所有行星的初始距离和当前距离之间的差,每一个滴答声,很明显,行星向太阳移动了大约1公里。有什么办法可以尝试抵消吗?
我了解,在以百万公里为单位绘制事物的事物规模中,我很好奇这些方程式的哪一部分会引起误差。我尝试过在pow上使用'**'运算符,并且在网上进行了一些研究后发现,pow更好地用于涉及浮点数的幂。
还应提及,所有计算均以公里为单位,然后在绘制之前,将行星半径和x,y从当前约为4 AU的设定距离映射到屏幕。
您正在尝试绕行星移动,对吧?
在您的代码中,您
您不必做所有的事情。相反,您可以保持硬编码的距离,只需
然后您的距离完全不会漂移。
旁注:如果您打算长时间保持行星运动,请确保将theta保持在0到2 * pi之间,否则舍入误差会开始增大,并且theta精度会下降。
您认为这将使添加卫星和小行星变得困难。
不是真的!
对于卫星,您可以做同样的事情,只需注意它们属于哪个行星,到该行星的距离,delta_theta和初始theta(基于其母行星)。
如果要开始用椭圆代替圆,可以更改计算(使用方便的常数orbital elements代替距离和delta_theta,后者将不再是常数)以应用Kepler's laws。
您也可以稍后添加小行星。在计算所有“平凡”运动物体的运动之后,您可以保持小行星的笛卡尔位置和速度,并分别计算其运动。