如何抵消极坐标计算笛卡尔坐标的误差
How to offset the error in calculating cartesian coordinates from polar coordinates
我目前正在尝试使用 pygame 开发一个按比例缩放的宇宙模型。目前,当我计算行星的 x、y 位置时 w.r.t。太阳,尽管只使用基于行星距离和角度(无力)的位置方程式,但行星正在慢慢向太阳坠落。
这是当前计算距给定恒星距离的代码片段:
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)
然后我将这个函数returns传递给下一个计算位置的函数
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 个天文单位的设定距离映射到屏幕。
你正试图让你的行星绕着圈子移动,对吧?
在您的代码中,您
- 使用x和y计算距离,
- 使用delta_theta计算新的theta,
- 使用新的 theta 和距离计算新的 x 和 y。
您不必做所有这些。相反,您可以保持硬编码的距离,只需
- 使用delta_theta计算新的theta,
- 使用新的 theta 和(已知)距离计算绘图的 x 和 y。
那你的距离就不会漂移了
旁注:如果您打算让行星长时间运动,请确保将 theta 保持在 0 到 2*pi 之间,否则舍入误差将开始出现,并且您的 theta 精度将下降。
您认为这会使添加卫星和小行星变得困难。
不是真的!
您可以对卫星做同样的事情,注意它们属于哪个行星、与该行星的距离、delta_theta 和初始θ(基于它们的母行星)。
如果你想开始做椭圆而不是圆,你可以改变你的计算(使用方便的常量 orbital elements instead of distance and delta_theta, which will not be constant anymore) to apply Kepler's laws。
您也可以稍后添加小行星。您可以保留小行星的笛卡尔位置和速度,并在计算所有 "trivially" 个移动物体的运动后分别计算它们的运动。
我目前正在尝试使用 pygame 开发一个按比例缩放的宇宙模型。目前,当我计算行星的 x、y 位置时 w.r.t。太阳,尽管只使用基于行星距离和角度(无力)的位置方程式,但行星正在慢慢向太阳坠落。
这是当前计算距给定恒星距离的代码片段:
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)
然后我将这个函数returns传递给下一个计算位置的函数
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 个天文单位的设定距离映射到屏幕。
你正试图让你的行星绕着圈子移动,对吧?
在您的代码中,您
- 使用x和y计算距离,
- 使用delta_theta计算新的theta,
- 使用新的 theta 和距离计算新的 x 和 y。
您不必做所有这些。相反,您可以保持硬编码的距离,只需
- 使用delta_theta计算新的theta,
- 使用新的 theta 和(已知)距离计算绘图的 x 和 y。
那你的距离就不会漂移了
旁注:如果您打算让行星长时间运动,请确保将 theta 保持在 0 到 2*pi 之间,否则舍入误差将开始出现,并且您的 theta 精度将下降。
您认为这会使添加卫星和小行星变得困难。
不是真的!
您可以对卫星做同样的事情,注意它们属于哪个行星、与该行星的距离、delta_theta 和初始θ(基于它们的母行星)。
如果你想开始做椭圆而不是圆,你可以改变你的计算(使用方便的常量 orbital elements instead of distance and delta_theta, which will not be constant anymore) to apply Kepler's laws。
您也可以稍后添加小行星。您可以保留小行星的笛卡尔位置和速度,并在计算所有 "trivially" 个移动物体的运动后分别计算它们的运动。