任何人都知道我能在哪里找到(或者我可以制作)计算月相的函数? (AS3)

时间:2016-09-03 07:46:59

标签: actionscript-3

我正在寻找可以计算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

2 个答案:

答案 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