月相、月龄、月面照亮比例
在做NoteIcon的万年历和月相显示(在万年历和时钟里显示)的时候,我查阅了一些开源代码和资料,发现在一些开源项目中把这三者混淆了,有必要重新捋一下。
一、月相(moon phases)
在《大学天文学》【1】第56页是这样说的:
虽然任何时刻月亮总是被太阳照亮半个球面,但我们能够见到的月球明亮部分的大小和形状是不同的,有圆缺“盈亏”的变化,此现象叫“月相”。月相变化是周期性的(图5-3)。月相形成的原因,一是月球自己不发光也不透光,而只能反射太阳光;二是日、月、地三者的相对位置在不断变化,且有周期性。这月相变化的周期叫“朔望月”,一朔望月平均为29.5306平太阳日,最长为29.82917d,最短为29.2944d。“朔”或“新月”日月相合,发生在农历初一,不见月;“望”或“满月”日月相冲,发生在农历十五、十六,月圆。当月球在太阳西边90°时为“下弦”,月球在太阳东边90°时为“上弦”,分别发生在农历廿二或廿三和初七、八,此时只能看到月球被照亮半球的一半。随着日月黄经差的递变,月相圆缺的程度也在递变。
没看懂?简单粗暴的说法:由于日、月、地三者的相对位置在不断变化,造成我们看到“月不常圆”,月亮的圆缺变化就是月相。
月相最常见的问题是容易和“月龄”相混淆,即指望通过月龄来计算月相:知道一个朔望月(阴历月)的准确起始时间(有些源代码甚至不能计算准确起始时间,只能用平均月长,即上面说的29.5306),则取中间1/2值就是望月(满月),取1/4就是“上弦”,取3/4就是“下弦”——这种方法要是能用的话,就不会有“十五的月亮十六圆”这样的说法了。这里就是一份用平均月长计算月相的源代码,百度一下就可以知道在国内被广泛转载:
https://www.codeproject.com/Articles/100174/Calculate-and-Draw-Moon-Phase
在天文计算时,由于月相是由地、月、日三者的夹角形成的,同时还要考虑各种轨道影响因素,因此很麻烦,具体计算方法可以参见《算法的乐趣》【2】第11.3.1节的说明和该书提供的源代码。补充说明:
1、该书给出的日月合朔源代码有一点小bug,特殊情况下会出现死循环,不过很容易修正,我就给点面子不详细说了。
2、该书给出的计算日月合朔的源代码是计算地、月、日三者的夹角为零时的源代码,但看懂以后很容易改成能够计算满月(夹角180度)、上弦月(90度)、下弦月(270度)等。NoteIcon就用它计算满月(望月)时刻。
3、该书的日月合朔算法出自英文版《天文算法》【3】,在网上能下到原书扫描版和勘误表。另外“寿星天文历”软件的作者许剑伟先生翻译了该书的中文版,虽然未正式出版,但在网上也能下到电子版。不过中文版没有全部翻译,所以要看的话建议还是与英文版对照着看。另外“寿星天文历”也是开源的,只不过是用js写的,我看得头晕,没有【2】的C++代码来得熟悉。
二、月龄(moon age)
如果把月亮从新月、满月再到新月的过程看作月亮的“一生”,即出生(新月)、青年(上弦月)、中年(满月)、老年(下弦月)、死亡(新月),那么从上一个新月到下一个新月之间的时间,即上面【1】中说的“朔望月”之间的时间就是月亮的年龄,即“月龄”。
没看懂?简单粗暴的解释:农历的初一、初二等日期数字就相当于月亮的“年龄”,即月亮在初一出生,逐渐成长到十五满月,然后逐渐衰老,直到月底二十九(小月)或三十(大月)就拜拜了您呐。
在能够准确计算日月合朔时间点的情况下,计算月龄即阴历的日期不会有任何问题,从初一往下排就行了。但不能反过来计算,即从月龄计算月相。以满月为例,按月龄计算应该在十五,但实际也可能在十六甚至十七。但在像【2】中用迭代法求月相的准确时刻时,月龄可以作为迭代初始值,NoteIcon中就用月长的1/2时刻作为求望月时的迭代初始值,然后迭代逼近。
三、月面照亮比例(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