码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-27 18:39:20      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:www   河南   mda   技术   ase   alt   百度   图片   正式   

在做NoteIcon的万年历和月相显示(在万年历和时钟里显示)的时候,我查阅了一些开源代码和资料,发现在一些开源项目中把这三者混淆了,有必要重新捋一下。

一、月相(moon phase)

在《大学天文学》【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

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

标签:www   河南   mda   技术   ase   alt   百度   图片   正式   

原文地址:https://www.cnblogs.com/stronghorse/p/11748256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!