中华农历论坛知识讨论区历法知识 → [原创]公开电脑医生、福星、通胜万年历2014年2月最新历算源码


  共有64250人关注过本帖平板打印

主题:[原创]公开电脑医生、福星、通胜万年历2014年2月最新历算源码

帅哥哟,离线,有人找我吗?
chwc
  1楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:603 积分:5315 威望:0 精华:4 注册:2008/4/21 19:06:00
  发帖心情 Post By:2014/2/19 13:31:00


function m2fm(v,fx,fs){//秒轉為分秒,fx為小數點位數,fs為1轉為"分秒"格式否則轉為"角度分秒"格式
 var gn='+';
 if(v<0) v=-v, gn='-';
 var f=floor(v/60), m=v-f*60;
 if(!fs)   return gn + f + "'"  +m.toFixed(fx) + '"' ;
 if(fs==1) return gn + f + '分' +m.toFixed(fx) + '秒';
 if(fs==2) return gn + f + 'm'  +m.toFixed(fx) + 's';
}
function hcjj(t){ //返回P03黃赤交角,t是世紀數
  var t2=t*t, t3=t2*t,t4=t3*t,t5=t4*t;
  return (84381.4060 -46.836769*t -0.0001831*t2 +0.00200340*t3 -5.76e-7*t4 -4.34e-8*t5)/rad;
}
function rad2rrad(v){//對超過-PI到PI的角度轉為-PI到PI
  v=v % (2*Math.PI);
  if(v<=-Math.PI) return v+2*Math.PI;
  if(v>Math.PI) return v-2*Math.PI;
  return v;
}
function rad2mrad(v){ //對超過0-2PI的角度轉為0-2PI
  v=v % (2*Math.PI);
  if(v<0) return v+2*Math.PI;
  return v;
}
function llrConv(JW,E){ //球面坐標旋轉、黃道赤道坐標變換,赤到黃E取負
  var r=new Array(),J=JW[0],W=JW[1];
  r[0]=atan2( sin(J)*cos(E) - tan(W)*sin(E), cos(J) );
  r[1]=asin ( cos(E)*sin(W) + sin(E)*cos(W)*sin(J)  );
  r[2]=JW[2];
  r[0]=rad2mrad(r[0]);
  return r;
}
function dt_ext(y,jsd){ var dy=(y-1820)/100; return -20+jsd*dy*dy; } //二次曲線外推
function dt_calc(y){ //世界時-原子時之差,傳入年
 var y0=dt_at[dt_at.length-2]; //表最後一年
 var t0=dt_at[dt_at.length-1]; //表最後一年的deltatT
 if(y>=y0){
  var jsd=31; //y1年之後加速估計。瑞士星曆表jsd=31,NASA網站jsd=32,skmap的jsd=29
  if(y>y0+100) return dt_ext(y,jsd);
  var v = dt_ext(y, jsd);       //二次曲線外推
  var dv= dt_ext(y0,jsd) - t0;  //ye年二次外推與te的差
  return v - dv*(y0+100-y)/100;
 }
 var i,d=dt_at;
 for(i=0;i<d.length;i+=5) if(y<d[i+5]) break;
 var t1=(y-d[i])/(d[i+5]-d[i])*10, t2=t1*t1, t3=t2*t1;
 return d[i+1] +d[i+2]*t1 +d[i+3]*t2 +d[i+4]*t3;
}
function dt_T(t){ return dt_calc(t/365.2425+2000)/86400.0; }  //傳入儒略日(2000起算),計算TD-UT(單位:日)
var XL0_xzb = new Array( //行星星曆修正
 //經(角秒),緯(角秒), 距(10-6AU)
 -0.08631, +0.00039, -0.00008,  //水星
 -0.07447, +0.00006, +0.00017,  //金星
 -0.07135, -0.00026, -0.00176,  //火星
 -0.20239, +0.00273, -0.00347,  //木星
 -0.25486, +0.00276, +0.42926,  //土星
 +0.24588, +0.00345, -14.46266, //天王星
 -0.95116, +0.02481, +58.30651  //海王星
)
function XL0_calc(xt,zn,t,n){ //xt星體,zn坐標號,t儒略世紀,n計算項數
  t/=10; //儒略千年數
  var i,j,v=0,tn=1,c;
  var F=XL0[xt],n1,n2,N;
  var n0, pn=zn*6+1, N0 = F[pn+1]-F[pn]; //N0序列總數
  for(i=0;i<6;i++,tn*=t){
    n1=F[pn+i], n2=F[pn+1+i], n0=n2-n1;
    if(!n0) continue;
    if(n<0) N=n2;  //項數
    else { N = floor(3*n*n0/N0+0.5)+n1;  if(i) N+=3;  if(N > n2) N=n2; }
    for(j=n1,c=0;j<N;j+=3) c += F[j]*Math.cos(F[j+1] +t*F[j+2]);
    v += c*tn;
  }
  v/=F[0];
  if(xt==0){ //地球
    var t2=t*t, t3=t2*t; //千年數的次方
    if(zn==0) v += (-0.0728 -2.7702*t -1.1019*t2 -0.0996*t3) / rad;
    if(zn==1) v += (+0.0000 +0.0004*t +0.0004*t2 -0.0026*t3) / rad;
    if(zn==2) v += (-0.0020 +0.0044*t +0.0213*t2 -0.0250*t3) / 1000000;
  }else{ //其它行星
    var dv = XL0_xzb[ (xt-1)*3+zn ];
    if(zn==0) v += -3*t/rad;
    if(zn==2) v += dv/1000000;
    else      v += dv/rad;
  }
  return v;
}
function gxc_sunLon(t){ //光行差,t是世紀數
  var v =-0.043126+ 628.301955*t -0.000002732*t*t; //平近點角
  var e = 0.016708634-0.000042037*t-0.0000001267*t*t;
  return  ( -20.49552 * (1+e*Math.cos(v)) )/rad; //黃經光行差
}
var nutB=new Array(//中精章動表
  2.1824,  -33.75705, 36e-6,-1720,920,
  3.5069, 1256.66393, 11e-6,-132, 57,
  1.3375,16799.4182, -51e-6, -23, 10,
  4.3649,  -67.5141,  72e-6,  21, -9,
  0.04,   -628.302,   0,     -14,  0,
  2.36,   8328.691,   0,       7,  0,
  3.46,   1884.966,   0,      -5,  2,
  5.44,  16833.175,   0,      -4,  2,
  3.69,  25128.110,   0,      -3,  0,
  3.55,    628.362,   0,       2,  0);
function nutationLon2(t){ //只計黃經章動
 var i,a, t2=t*t, dL=0, B=this.nutB;
 for(i=0;i<B.length;i+=5){
  if(i==0) a=-1.742*t; else a=0;
  dL += (B[i+3]+a) * Math.sin( B[i]+B[i+1]*t+B[i+2]*t2 );
 }
 return dL/100/rad;
}

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
总数 56 1 2 3 4 5 6 下一页

返回版面帖子列表

[原创]公开电脑医生、福星、通胜万年历2014年2月最新历算源码








签名