【发布时间】: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