如何从极坐标中计算笛卡尔坐标中的误差

时间:2020-01-18 20:31:50

标签: python math pygame coordinates pow

我目前正在尝试使用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的设定距离映射到屏幕。

1 个答案:

答案 0 :(得分:2)

您正试图将行星移动成圆圈,对吗?

在您的代码中,您

  1. 使用x和y计算距离,
  2. 使用delta_theta计算新的theta,
  3. 使用新的theta和距离来计算新的x和y。

您不必执行所有操作。相反,您可以保持硬编码的距离,而

  1. 使用delta_theta计算新的theta,
  2. 使用新的theta和(已知)距离来计算绘图的x和y。

那么你的距离根本不会漂移。


侧面说明:如果您打算长时间保持行星运动,请确保将theta保持在0到2 * pi之间,否则将开始出现舍入误差,并且theta精度会降低。


您认为这将使添加卫星和小行星变得困难。

不是真的!

对于卫星,您可以做同样的事情,只需注意它们属于哪个行星,到该行星的距离,delta_theta和初始theta(基于其母行星)即可。

如果您要开始制作椭圆而不是圆形,可以更改计算(使用方便的常量orbital elements代替距离和delta_theta,后者将不再是常量)以应用Kepler's laws。 / p>

您也可以稍后添加小行星。在计算所有“平凡”运动物体的运动之后,您可以保持小行星的笛卡尔位置和速度,并分别计算它们的运动。

相关问题