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)
