月相、月齡、月面照亮比例

在作NoteIcon的萬年曆和月相顯示(在萬年曆和時鐘裏顯示)的時候,我查閱了一些開源代碼和資料,發如今一些開源項目中把這三者混淆了,有必要從新捋一下。算法

1、月相(moon phases)翻譯

在《大學天文學》【1】第56頁是這樣說的:
雖然任什麼時候刻月亮老是被太陽照亮半個球面,但咱們可以見到的月球明亮部分的大小和形狀是不一樣的,有圓缺「盈虧」的變化,此現象叫「月相」。月相變化是週期性的(圖5-3)。月相造成的緣由,一是月球本身不發光也不透光,而只能反射太陽光;二是日、月、地三者的相對位置在不斷變化,且有周期性。這月相變化的週期叫「朔望月」,一朔望月平均爲29.5306平太陽日,最長爲29.82917d,最短爲29.2944d。「朔」或「新月」日月相合,發生在農曆初一,不見月;「望」或「滿月」日月相沖,發生在農曆十5、十六,月圓。當月球在太陽西邊90°時爲「下弦」,月球在太陽東邊90°時爲「上弦」,分別發生在農曆廿二或廿三和初7、八,此時只能看到月球被照亮半球的一半。隨着日月黃經差的遞變,月相圓缺的程度也在遞變。
code

沒看懂?簡單粗暴的說法:因爲日、月、地三者的相對位置在不斷變化,形成咱們看到「月不常圓」,月亮的圓缺變化就是月相。blog

月相最多見的問題是容易和「月齡」相混淆,即期望經過月齡來計算月相:知道一個朔望月(陰曆月)的準確起始時間(有些源代碼甚至不能計算準確起始時間,只能用平均月長,即上面說的29.5306),則取中間1/2值就是望月(滿月),取1/4就是「上弦」,取3/4就是「下弦」——這種方法要是能用的話,就不會有「十五的月亮十六圓」這樣的說法了。這裏就是一份用平均月長計算月相的源代碼,百度一下就能夠知道在國內被普遍轉載: it

https://www.codeproject.com/Articles/100174/Calculate-and-Draw-Moon-Phaseio

在天文計算時,因爲月相是由地、月、日三者的夾角造成的,同時還要考慮各類軌道影響因素,所以很麻煩,具體計算方法能夠參見《算法的樂趣》【2】第11.3.1節的說明和該書提供的源代碼。補充說明: 百度

一、該書給出的日月合朔源代碼有一點小bug,特殊狀況下會出現死循環,不過很容易修正,我就給點面子不詳細說了。
二、該書給出的計算日月合朔的源代碼是計算地、月、日三者的夾角爲零時的源代碼,但看懂之後很容易改爲可以計算滿月(夾角180度)、上弦月(90度)、下弦月(270度)等。NoteIcon就用它計算滿月(望月)時刻。
三、該書的日月合朔算法出自英文版《天文算法》【3】,在網上能下到原書掃描版和勘誤表。另外「壽星天文歷」軟件的做者許劍偉先生翻譯了該書的中文版,雖然未正式出版,但在網上也能下到電子版。不過中文版沒有所有翻譯,因此要看的話建議仍是與英文版對照着看。另外「壽星天文歷」也是開源的,只不過是用js寫的,我看得頭暈,沒有【2】的C++代碼來得熟悉。軟件

2、月齡(moon age)循環

若是把月亮重新月、滿月再到新月的過程看做月亮的「一輩子」,即出生(新月)、青年(上弦月)、中年(滿月)、老年(下弦月)、死亡(新月),那麼從上一個新月到下一個新月之間的時間,即上面【1】中說的「朔望月」之間的時間就是月亮的年齡,即「月齡」。bug

沒看懂?簡單粗暴的解釋:農曆的初1、初二等日期數字就至關於月亮的「年齡」,即月亮在初一出生,逐漸成長到十五滿月,而後逐漸衰老,直到月底二十九(小月)或三十(大月)就拜拜了您吶。

在可以準確計算日月合朔時間點的狀況下,計算月齡即陰曆的日期不會有任何問題,從初一往下排就好了。但不能反過來計算,即從月齡計算月相。以滿月爲例,按月齡計算應該在十五,但實際也可能在十六甚至十七。但在像【2】中用迭代法求月相的準確時刻時,月齡能夠做爲迭代初始值,NoteIcon中就用月長的1/2時刻做爲求望月時的迭代初始值,而後迭代逼近。

3、月面照亮比例(Illuminated Fraction of the Moon's Disk)

不少鐘錶號稱具備「月相」顯示功能,其實我以爲應該說顯示的是「月面照亮比例」,即整個月面有多少部分被照亮,從而能被咱們所看見。

這部分確實容易與「月相」相混淆,但計算月相的視角和計算月面照亮比例的視角是不同的,因此在【3】中,「月相(Phases of the Moon)」與「月面照亮比例(Illuminated Fraction of the Moon's Disk)」是在獨立的兩章裏講的,計算公式也不同。書中的簡化計算公式很容易翻譯成代碼,給出力學時便可計算出該力學時刻的月面照亮比例,用此數值畫出來的月亮,纔是肉眼在地面上看到的月亮的準確反映。NoteIcon的時鐘中央和萬年曆右下角的月亮就是這麼畫的。

若是像上面我給出的連接中的代碼同樣用月齡畫月亮,碰到「十五的月亮十六圓」的時候就傻眼了。

參考資料

【1】.孫錦龍,李德範編著. 大學天文學[M]. 開封:河南大學出版社, 2005.03. 【2】.王曉華著. 算法的樂趣[M]. 北京:人民郵電出版社, 2015.04. 【3】.Jean Meeus. Astronomical algorithms -- 2nd ed. Willmann-Bell, Inc. 1998

相關文章
相關標籤/搜索