Celestia/Celx 脚本/问答/角度
在脚本中找到两个物体之间的角度是一件方便的事情。它主要用于查找角度分离和相位角(如下所示),这些角可用于各种其他目的。
两个物体在天空中的角度分离是观测者所见它们在天空中的距离的度量。
相位角通常用于描述绕恒星运行的非发光物体(例如行星、小行星、彗星、卫星等),它是观测者所见物体的光照角度。它是恒星-目标线与目标-观测者线之间的角度。以图像为例,0 度的相位角意味着观测者正好位于恒星和行星之间 - 因此,恒星位于观测者身后,行星看起来对观察者来说是“满月”。90 度或 270 度的相位角意味着观测者位于行星的终结线(白天和黑夜的分界线)上,因此他会看到一个“半满”的行星。180 度的相位角意味着行星正好位于观测者和恒星之间,因此观测者位于行星的阴影中,会看到一个“新月”的行星。在中间相位角下,观测者会看到一个新月或盈亏的行星。
Celestia 将物体的坐标存储在一个表中,该表包含 x 坐标、y 坐标和 z 坐标。连接两点的线被称为向量,所以基本上我们是在查找两个向量之间的角度。首先,我们必须计算每个向量。为此,我们找到连接线两端物体的坐标,然后简单地将一个坐标从另一个坐标中减去。因此,为了计算相位角,恒星-行星线的向量是(行星的坐标 - 恒星的坐标),而观测者-行星线的向量是(行星的坐标 - 观测者的坐标)。
一旦我们获得了这些向量,我们需要使用一个称为点积的用于向量的特殊数学函数。它在下面复制
我们将它称为“a 点乘 b”,其中 a 和 b 是所涉及的向量。等式右边的ab 是两个向量的长度相乘,角度 theta 是两个向量之间的角度。在这种情况下,Celestia 已经知道向量是什么(以及它们的长度和它们之间的角度),因此可以计算点积 - 我们只需要在脚本中提取我们想要的信息。我们也可以将向量归一化,使长度等于 1 - 这使计算更加简单(并且方便的是有一个“归一化”脚本命令可以做到这一点)。这将我们脚本中需要的方程简化为
下面的脚本演示了如何在 Celx 中执行此计算。
这是一个完整的脚本,您可以按原样运行它来显示太阳系中目标的相位角。在运行脚本之前,必须先选择目标。
camera = celestia:getobserver() -- set camera object target = celestia:getselection() -- set target object sunpos = celestia:find("Sol"):getposition() -- find sun position campos = camera:getposition() -- find camera position planpos = target:getposition() -- find target position sun_target_vector = planpos - sunpos -- determine sun-target vector obs_target_vector = planpos - campos -- determine observer-target vector phase_angle = math.acos(sun_target_vector:normalize() * obs_target_vector:normalize()) -- find phase angle (in radians) celestia:flash("Phase angle to target is "..string.format("%.2f", math.deg(phase_angle)).." degrees\n") wait(2)