【问题标题】:How to offset the error in calculating cartesian coordinates from polar coordinates如何弥补从极坐标计算笛卡尔坐标的误差
【发布时间】:2020-01-18 20:31:50
【问题描述】:

我目前正在尝试使用 pygame 开发一个按比例缩放的宇宙模型。目前,当我计算行星 w.r.t 的 x、y 位置时。太阳,尽管仅使用基于行星距离和角度的位置方程(无力),但行星正在缓慢地向太阳下落。

这里是当前计算与给定恒星距离的代码sn-p:

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 的设定距离映射到屏幕。

【问题讨论】:

  • 试试 math.hypot,如果数字天真地平方,你会损失很多精度。
  • @gct 我查看了 hypot 文档,它看起来与我的做法相同,但将数字相乘而不是将它们提升为指数。这样做有区别吗?
  • 你为什么要计算笛卡尔坐标?您可以在极坐标中“解决”您的系统,并且只为绘图进行笛卡尔计算。
  • @rhyso98 hypot 会注意保持大数和小数的数值稳定
  • 尝试round 而不是int

标签: python math pygame coordinates pow


【解决方案1】:

你正试图让你的行星绕圈移动,对吧?

在你的代码中,你

  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

您也可以稍后添加小行星。您可以保留小行星的笛卡尔位置和速度,在计算出所有“微不足道”的运动物体的运动之后,分别计算它们的运动。

【讨论】:

  • 啊,我明白你的意思了。我最初是这样做的,但后来我意识到,如果我想做某种月球系统,或者最终是小行星,我必须硬编码这些相互作用的距离。我还会检查以使 theta 保持在 2PI 以下。
  • 非常感谢!我真的没有这么想过。我希望稍后实施一些开普勒定律,感谢您对此的洞察力。最终,在弄清楚了像这个这样的其他小力学之后,我希望实现一个适当的重力/力系统,这样所有星际物体都可以相互交互,因此物体能够通过迭代相互交互的原因但是我认为让行星保持固定轨道并让小行星等物体拥有真正的轨道是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多