在作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