Actionscript 3 有人知道我在哪里可以找到(或者我可以制作)一个计算月球相位的函数吗?(AS3)

Actionscript 3 有人知道我在哪里可以找到(或者我可以制作)一个计算月球相位的函数吗?(AS3),actionscript-3,Actionscript 3,我想在ActionScript3中找到一个可以计算月亮相位的小功能。 我试着在谷歌上搜索。唯一的结果是一个网站给出了这个代码,但我认为这是一个错误的代码 //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 moo

我想在ActionScript3中找到一个可以计算月亮相位的小功能。 我试着在谷歌上搜索。唯一的结果是一个网站给出了这个代码,但我认为这是一个错误的代码

//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? //
//月相显示返回帧号
函数getMoonPhase(yr:Number,m:Number,d:Number):int{
//基于http://www.voidware.com/moon_phase.htm
//计算月亮相位(帧1-30)
如果(m<3){yr-=1;m+=12;}//
m+=1;
风险值c:数量=365.25*年;
var e:Number=30.6*m;//jd是经过的总天数
//除以月亮周期(29.53天)
var jd:Number=(c+e+d-694039.09)/29.53;//减去整数,留下小数部分
jd=jd-int(jd);//从0到30的范围分数,加上0.5四舍五入
变量帧:int=Math.round(jd*30+0.5);
返回框;
} 
//测试:2002年9月23日,不是满月吗//
奇怪的是,有时代码非常准确,但有时是错误的

示例:2016年9月16日是满月。 但是如果我在代码中输入这个日期,结果是“15”(16是满月)

知道为什么吗?还是另一种计算月球相位的方法


Thx在该算法中,
c
是int,而不是
Number
,因此这里会出现一个隐式的向下取整。与
e
相同。这可能导致一天的计算误差,进而产生错误的相位

编辑:另外,由于您请求30帧的选择,但精度为29,因此计算可以跳过一帧。考虑使用15或16帧代替.< /P> <代码>函数Julay(年、月、日){
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;
}
如果(年份<0){year++;} var jy=parseInt(年); var jm=parseInt(月)+1; 如果(月=(15+31*(10+12*1582))){ var ja=数学地板(0.01*jy); 七月=七月+2-ja+数学楼层(0.25*ja); } 七月返回; } 功能月阶段(年、月、日){ var n=数学下限(12.37*(1900年+(1.0*月-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)*数学sin(RAD*aas)-0.4068*数学sin(RAD*am); VarI=(xtra>0.0?Math.floor(xtra):Math.ceil(xtra-1.0)); 变量j1=七月日(年、月、日); var jd=(2415020+28*n)+i; 返回(j1+30)%30; } 我并不完全理解,但这应该很好。这是1985年3月《天空与望远镜》杂志的罗杰·辛诺特(Roger W.Sinnot)的一些基本代码的(直接)端口。。。谈论旧学校


如果您尝试2016年9月16日,它将给出15。与2002年9月21日相同,那是满月的第二天

嗯,答案是thx,但事实并非如此。试过了,还是有一个错误。我尝试过其他代码:[link]但同样的错误。。。奇怪吧?如果你尝试2016年9月16日,它将给出15。与2002年9月21日相同,那是满月的实际日期。我真的不明白你的意思。“16”应该是满月的数字吧?9月16日是满月,对吗?那么,为什么它会在9月16日给出数字“15”呢?我想这取决于你使用的是哪个范围。。。这将返回0-29范围内的值,因此0表示新月,15表示满月。如果需要1-30范围(我想是关键帧?)只需+1返回值italic\u如果需要1-30范围(我想是关键帧?)\u italic是。但是,如果我在返回值中加上+1,对于某些日期来说是不正确的(对于某些日期来说也是如此)。示例:2017年10月5日是满月。但是如果不加上+1,这个值已经是16(满月),所以当加上+1时,它等于17,而不显示满月。。。但2016年9月16日现在是正确的。。。这个问题很难回答,对吗?我不明白为什么有时候它会起作用,而在某些日期它却不起作用。。。