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

问题描述 投票:1回答:1

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

python math pygame coordinates pow
1个回答
1
投票

您正在尝试绕行星移动,对吧?

在您的代码中,您

  1. 使用x和y计算距离,
  2. 使用delta_theta计算新的theta,
  3. 使用新的θ和距离来计算新的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

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

© www.soinside.com 2019 - 2024. All rights reserved.