我正在寻找可以计算Moon Phases的ActionScript 3中的小功能。 我试图在谷歌上搜索。唯一的结果是提供此代码的网站,但我认为这是错误的代码。
//return frame number for moon phase display
function getMoonPhase(yr:Number, m:Number, d:Number):int{
//based on http://www.voidware.com/moon_phase.htm
//calculates the moon phase (frames 1-30 )
if (m < 3) { yr -= 1; m += 12; } //
m += 1;
var c:Number = 365.25*yr;
var e:Number = 30.6*m; //jd is total days elapsed
//divide by the moon cycle (29.53 days)
var jd:Number = (c+e+d-694039.09)/29.53; //subtract integer to leave fractional part
jd = jd - int(jd); //range fraction from 0-30 and round by adding 0.5
var frame:int = Math.round(jd*30 + 0.5);
return frame;
}
//test: september 23, 2002, not a full moon? //
奇怪的是,有时候代码非常准确,但有时却错了......
示例:2016年9月16日,它是一个满月。 但是如果我在代码中输入这个日期,那么结果就是&#34; 15&#34; (16是满月)....
知道为什么吗?或另一种计算月相的方法?
THX
答案 0 :(得分:0)
在该算法中,c
是int,而不是Number
,因此这里会发生隐式舍入。与e
相同。这可能会导致计算中的一天误差,从而产生错误的相位。
编辑:此外,由于您请求30帧选择,但精度为29,因此计算可以跳过一帧。请考虑使用15或16帧。
答案 1 :(得分:0)
function julday(year, month, day) {
if (year < 0) { year ++; }
var jy = parseInt(year);
var jm = parseInt(month) +1;
if (month <= 2) {jy--; jm += 12; }
var jul = Math.floor(365.25 *jy) + Math.floor(30.6001 * jm) + parseInt(day) + 1720995;
if (day+31*(month+12*year) >= (15+31*(10+12*1582))) {
var ja = Math.floor(0.01 * jy);
jul = jul + 2 - ja + Math.floor(0.25 * ja);
}
return jul;
}
function moonphase(year,month,day) {
var n = Math.floor(12.37 * (year -1900 + ((1.0 * month - 0.5)/12.0)));
var RAD = 3.14159265/180.0;
var t = n / 1236.85;
var t2 = t * t;
var aas = 359.2242 + 29.105356 * n;
var am = 306.0253 + 385.816918 * n + 0.010730 * t2;
var xtra = 0.75933 + 1.53058868 * n + ((1.178e-4) - (1.55e-7) * t) * t2;
xtra += (0.1734 - 3.93e-4 * t) * Math.sin(RAD * aas) - 0.4068 * Math.sin(RAD * am);
var i = (xtra > 0.0 ? Math.floor(xtra) : Math.ceil(xtra - 1.0));
var j1 = julday(year,month,day);
var jd = (2415020 + 28 * n) + i;
return (j1-jd + 30)%30;
}
不是我完全理解它,但这应该可以正常工作。这是来自Sky&amp; Sons的Roger W. Sinnot的一些基本代码的(直接)端口。望远镜杂志,1985年3月......谈论旧学校。
如果您在2016年9月16日尝试,它将给出15.与2002年9月21日相同,这是满月的actual day