// 算出:jd转到当地UTC后,UTC日数的整数部分或小数部分
// 基于J2000力学时jd的起算点是12:00:00时,所以跳日时刻发生在12:00:00,这与日历计算发生矛盾
// 把jd改正为00:00:00起算,这样儒略日的跳日动作就与日期的跳日同步 // 改正方法为jd=jd+0.5-deltatT+shiqu/24 // 把儒略日的起点移动-0.5(即前移12小时)
// 式中shiqu是时区,北京的起算点是-8小时,shiqu取8 public double Dint_dec(double jd, int shiqu, boolean dec) { double u = jd + 0.5 - this.deltatT2(jd) + shiqu / 24; if (dec)
return Math.floor(u); // 返回整数部分 else
return u - Math.floor(u); // 返回小数部分 }
// 计算两个日期的相差的天数,输入字串格式日期,如:\ double d1_d2(String d1, String d2) {
double Y = this.Y, M = this.M, D = this.D, h = this.h, m = this.m, s = this.s; // 备份原来的数据
this.setFromStr(d1.substring(0, 8) + \ double jd1 = this.toJD(false);
this.setFromStr(d2.substring(0, 8) + \ double jd2 = this.toJD(false); this.Y = Y; this.M = M; this.D = D; this.h = h; this.m = m; this.s = s; // 还原 if (jd1 > jd2)
return Math.floor(jd1 - jd2 + .0001); else
return -Math.floor(jd2 - jd1 + .0001); }
// 返回黄赤交角(常规精度),短期精度很高 public static double hcjj1(double t) {
double t1 = t / 36525; double t2 = t1 * t1; double t3 = t2 * t1;
return (hcjjB[0] + hcjjB[1] * t1 + hcjjB[2] * t2 + hcjjB[3] * t3) / rad; }
// 黄赤转换(黄赤坐标旋转)
public static void HCconv(double[] JW, double E) { // 黄道赤道坐标变换,赤到黄E取负
double HJ = rad2mrad(JW[0]), HW = JW[1]; double sinE = Math.sin(E), cosE = Math.cos(E);
double sinW = cosE * Math.sin(HW) + sinE * Math.cos(HW) * Math.sin(HJ); double J = Math.atan2(Math.sin(HJ) * cosE - Math.tan(HW) * sinE, Math .cos(HJ));
JW[0] = rad2mrad(J); JW[1] = Math.asin(sinW); } // 补岁差
public static void addPrece(double jd, double[] zb) { int i;
double t = 1, v = 0, t1 = jd / 365250; for (i = 1; i < 8; i++) { t *= t1;
v += preceB[i] * t; }
zb[0] = rad2mrad(zb[0] + (v + 2.9965 * t1) / rad); }
// ===============光行差==================
private static final double GXC_e[] = { 0.016708634, -0.000042037, -0.0000001267 }; // 离心率
private static final double GXC_p[] = { 102.93735 / RAD, 1.71946 / RAD, 0.00046 / RAD }; // 近点
private static final double GXC_l[] = { 280.4664567 / RAD,
36000.76982779 / RAD, 0.0003032028 / RAD, 1 / 49931000 / RAD, -1 / 153000000 / RAD }; // 太平黄经
private static final double GXC_k = 20.49552 / rad; // 光行差常数
// 恒星周年光行差计算(黄道坐标中)
public static void addGxc(double t, double[] zb) { double t1 = t / 36525; double t2 = t1 * t1; double t3 = t2 * t1; double t4 = t3 * t1;
double L = GXC_l[0] + GXC_l[1] * t1 + GXC_l[2] * t2 + GXC_l[3] * t3 + GXC_l[4] * t4;
double p = GXC_p[0] + GXC_p[1] * t1 + GXC_p[2] * t2; double e = GXC_e[0] + GXC_e[1] * t1 + GXC_e[2] * t2; double dL = L - zb[0], dP = p - zb[0];
zb[0] -= GXC_k * (Math.cos(dL) - e * Math.cos(dP)) / Math.cos(zb[1]); zb[1] -= GXC_k * Math.sin(zb[1]) * (Math.sin(dL) - e * Math.sin(dP)); zb[0] = rad2mrad(zb[0]); }
// ===============章动计算================== private static final double nutB[] = {// 章动表
2.1824391966, -33.757045954, 0.0000362262, 3.7340E-08, -2.8793E-10, -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738, 0.0000105845, 6.9813E-10, -2.2815E-10, -13187, -16, 5736, -31, 1.3375032491, 16799.418221925, -0.0000511866, 6.4626E-08, -5.3543E-10, -2274, -2, 977, -5, 4.3648783932, -67.514091907, 0.0000724525, 7.4681E-08, -5.7586E-10, 2062, 2, -895, 5,
0.0431251803, -628.301955171, 0.0000026820, 6.5935E-10, 5.5705E-11, -1426, 34, 54, -1, 2.3555557435, 8328.691425719, 0.0001545547, 2.5033E-07, -1.1863E-09, 712, 1, -7, 0, 3.4638155059,
1884.965885909, 0.0000079025, 3.8785E-11, -2.8386E-10, -517, 12, 224, -6, 5.4382493597, 16833.175267879, -0.0000874129, 2.7285E-08, -2.4750E-10, -386, -4, 200, 0, 3.6930589926, 25128.109647645, 0.0001033681, 3.1496E-07, -1.7218E-09, -301, 0, 129, -1,
3.5500658664, 628.361975567, 0.0000132664, 1.3575E-09, -1.7245E-10, 217, -5, -95, 3 }; public static class ZD { public double Lon;
public double Obl; }
// 计算黄经章动及交角章动 public static ZD nutation(double t) { ZD d = new ZD(); d.Lon = 0; d.Obl = 0; t /= 36525;
double c, t1 = t, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;// t5=t4*t1; for (int i = 0; i < nutB.length; i += 9) {
c = nutB[i] + nutB[i + 1] * t1 + nutB[i + 2] * t2 + nutB[i + 3] * t3 + nutB[i + 4] * t4;
d.Lon += (nutB[i + 5] + nutB[i + 6] * t / 10) * Math.sin(c); // 黄经章动 d.Obl += (nutB[i + 7] + nutB[i + 8] * t / 10) * Math.cos(c); // 交角章动 }
d.Lon /= rad * 10000; // 黄经章动 d.Obl /= rad * 10000; // 交角章动 return d; }
// 本函数计算赤经章动及赤纬章动
public static void nutationRaDec(double t, double[] zb) { double Ra = zb[0], Dec = zb[1];
double E = hcjj1(t), sinE = Math.sin(E), cosE = Math.cos(E); // 计算黄赤交角 ZD d = nutation(t); // 计算黄经章动及交角章动 double cosRa = Math.cos(Ra), sinRa = Math.sin(Ra); double tanDec = Math.tan(Dec);
zb[0] += (cosE + sinE * sinRa * tanDec) * d.Lon - cosRa * tanDec * d.Obl; // 赤经章动
zb[1] += sinE * cosRa * d.Lon + sinRa * d.Obl; // 赤纬章动 zb[0] = rad2mrad(zb[0]); }
//=================以下是月球及地球运动参数表=================== /***************************************
* 如果用记事本查看此代码,请在\格式\菜单中去除\自动换行\ * E10是关于地球的,格式如下:
* 它是一个数组,每3个数看作一条记录,每条记录的3个数记为A,B,C * rec=A*cos(B+C*t); 式中t是J2000起算的儒略千年数
* 每条记录的计算结果(即rec)取和即得地球的日心黄经的周期量L0 * E11格式如下: rec = A*cos*(B+C*t) *t, 取和后得泊松量L1 * E12格式如下: rec = A*cos*(B+C*t) *t*t, 取和后得泊松量L2 * E13格式如下: rec = A*cos*(B+C*t) *t*t*t, 取和后得泊松量L3 * 最后地球的地心黄经:L = L0+L1+L2+L3+... * E20,E21,E22,E23...用于计算黄纬
* M10,M11等是关于月球的,参数的用法请阅读Mnn()函数 *****************************************/ //地球运动VSOP87参数
private static final double E10[] = { //黄经周期项
1.75347045673, 0.00000000000, 0.0000000000, 0.03341656456, 4.66925680417, 6283.0758499914, 0.00034894275, 4.62610241759, 12566.1516999828, 0.00003417571, 2.82886579606, 3.5231183490,
0.00003497056, 2.74411800971, 5753.3848848968, 0.00003135896, 3.62767041758, 77713.7714681205, 0.00002676218,
4.41808351397, 7860.4193924392, 0.00002342687, 6.13516237631, 3930.2096962196,
0.00001273166, 2.03709655772, 529.6909650946, 0.00001324292, 0.74246356352, 11506.7697697936, 0.00000901855,
2.04505443513, 26.2983197998, 0.00001199167, 1.10962944315, 1577.3435424478, 0.00000857223, 3.50849156957, 398.1490034082, 0.00000779786, 1.17882652114, 5223.6939198022, 0.00000990250, 5.23268129594, 5884.9268465832, 0.00000753141, 2.53339053818, 5507.5532386674,
0.00000505264, 4.58292563052, 18849.2275499742, 0.00000492379, 4.20506639861, 775.5226113240, 0.00000356655,
2.91954116867, 0.0673103028, 0.00000284125, 1.89869034186, 796.2980068164, 0.00000242810, 0.34481140906, 5486.7778431750, 0.00000317087, 5.84901952218, 11790.6290886588, 0.00000271039, 0.31488607649,
10977.0788046990, 0.00000206160, 4.80646606059, 2544.3144198834, 0.00000205385, 1.86947813692, 5573.1428014331, 0.00000202261,