⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eph.js

📁 返回 第一章 关于寿星万年历 第二章 公历与儒略日 第三章 回历计算 第四章 天文坐标 第五章 近现代农历的天文学性质及其规则 第六章 离散序列的直线拟合算法
💻 JS
📖 第 1 页 / 共 3 页
字号:
/****************************************
以下是天文计算部分,包含有:
常数 rad   : 每弧度的角秒数
常数 J2000 : 2000年1月1日 12:00:00 的儒略日数
常数 pi2   : 圆周率的2倍,即2*3.14159...
trim()     : 去除字串首尾的空格
rad2str()  : 弧度转为"度分秒"或"时分秒"
rad2str2() : 弧度转为"度分"
rad2mrad() : 将超出0到360度的角度转为0到360度的解度
mod2(a,b)  : 临界余数(a与最近的整倍数b相差的距离)
int2(a)    : 取小等于a的最大整数
物件 JD    : 公历——儒略日——时间物件
物件 ZB    : 坐标变换物件,包含坐标旋转、章动、日月光行差(时)、视差、大气折射、恒星时的计算
物件 XL    : 日月黄道平分点坐标、视坐标、速度、已知经度反求时间等方面的计算
物件 SZJ   : 用来计算日月的升起、中天、降落
注意,上述函数或物件是纯天文学的,根据实际需要组合使用可以得到所需要的各种日月坐标,计算精度及计算速度也是可以根据需要有效控制的。
*****************************************/

rad  = 180*3600/Math.PI,
J2000= 2451545;
pi2  = Math.PI*2;
function trim(s){ return s.replace(/(^\s*)|(\s*$)/g, "");  }
function rad2str(d,tim){ //将弧度转为字串
 //tim=0输出格式示例: -23°59' 48.23"
 //tim=1输出格式示例:  18h 29m 44.52s
 var s=" ";
 var w1="°",w2="'",w3='"';
 if(d<0)  d=-d,s='-';
 if(tim){ d*=12/Math.PI; w1="h ",w2="m ",w3="s"; }
 else     d*=180/Math.PI;
 var a=Math.floor(d); d=(d-a)*60;
 var b=Math.floor(d); d=(d-b)*60;
 var c=Math.floor(d); d=(d-c)*100;
 d=Math.floor(d+0.5);
 if(d>=100) d-=100, c++;
 if(c>=60)  c-=60,  b++;
 if(b>=60)  b-=60,  a++;
 a="   "+a, b="0"+b, c="0"+c, d="0"+d;
 s+=a.substr(a.length-3,3)+w1;
 s+=b.substr(b.length-2,2)+w2;
 s+=c.substr(c.length-2,2)+".";
 s+=d.substr(d.length-2,2)+w3;
 return s;
}
function rad2str2(d){ //将弧度转为字串,精确到分
 //输出格式示例: -23°59'
 var s="+";
 var w1="°",w2="'",w3='"';
 if(d<0)  d=-d,s='-';
 d*=180/Math.PI;
 var a=Math.floor(d);
 var b=Math.floor((d-a)*60+0.5);
 if(b>=60)  b-=60,  a++;
 a="   "+a, b="0"+b;
 s+=a.substr(a.length-3,3)+w1;
 s+=b.substr(b.length-2,2)+w2;
 return s;
}

function rad2mrad(v){   //对超过0-2PI的角度转为0-2PI
  v=v % (2*Math.PI);
  if(v<0) return v+2*Math.PI;
  return v;
}
function mod2(a,b){ //临界余数(a与最近的整倍数b相差的距离)
  var c=a/b;
  c -= Math.floor(c);
  if(c>0.5) c-=1;
  return c*b;
}
function int2(v){ return Math.floor(v); }  //取整数部分

var JD={ //日期元件
  Y:2000, M:1, D:1, h:12, m:0, s:0,
  dts:new Array( // TD - UT1 计算表
   -4000,108371.7,-13036.80,392.000, 0.0000, -500, 17201.0,  -627.82, 16.170,-0.3413,
    -150, 12200.6,  -346.41,  5.403,-0.1593,  150,  9113.8,  -328.13, -1.647, 0.0377,
     500,  5707.5,  -391.41,  0.915, 0.3145,  900,  2203.4,  -283.45, 13.034,-0.1778,
    1300,   490.1,   -57.35,  2.085,-0.0072, 1600,   120.0,    -9.81, -1.532, 0.1403,
    1700,    10.2,    -0.91,  0.510,-0.0370, 1800,    13.4,    -0.72,  0.202,-0.0193,
    1830,     7.8,    -1.81,  0.416,-0.0247, 1860,     8.3,    -0.13, -0.406, 0.0292,
    1880,    -5.4,     0.32, -0.183, 0.0173, 1900,    -2.3,     2.06,  0.169,-0.0135,
    1920,    21.2,     1.69, -0.304, 0.0167, 1940,    24.2,     1.22, -0.064, 0.0031,
    1960,    33.2,     0.51,  0.231,-0.0109, 1980,    51.0,     1.29, -0.026, 0.0032,
    2000,    63.87,    0.1,   0,     0,      2005),
  deltatExt:function(y,jsd){ var dy=(y-1820)/100; return -20+jsd*dy*dy; }, //二次曲线外推
  deltatT:function(y){ //计算世界时与原子时之差,传入年
   if(y>=2005){
     //sd是2005年之后几年(一值到y1年)的速度估计。
     //sjd是y1年之后的加速度估计。瑞士星历表jsd=31,NASA网站jsd=32,skmap的jsd=29
     var y1=2014, sd=0.4, jsd=31;
     if(y<=y1) return 64.7 + (y-2005) *sd; //直线外推
     var v = this.deltatExt(y,jsd);        //二次曲线外推
     var dv= this.deltatExt(y1,jsd) - ( 64.7+(y1-2005)*sd ); //y1年的二次外推与直线外推的差
     if(y<y1+100  ) v -= dv*(y1+100-y)/100;
     return v; 
   }
   var i,d=this.dts;
   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;
  },
  deltatT2:function(t){ //传入儒略日(J2000起算),计算TD-UT(单位:日)
    return this.deltatT(t/365.2425+2000)/86400.0;
  },
  toJD:function(){ //公历转儒略日
   var y=this.Y, m=this.M, n=0; //取出年月
   if(m<=2) m+=12,y--;
   if(this.Y*372+this.M*31+this.D>=588829)//判断是否为格里高利历日1582*372+10*31+15
     n =int2(y/100), n =2-n+int2(n/4);//加百年闰
   n +=int2(365.25*(y+4716)+0.01);    //加上年引起的偏移日数
   n +=int2(30.6*(m+1))+this.D;       //加上月引起的偏移日数及日偏移数
   n +=((this.s/60+this.m)/60+this.h)/24 - 1524.5;
   return n;
  },
  setFromJD:function(jd){ //儒略日数转公历
   jd+=0.5;
   var A=int2(jd), F=jd-A, D;  //取得日数的整数部份A及小数部分F
   if(A>=2299161) D=int2((A-1867216.25)/36524.25),A+=1+D-int2(D/4);
   A     +=1524; //向前移4年零2个月
   this.Y =int2((A-122.1)/365.25);//年
   D      =A-int2(365.25*this.Y); //去除整年日数后余下日数
   this.M =int2(D/30.6001);       //月数
   this.D =D-int2(this.M*30.6001);//去除整月日数后余下日数
   this.Y-=4716; this.M--;
   if(this.M>12) this.M-=12;
   if(this.M<=2) this.Y++;
   //日的小数转为时分秒
   F*=24; this.h=int2(F); F-=this.h;
   F*=60; this.m=int2(F); F-=this.m;
   F*=60; this.s=F;
  },
  toStr:function(){ //日期转为串
   var Y="     "+this.Y,M="0"+this.M, D="0"+this.D;
   var h=this.h,m=this.m,s=int2(this.s+.5);
   if(s>=60) s-=60,m++;
   if(m>=60) m-=60,h++;
   h="0"+h; m="0"+m; s="0"+s;
   Y=Y.substr(Y.length-5,5); M=M.substr(M.length-2,2); D=D.substr(D.length-2,2);
   h=h.substr(h.length-2,2); m=m.substr(m.length-2,2); s=s.substr(s.length-2,2);
   return Y+"-"+M+"-"+D+" "+h+":"+m+":"+s;
  },
  setFromJD_str:function(jd){ this.setFromJD(jd); return this.toStr(); },
  timeStr:function(jd){ //提取jd中的时间(去除日期)
   var h,m,s;
   jd+=0.5; jd = (jd - int2(jd));
   jd*=24; h = int2(jd); jd-=h;
   jd*=60; m = int2(jd); jd-=m;
   jd*=60; s = int2(jd+0.5);
   if(s>=60) s-=60,m++;
   if(m>=60) m-=60,h++;
   h="0"+h; m="0"+m; s="0"+s;
   return h.substr(h.length-2,2)+':'+m.substr(m.length-2,2)+':'+s.substr(s.length-2,2);
  }
};

var ZB={ //坐标类
 llrConv:function(JW,E){ //球面坐标旋转
  //黄道赤道坐标变换,赤到黄E取负
  var sinE =Math.sin(E),    cosE =Math.cos(E);
  var sinJ =Math.sin(JW[0]),cosJ =Math.cos(JW[0]);
  var sinW =Math.sin(JW[1]),cosW =Math.cos(JW[1]), tanW=Math.tan(JW[1]);
  JW[0]=Math.atan2( sinJ*cosE - tanW*sinE, cosJ );
  JW[1]=Math.asin ( cosE*sinW + sinE*cosW*sinJ  );
  JW[0]=rad2mrad(JW[0]);
 },
 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),
 nutation:function(t){ //章动计算,t是世纪数
  var i,c,a, t2=t*t, B=this.nutB, dL=0,dE=0;
  for(i=0;i<B.length;i+=5){
   c = B[i]+B[i+1]*t+B[i+2]*t2;
   if(i==0) a=-1.742*t; else a=0;
   dL+=(B[i+3]+a)*Math.sin(c);
   dE+= B[i+4]   *Math.cos(c);
  }
  this.dL=dL/100/rad;  //黄经章动
  this.dE=dE/100/rad;  //交角章动
 },
 nutationLon:function(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;
 },
 hcjj:function(t){ //返回黄赤交角,t是世纪数
  var t2=t*t, t3=t2*t,t4=t3*t;
  return (84381.4088 -46.836051*t -0.0001667*t2 -0.00199911*t3-0.000000523*t4)/rad;
 },
 gst:function(T,dt){ //传入T是2000年首起算的日数(UT),dt是deltatT(日),精度要求不高时dt可取值为0
  //返回格林尼治恒星时(不含赤经章动及非多项式部分),即格林尼治子午圈的平春风点起算的赤经
  var t=(T+dt)/36525,t2=t*t, t3=t2*t, t4=t3*t;
  return pi2*(0.7790572732640 + 1.00273781191135448*T) //严格说这里的T是UT,下一行的t是力学时(世纪数)
      + (0.014506 + 4612.15739966*t + 1.39667721*t2 - 0.00009344*t3 + 0.00001882*t4)/rad;
 },
 gxc_sunLon:function(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; //黄经光行差
 },
 gxc_sunLat:function(t) { return 0;       }, //黄纬光行差
 gxc_moonLon:function(t){ return -3.4E-6; }, //月球经度光行差,误差0.07"
 gxc_moonLat:function(t){ //月球纬度光行差,误差0.006"
  return 0.063*Math.sin(0.057+8433.4662*t+0.000064*t*t)/rad;
 },
 AR:function(ho){ return -0.0002909/Math.tan( ho+0.002227/(ho+0.07679) ); }, //大气折射,ho是视高度
 AR2:function(h){ return  0.0002967/Math.tan( h +0.003138/( h+0.08919) ); }, //大气折射,h是真高度
 parallax:function(z,H,fa,high){ //视差修正
  //z赤道坐标,fa地理纬度,H时角,high海拔(千米)
  var sinP = 8.794/rad/z[2]; //赤道地平视差,z[2]应以AU为单位
  var ba   = 0.99664719;
  var u    = Math.atan(ba*Math.tan(fa));
  var sinD = -sinP*(Math.sin(u)*ba+ high*Math.sin(fa)/6378.14);
  var cosD = -sinP*(Math.cos(u)   + high*Math.cos(fa)/6378.14);

  var sinH = Math.sin(H),    cosH = Math.cos(H);
  var sinW = Math.sin(z[1]), cosW = Math.cos(z[1]);
  var a = Math.atan( cosD*sinH / (cosW+cosD*cosH) );
  z[1]  = Math.atan( (sinW+sinD) / (cosW+cosD*cosH) * Math.cos(a) );
  z[0]  = rad2mrad( z[0]+a );
 }
};

var XL={ //星历类
//==========================

EL:new Array(//以下是地球黄经数据,最大误差0.25"
new Array(//EL0
33416565,4.6692568,6283.07584999,
348943,4.626102,12566.1517,34971,2.74412,5753.38488,34176,2.82887,3.52312,31359,3.62767,77713.77147,
26762,4.41808,7860.41939,23427,6.13516,3930.2097,13243,0.74246,11506.76977,12732,2.0371,529.69097,
11992,1.10963,1577.34354,9903,5.2327,5884.9268,9019,2.0451,26.2983,8572,3.5085,398.149,
7798,1.1788,5223.6939,7531,2.5334,5507.5532,5053,4.5829,18849.2275,4924,4.2051,775.5226,
3567,2.9195,0.0673,3171,5.849,11790.6291,2841,1.8987,796.298,2710,0.3149,10977.0788,
2428,0.3448,5486.7778,2062,4.8065,2544.3144,2054,1.8695,5573.1428,2023,2.4577,6069.7768,
1555,0.8331,213.2991,1322,3.4112,2942.4634,1262,1.083,20.7754,1151,0.6454,0.9803,
1029,0.636,4694.003,1019,0.9757,15720.8388,1017,4.2668,7.1135,992,6.21,2146.165,
976,0.681,155.42,858,5.983,161000.686,851,1.299,6275.962,847,3.671,71430.696,
796,1.808,17260.155,788,3.037,12036.461,747,1.755,5088.629,739,3.503,3154.687,
735,4.679,801.821,696,0.833,9437.763,624,3.978,8827.39,611,1.818,7084.897,
570,2.784,6286.599,561,4.387,14143.495,556,3.47,6279.553,520,0.189,12139.554,
516,1.333,1748.016,511,0.283,5856.478,490,0.487,1194.447,410,5.368,8429.241,
409,2.399,19651.048,392,6.168,10447.388,368,6.041,10213.286,366,2.57,1059.382,
360,1.709,2352.866,356,1.776,6812.767,333,0.593,17789.846,304,0.443,83996.847,
300,2.74,1349.867,254,3.165,4690.48,247,0.215,3.59,237,0.485,8031.092,
236,2.065,3340.612,228,5.222,4705.732,219,5.556,553.569,214,1.426,16730.464,
211,4.148,951.718,203,0.371,283.859,199,5.222,12168.003,199,5.775,6309.374,
191,3.822,23581.258,189,5.386,149854.4,179,2.215,13367.973,175,4.561,135.065,
162,5.988,11769.854,151,4.196,6256.778,144,4.193,242.729,143,3.724,38.028,
140,4.401,6681.225,136,1.889,7632.943,125,1.131,5.523,121,2.622,955.6,
120,1.004,632.784,113,0.177,4164.312,108,0.327,103.093,105,0.939,11926.254,
105,5.359,1592.596,103,6.2,6438.496,100,6.029,5746.271,98,1,11371.7,
98,5.24,27511.47,94,2.62,5760.5,92,0.48,522.58,92,4.57,4292.33,
90,5.34,6386.17,86,4.17,7058.6,84,3.3,7234.79,84,4.54,25132.3,
81,6.11,4732.03,81,6.27,426.6,80,5.82,28.45,79,1,5643.18,
78,2.96,23013.54,77,3.12,7238.68,76,3.97,11499.66,73,4.39,316.39,
73,0.61,11513.88,72,4,74.78,71,0.32,263.08,68,5.91,90955.55,
66,3.66,17298.18,65,5.79,18073.7,63,4.72,6836.65,62,1.46,233141.31,
61,1.07,19804.83,60,3.32,6283.01,60,2.88,6283.14,55,2.45,12352.85),
new Array(//EL1
2060589,2.6782346,6283.07585,43034,2.63513,12566.1517,4253,1.5905,3.5231,1193,5.7956,26.2983,
1090,2.9662,1577.3435,935,2.592,18849.228,721,1.138,529.691,678,1.875,398.149,
673,4.409,5507.553,590,2.888,5223.694,560,2.175,155.42,454,0.398,796.298,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -