You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
flutter_custom_calendar/lib/utils/solar_term_util.dart

2213 lines
46 KiB

import 'dart:core';
import 'dart:math';
import 'package:flutter_custom_calendar/utils/math_util.dart';
class SolarTermUtil {
/// 24节气
static List<String> SOLAR_TERMS = [
"春分",
"清明",
"谷雨",
"立夏",
"小满",
"芒种",
"夏至",
"小暑",
"大暑",
"立秋",
"处暑",
"白露",
"秋分",
"寒露",
"霜降",
"立冬",
"小雪",
"大雪",
"冬至",
"小寒",
"大寒",
"立春",
"雨水",
"惊蛰",
];
/// 每弧度的角秒数
static final double SECOND_PER_RAD = 180 * 3600 / pi;
/// 每弧度的角度数
static final double ANGLE_PER_RAD = 180 / pi;
/// 日历计算
/// * 2000年前儒略日数(2000-1-1)
static final double J2000 = 2451545;
/// 黄赤交角系数表
static final List<double> H_C_ANGLE_TABLE = [
0,
50287.92262,
111.24406,
0.07699,
-0.23479,
-0.00178,
0.00018,
0.00001
];
/// 世界时与原子时之差计算表
static final List<double> DTS = [
-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,
64.7,
-1.66,
5.224,
-0.2905,
2150,
279.4,
732.95,
429.579,
0.0158,
6000
];
/**
* 离心率
*/
static final List<double> GXC_E = [0.016708634, -0.000042037, -0.0000001267];
/**
* 近点
*/
static final List<double> GXC_P = [
102.93735 / ANGLE_PER_RAD,
1.71946 / ANGLE_PER_RAD,
0.00046 / ANGLE_PER_RAD
];
/**
* 太平黄经
*/
static final List<double> GXC_L = [
280.4664567 / ANGLE_PER_RAD,
36000.76982779 / ANGLE_PER_RAD,
0.0003032028 / ANGLE_PER_RAD,
1 / 49931000 / ANGLE_PER_RAD,
-1 / 153000000 / ANGLE_PER_RAD
];
/**
* 光行差常数
*/
static final double GXC_K = 20.49552 / SECOND_PER_RAD;
/**
* 向下取整
*
* @param v v
* @return 取整数部分
*/
static double doubleFloor(double v) {
v = v.floor().toDouble();
if (v < 0) return v + 1;
return v;
}
/**
* 对超过0-2PI的角度转为0-2PI
*
* @param v v
* @return 对超过0-2PI的角度转为0-2PI
*/
static double rad2mrad(double v) {
v = v % (2 * pi);
if (v < 0) return v + 2 * pi;
return v;
}
/**
* 计算世界时与原子时之差,传入年
*
* @param year 年
* @return 计算世界时与原子时之差
*/
static double worldTimeDiff(double year) {
int i;
for (i = 0; i < 100; i += 5) if (year < DTS[i + 5] || i == 95) break;
double t1 = (year - DTS[i]) / (DTS[i + 5] - DTS[i]) * 10;
double t2 = t1 * t1;
double t3 = t2 * t1;
return DTS[i + 1] + DTS[i + 2] * t1 + DTS[i + 3] * t2 + DTS[i + 4] * t3;
}
/**
* 传入儒略日(J2000起算),计算UTC与原子时的差(单位:日)
*
* @param julian 儒略日
* @return 计算UTC与原子时的差
*/
static double atomTimeDiff(double julian) {
return worldTimeDiff(julian / 365.2425 + 2000) / 86400.0;
}
/**
* 公历转儒略日,UTC=1表示原日期是UTC
*
* @param UTC UTC
* @return 公历转儒略日, UTC=1表示原日期是UTC
*/
static double toJulian(Time time, bool UTC) {
double y = time.year; // 取出年月
double m = time.month;
double n = 0;
if (m <= 2) {
m += 12;
y--;
}
if (time.year * 372 + time.month * 31 + time.day >= 588829) {
// 判断是否为格里高利历日1582*372+10*31+15
n = doubleFloor(y / 100);
n = 2 - n + doubleFloor(n / 4); // 加百年闰
}
n += doubleFloor(365.2500001 * (y + 4716)); // 加上年引起的偏移日数
n += doubleFloor(30.6 * (m + 1)) + time.day; // 加上月引起的偏移日数及日偏移数
n += ((time.second / 60 + time.minute) / 60 + time.hour) / 24 - 1524.5;
if (UTC) return n + atomTimeDiff(n - J2000);
return n;
}
/**
* 儒略日数转公历,UTC=1表示目标公历是UTC
*
* @param jd jd
* @param UTC UTC
*/
static Time setFromJulian(double jd, bool UTC) {
Time time = new Time();
if (UTC) jd -= atomTimeDiff(jd - J2000);
jd += 0.5;
// 取得日数的整数部份A及小数部分F
double A = doubleFloor(jd);
double F = jd - A;
double D;
if (A > 2299161) {
D = doubleFloor((A - 1867216.25) / 36524.25);
A += 1 + D - doubleFloor(D / 4);
}
A += 1524; // 向前移4年零2个月
time.year = doubleFloor((A - 122.1) / 365.25); // 年
D = A - doubleFloor(365.25 * time.year); // 去除整年日数后余下日数
time.month = doubleFloor(D / 30.6001); // 月数
time.day = D - doubleFloor(time.month * 30.6001); // 去除整月日数后余下日数
time.year -= 4716;
time.month--;
if (time.month > 12) time.month -= 12;
if (time.month <= 2) time.year++;
// 日的小数转为时分秒
F *= 24;
time.hour = doubleFloor(F);
F -= time.hour;
F *= 60;
time.minute = doubleFloor(F);
F -= time.minute;
F *= 60;
time.second = F;
return time;
}
/**
* 补岁差
*
* @param jd jd
* @param zb zb
*/
static void precession(double jd, List<double?> zb) {
int i;
double t = 1, v = 0, t1 = jd / 365250;
for (i = 1; i < 8; i++) {
t *= t1;
v += H_C_ANGLE_TABLE[i] * t;
}
zb[0] = rad2mrad(zb[0]! + (v + 2.9965 * t1) / SECOND_PER_RAD);
}
/**
* 恒星周年光行差计算(黄道坐标中)
*
* @param t t
* @param zb zb
*/
static void addGxc(double t, List<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 * (cos(dL) - e * cos(dP)) / cos(zb[1]);
zb[1] -= GXC_K * sin(zb[1]) * (sin(dL) - e * sin(dP));
zb[0] = rad2mrad(zb[0]);
}
/**
* 章动计算
*/
static final List<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
];
/**
* 计算黄经章动及交角章动
*
* @param t t
* @return 计算黄经章动及交角章动
*/
static Nutation nutation(double t) {
Nutation d = new Nutation();
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) * sin(c); // 黄经章动
d.Obl += (nutB[i + 7] + nutB[i + 8] * t / 10) * cos(c); // 交角章动
}
d.Lon /= SECOND_PER_RAD * 10000; // 黄经章动
d.Obl /= SECOND_PER_RAD * 10000; // 交角章动
return d;
}
/***************************************
* 如果用记事本查看此代码,请在"格式"菜单中去除"自动换行"
* 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参数
static final List<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,
2.45767795458,
6069.7767545534,
0.00000126184,
1.08302630210,
20.7753954924,
0.00000155516,
0.83306073807,
213.2990954380,
0.00000115132,
0.64544911683,
0.9803210682,
0.00000102851,
0.63599846727,
4694.0029547076,
0.00000101724,
4.26679821365,
7.1135470008,
0.00000099206,
6.20992940258,
2146.1654164752,
0.00000132212,
3.41118275555,
2942.4634232916,
0.00000097607,
0.68101272270,
155.4203994342,
0.00000085128,
1.29870743025,
6275.9623029906,
0.00000074651,
1.75508916159,
5088.6288397668,
0.00000101895,
0.97569221824,
15720.8387848784,
0.00000084711,
3.67080093025,
71430.6956181291,
0.00000073547,
4.67926565481,
801.8209311238,
0.00000073874,
3.50319443167,
3154.6870848956,
0.00000078756,
3.03698313141,
12036.4607348882,
0.00000079637,
1.80791330700,
17260.1546546904,
0.00000085803,
5.98322631256,
161000.6857376741,
0.00000056963,
2.78430398043,
6286.5989683404,
0.00000061148,
1.81839811024,
7084.8967811152,
0.00000069627,
0.83297596966,
9437.7629348870,
0.00000056116,
4.38694880779,
14143.4952424306,
0.00000062449,
3.97763880587,
8827.3902698748,
0.00000051145,
0.28306864501,
5856.4776591154,
0.00000055577,
3.47006009062,
6279.5527316424,
0.00000041036,
5.36817351402,
8429.2412664666,
0.00000051605,
1.33282746983,
1748.0164130670,
0.00000051992,
0.18914945834,
12139.5535091068,
0.00000049000,
0.48735065033,
1194.4470102246,
0.00000039200,
6.16832995016,
10447.3878396044,
0.00000035566,
1.77597314691,
6812.7668150860,
0.00000036770,
6.04133859347,
10213.2855462110,
0.00000036596,
2.56955238628,
1059.3819301892,
0.00000033291,
0.59309499459,
17789.8456197850,
0.00000035954,
1.70876111898,
2352.8661537718
];
static final List<double> E11 = [
//黄经泊松1项
6283.31966747491,
0.00000000000,
0.0000000000,
0.00206058863,
2.67823455584,
6283.0758499914,
0.00004303430,
2.63512650414,
12566.1516999828,
0.00000425264,
1.59046980729,
3.5231183490,
0.00000108977,
2.96618001993,
1577.3435424478,
0.00000093478,
2.59212835365,
18849.2275499742,
0.00000119261,
5.79557487799,
26.2983197998,
0.00000072122,
1.13846158196,
529.6909650946,
0.00000067768,
1.87472304791,
398.1490034082,
0.00000067327,
4.40918235168,
5507.5532386674,
0.00000059027,
2.88797038460,
5223.6939198022,
0.00000055976,
2.17471680261,
155.4203994342,
0.00000045407,
0.39803079805,
796.2980068164,
0.00000036369,
0.46624739835,
775.5226113240,
0.00000028958,
2.64707383882,
7.1135470008,
0.00000019097,
1.84628332577,
5486.7778431750,
0.00000020844,
5.34138275149,
0.9803210682,
0.00000018508,
4.96855124577,
213.2990954380,
0.00000016233,
0.03216483047,
2544.3144198834,
0.00000017293,
2.99116864949,
6275.9623029906
];
static final List<double> E12 = [
//黄经泊松2项
0.00052918870,
0.00000000000,
0.0000000000,
0.00008719837,
1.07209665242,
6283.0758499914,
0.00000309125,
0.86728818832,
12566.1516999828,
0.00000027339,
0.05297871691,
3.5231183490,
0.00000016334,
5.18826691036,
26.2983197998,
0.00000015752,
3.68457889430,
155.4203994342,
0.00000009541,
0.75742297675,
18849.2275499742,
0.00000008937,
2.05705419118,
77713.7714681205,
0.00000006952,
0.82673305410,
775.5226113240,
0.00000005064,
4.66284525271,
1577.3435424478
];
static final List<double> E13 = [
0.00000289226,
5.84384198723,
6283.0758499914,
0.00000034955,
0.00000000000,
0.0000000000,
0.00000016819,
5.48766912348,
12566.1516999828
];
static final List<double> E14 = [
0.00000114084,
3.14159265359,
0.0000000000,
0.00000007717,
4.13446589358,
6283.0758499914,
0.00000000765,
3.83803776214,
12566.1516999828
];
static final List<double> E15 = [0.00000000878, 3.14159265359, 0.0000000000];
static final List<double> E20 = [
//黄纬周期项
0.00000279620,
3.19870156017,
84334.6615813083,
0.00000101643,
5.42248619256,
5507.5532386674,
0.00000080445,
3.88013204458,
5223.6939198022,
0.00000043806,
3.70444689758,
2352.8661537718,
0.00000031933,
4.00026369781,
1577.3435424478,
0.00000022724,
3.98473831560,
1047.7473117547,
0.00000016392,
3.56456119782,
5856.4776591154,
0.00000018141,
4.98367470263,
6283.0758499914,
0.00000014443,
3.70275614914,
9437.7629348870,
0.00000014304,
3.41117857525,
10213.2855462110
];
static final List<double> E21 = [
0.00000009030,
3.89729061890,
5507.5532386674,
0.00000006177,
1.73038850355,
5223.6939198022
];
static final List<double> E30 = [
//距离周期项
1.00013988799,
0.00000000000,
0.0000000000,
0.01670699626,
3.09846350771,
6283.0758499914,
0.00013956023,
3.05524609620,
12566.1516999828,
0.00003083720,
5.19846674381,
77713.7714681205,
0.00001628461,
1.17387749012,
5753.3848848968,
0.00001575568,
2.84685245825,
7860.4193924392,
0.00000924799,
5.45292234084,
11506.7697697936,
0.00000542444,
4.56409149777,
3930.2096962196
];
static final List<double> E31 = [
0.00103018608,
1.10748969588,
6283.0758499914,
0.00001721238,
1.06442301418,
12566.1516999828,
0.00000702215,
3.14159265359,
0.0000000000
];
static final List<double> E32 = [
0.00004359385,
5.78455133738,
6283.0758499914
];
static final List<double> E33 = [
0.00000144595,
4.27319435148,
6283.0758499914
];
//月球运动参数
static final List<double> M10 = [
22639.5858800,
2.3555545723,
8328.6914247251,
1.5231275E-04,
2.5041111E-07,
-1.1863391E-09,
4586.4383203,
8.0413790709,
7214.0628654588,
-2.1850087E-04,
-1.8646419E-07,
8.7760973E-10,
2369.9139357,
10.3969336431,
15542.7542901840,
-6.6188121E-05,
6.3946925E-08,
-3.0872935E-10,
769.0257187,
4.7111091445,
16657.3828494503,
3.0462550E-04,
5.0082223E-07,
-2.3726782E-09,
-666.4175399,
-0.0431256817,
628.3019552485,
-2.6638815E-06,
6.1639211E-10,
-5.4439728E-11,
-411.5957339,
3.2558104895,
16866.9323152810,
-1.2804259E-04,
-9.8998954E-09,
4.0433461E-11,
211.6555524,
5.6858244986,
-1114.6285592663,
-3.7081362E-04,
-4.3687530E-07,
2.0639488E-09,
205.4359530,
8.0845047526,
6585.7609102104,
-2.1583699E-04,
-1.8708058E-07,
9.3204945E-10,
191.9561973,
12.7524882154,
23871.4457149091,
8.6124629E-05,
3.1435804E-07,
-1.4950684E-09,
164.7286185,
10.4400593249,
14914.4523349355,
-6.3524240E-05,
6.3330532E-08,
-2.5428962E-10,
-147.3213842,
-2.3986802540,
-7700.3894694766,
-1.5497663E-04,
-2.4979472E-07,
1.1318993E-09,
-124.9881185,
5.1984668216,
7771.3771450920,
-3.3094061E-05,
3.1973462E-08,
-1.5436468E-10,
-109.3803637,
2.3124288905,
8956.9933799736,
1.4964887E-04,
2.5102751E-07,
-1.2407788E-09,
55.1770578,
7.1411231536,
-1324.1780250970,
6.1854469E-05,
7.3846820E-08,
-3.4916281E-10,
-45.0996092,
5.6113650618,
25195.6237400061,
2.4270161E-05,
2.4051122E-07,
-1.1459056E-09,
39.5333010,
-0.9002559173,
-8538.2408905558,
2.8035534E-04,
2.6031101E-07,
-1.2267725E-09,
38.4298346,
18.4383127140,
22756.8171556428,
-2.8468899E-04,
-1.2251727E-07,
5.6888037E-10,
36.1238141,
7.0666637168,
24986.0742741754,
4.5693825E-04,
7.5123334E-07,
-3.5590172E-09,
30.7725751,
16.0827581417,
14428.1257309177,
-4.3700174E-04,
-3.7292838E-07,
1.7552195E-09,
-28.3971008,
7.9982533891,
7842.3648207073,
-2.2116475E-04,
-1.8584780E-07,
8.2317000E-10,
-24.3582283,
10.3538079614,
16171.0562454324,
-6.8852003E-05,
6.4563317E-08,
-3.6316908E-10,
-18.5847068,
2.8429122493,
-557.3142796331,
-1.8540681E-04,
-2.1843765E-07,
1.0319744E-09,
17.9544674,
5.1553411398,
8399.6791003405,
-3.5757942E-05,
3.2589854E-08,
-2.0880440E-10,
14.5302779,
12.7956138971,
23243.1437596606,
8.8788511E-05,
3.1374165E-07,
-1.4406287E-09,
14.3796974,
15.1080427876,
32200.1371396342,
2.3843738E-04,
5.6476915E-07,
-2.6814075E-09,
14.2514576,
-24.0810366320,
-2.3011998397,
1.5231275E-04,
2.5041111E-07,
-1.1863391E-09,
13.8990596,
20.7938672862,
31085.5085803679,
-1.3237624E-04,
1.2789385E-07,
-6.1745870E-10,
13.1940636,
3.3302699264,
-9443.3199839914,
-5.2312637E-04,
-6.8728642E-07,
3.2502879E-09,
-9.6790568,
-4.7542348263,
-16029.0808942018,
-3.0728938E-04,
-5.0020584E-07,
2.3182384E-09,
-9.3658635,
11.2971895604,
24080.9951807398,
-3.4654346E-04,
-1.9636409E-07,
9.1804319E-10,
8.6055318,
5.7289501804,
-1742.9305145148,
-3.6814974E-04,
-4.3749170E-07,
2.1183885E-09,
-8.4530982,
7.5540213938,
16100.0685698171,
1.1921869E-04,
2.8238458E-07,
-1.3407038E-09,
8.0501724,
10.4831850066,
14286.1503796870,
-6.0860358E-05,
6.2714140E-08,
-1.9984990E-10,
-7.6301553,
4.6679834628,
17285.6848046987,
3.0196162E-04,
5.0143862E-07,
-2.4271179E-09,
-7.4474952,
-0.0862513635,
1256.6039104970,
-5.3277630E-06,
1.2327842E-09,
-1.0887946E-10,
7.3712011,
8.1276304344,
5957.4589549619,
-2.1317311E-04,
-1.8769697E-07,
9.8648918E-10,
7.0629900,
0.9591375719,
33.7570471374,
-3.0829302E-05,
-3.6967043E-08,
1.7385419E-10,
-6.3831491,
9.4966777258,
7004.5133996281,
2.1416722E-04,
3.2425793E-07,
-1.5355019E-09,
-5.7416071,
13.6527441326,
32409.6866054649,
-1.9423071E-04,
5.4047029E-08,
-2.6829589E-10,
4.3740095,
18.4814383957,
22128.5152003943,
-2.8202511E-04,
-1.2313366E-07,
6.2332010E-10,
-3.9976134,
7.9669196340,
33524.3151647312,
1.7658291E-04,
4.9092233E-07,
-2.3322447E-09,
-3.2096876,
13.2398458924,
14985.4400105508,
-2.5159493E-04,
-1.5449073E-07,
7.2324505E-10,
-2.9145404,
12.7093625336,
24499.7476701576,
8.3460748E-05,
3.1497443E-07,
-1.5495082E-09,
2.7318890,
16.1258838235,
13799.8237756692,
-4.3433786E-04,
-3.7354477E-07,
1.8096592E-09,
-2.5679459,
-2.4418059357,
-7072.0875142282,
-1.5764051E-04,
-2.4917833E-07,
1.0774596E-09,
-2.5211990,
7.9551277074,
8470.6667759558,
-2.2382863E-04,
-1.8523141E-07,
7.6873027E-10,
2.4888871,
5.6426988169,
-486.3266040178,
-3.7347750E-04,
-4.3625891E-07,
2.0095091E-09,
2.1460741,
7.1842488353,
-1952.4799803455,
6.4518350E-05,
7.3230428E-08,
-2.9472308E-10,
1.9777270,
23.1494218585,
39414.2000050930,
1.9936508E-05,
3.7830496E-07,
-1.8037978E-09,
1.9336825,
9.4222182890,
33314.7656989005,
6.0925100E-04,
1.0016445E-06,
-4.7453563E-09,
1.8707647,
20.8369929680,
30457.2066251194,
-1.2971236E-04,
1.2727746E-07,
-5.6301898E-10,
-1.7529659,
0.4873576771,
-8886.0057043583,
-3.3771956E-04,
-4.6884877E-07,
2.2183135E-09,
-1.4371624,
7.0979974718,
-695.8760698485,
5.9190587E-05,
7.4463212E-08,
-4.0360254E-10,
-1.3725701,
1.4552986550,
-209.5494658307,
4.3266809E-04,
5.1072212E-07,
-2.4131116E-09,
1.2618162,
7.5108957121,
16728.3705250656,
1.1655481E-04,
2.8300097E-07,
-1.3951435E-09
];
static final List<double> M11 = [
1.6768000,
-0.0431256817,
628.3019552485,
-2.6638815E-06,
6.1639211E-10,
-5.4439728E-11,
0.5164200,
11.2260974062,
6585.7609102104,
-2.1583699E-04,
-1.8708058E-07,
9.3204945E-10,
0.4138300,
13.5816519784,
14914.4523349355,
-6.3524240E-05,
6.3330532E-08,
-2.5428962E-10,
0.3711500,
5.5402729076,
7700.3894694766,
1.5497663E-04,
2.4979472E-07,
-1.1318993E-09,
0.2756000,
2.3124288905,
8956.9933799736,
1.4964887E-04,
2.5102751E-07,
-1.2407788E-09,
0.2459863,
-25.6198212459,
-2.3011998397,
1.5231275E-04,
2.5041111E-07,
-1.1863391E-09,
0.0711800,
7.9982533891,
7842.3648207073,
-2.2116475E-04,
-1.8584780E-07,
8.2317000E-10,
0.0612800,
10.3538079614,
16171.0562454324,
-6.8852003E-05,
6.4563317E-08,
-3.6316908E-10
];
static final List<double> M12 = [
0.0048700,
-0.0431256817,
628.3019552485,
-2.6638815E-06,
6.1639211E-10,
-5.4439728E-11,
0.0022800,
-27.1705318325,
-2.3011998397,
1.5231275E-04,
2.5041111E-07,
-1.1863391E-09,
0.0015000,
11.2260974062,
6585.7609102104,
-2.1583699E-04,
-1.8708058E-07,
9.3204945E-10
];
static final List<double> M20 = [
18461.2400600,
1.6279052448,
8433.4661576405,
-6.4021295E-05,
-4.9499477E-09,
2.0216731E-11,
1010.1671484,
3.9834598170,
16762.1575823656,
8.8291456E-05,
2.4546117E-07,
-1.1661223E-09,
999.6936555,
0.7276493275,
-104.7747329154,
2.1633405E-04,
2.5536106E-07,
-1.2065558E-09,
623.6524746,
8.7690283983,
7109.2881325435,
-2.1668263E-06,
6.8896872E-08,
-3.2894608E-10,
199.4837596,
9.6692843156,
15647.5290230993,
-2.8252217E-04,
-1.9141414E-07,
8.9782646E-10,
166.5741153,
6.4134738261,
-1219.4032921817,
-1.5447958E-04,
-1.8151424E-07,
8.5739300E-10,
117.2606951,
12.0248388879,
23976.2204478244,
-1.3020942E-04,
5.8996977E-08,
-2.8851262E-10,
61.9119504,
6.3390143893,
25090.8490070907,
2.4060421E-04,
4.9587228E-07,
-2.3524614E-09,
33.3572027,
11.1245829706,
15437.9795572686,
1.5014592E-04,
3.1930799E-07,
-1.5152852E-09,
31.7596709,
3.0832038997,
8223.9166918098,
3.6864680E-04,
5.0577218E-07,
-2.3928949E-09,
29.5766003,
8.8121540801,
6480.9861772950,
4.9705523E-07,
6.8280480E-08,
-2.7450635E-10,
15.5662654,
4.0579192538,
-9548.0947169068,
-3.0679233E-04,
-4.3192536E-07,
2.0437321E-09,
15.1215543,
14.3803934601,
32304.9118725496,
2.2103334E-05,
3.0940809E-07,
-1.4748517E-09,
-12.0941511,
8.7259027166,
7737.5900877920,
-4.8307078E-06,
6.9513264E-08,
-3.8338581E-10,
8.8681426,
9.7124099974,
15019.2270678508,
-2.7985829E-04,
-1.9203053E-07,
9.5226618E-10,
8.0450400,
0.6687636586,
8399.7091105030,
-3.3191993E-05,
3.2017096E-08,
-1.5363746E-10,
7.9585542,
12.0679645696,
23347.9184925760,
-1.2754553E-04,
5.8380585E-08,
-2.3407289E-10,
7.4345550,
6.4565995078,
-1847.7052474301,
-1.5181570E-04,
-1.8213063E-07,
9.1183272E-10,
-6.7314363,
-4.0265854988,
-16133.8556271171,
-9.0955337E-05,
-2.4484477E-07,
1.1116826E-09,
6.5795750,
16.8104074692,
14323.3509980023,
-2.2066770E-04,
-1.1756732E-07,
5.4866364E-10,
-6.4600721,
1.5847795630,
9061.7681128890,
-6.6685176E-05,
-4.3335556E-09,
-3.4222998E-11,
-6.2964773,
4.8837157343,
25300.3984729215,
-1.9206388E-04,
-1.4849843E-08,
6.0650192E-11,
-5.6323538,
-0.7707750092,
733.0766881638,
-2.1899793E-04,
-2.5474467E-07,
1.1521161E-09,
-5.3683961,
6.8263720663,
16204.8433027325,
-9.7115356E-05,
2.7023515E-08,
-1.3414795E-10,
-5.3112784,
3.9403341353,
17390.4595376141,
8.5627574E-05,
2.4607756E-07,
-1.2205621E-09,
-5.0759179,
0.6845236457,
523.5272223331,
2.1367016E-04,
2.5597745E-07,
-1.2609955E-09,
-4.8396143,
-1.6710309265,
-7805.1642023920,
6.1357413E-05,
5.5663398E-09,
-7.4656459E-11,
-4.8057401,
3.5705615768,
-662.0890125485,
3.0927234E-05,
3.6923410E-08,
-1.7458141E-10,
3.9840545,
8.6945689615,
33419.5404318159,
3.9291696E-04,
7.4628340E-07,
-3.5388005E-09,
3.6744619,
19.1659620415,
22652.0424227274,
-6.8354947E-05,
1.3284380E-07,
-6.3767543E-10,
2.9984815,
20.0662179587,
31190.2833132833,
-3.4871029E-04,
-1.2746721E-07,
5.8909710E-10,
2.7986413,
-2.5281611620,
-16971.7070481963,
3.4437664E-04,
2.6526096E-07,
-1.2469893E-09,
2.4138774,
17.7106633865,
22861.5918885581,
-5.0102304E-04,
-3.7787833E-07,
1.7754362E-09,
2.1863132,
5.5132179088,
-9757.6441827375,
1.2587576E-04,
7.8796768E-08,
-3.6937954E-10,
2.1461692,
13.4801375428,
23766.6709819937,
3.0245868E-04,
5.6971910E-07,
-2.7016242E-09,
1.7659832,
11.1677086523,
14809.6776020201,
1.5280981E-04,
3.1869159E-07,
-1.4608454E-09,
-1.6244212,
7.3137297434,
7318.8375983742,
-4.3483492E-04,
-4.4182525E-07,
2.0841655E-09,
1.5813036,
5.4387584720,
16552.6081165349,
5.2095955E-04,
7.5618329E-07,
-3.5792340E-09,
1.5197528,
16.7359480324,
40633.6032972747,
1.7441609E-04,
5.5981921E-07,
-2.6611908E-09,
1.5156341,
1.7023646816,
-17876.7861416319,
-4.5910508E-04,
-6.8233647E-07,
3.2300712E-09,
1.5102092,
5.4977296450,
8399.6847301375,
-3.3094061E-05,
3.1973462E-08,
-1.5436468E-10,
-1.3178223,
9.6261586339,
16275.8309783478,
-2.8518605E-04,
-1.9079775E-07,
8.4338673E-10,
-1.2642739,
11.9817132061,
24604.5224030729,
-1.3287330E-04,
5.9613369E-08,
-3.4295235E-10,
1.1918723,
22.4217725310,
39518.9747380084,
-1.9639754E-04,
1.2294390E-07,
-5.9724197E-10,
1.1346110,
14.4235191419,
31676.6099173011,
2.4767216E-05,
3.0879170E-07,
-1.4204120E-09,
1.0857810,
8.8552797618,
5852.6842220465,
3.1609367E-06,
6.7664088E-08,
-2.2006663E-10,
-1.0193852,
7.2392703065,
33629.0898976466,
-3.9751134E-05,
2.3556127E-07,
-1.1256889E-09,
-0.8227141,
11.0814572888,
16066.2815125171,
1.4748204E-04,
3.1992438E-07,
-1.5697249E-09,
0.8042238,
3.5274358950,
-33.7870573000,
2.8263353E-05,
3.7539802E-08,
-2.2902113E-10,
0.8025939,
6.7832463846,
16833.1452579809,
-9.9779237E-05,
2.7639907E-08,
-1.8858767E-10,
-0.7931866,
-6.3821400710,
-24462.5470518423,
-2.4326809E-04,
-4.9525589E-07,
2.2980217E-09,
-0.7910153,
6.3703481443,
-591.1013369332,
-1.5714346E-04,
-1.8089785E-07,
8.0295327E-10,
-0.6674056,
9.1819266386,
24533.5347274576,
5.5197395E-05,
2.7743463E-07,
-1.3204870E-09,
0.6502226,
4.1010449356,
-10176.3966721553,
-3.0412845E-04,
-4.3254175E-07,
2.0981718E-09,
-0.6388131,
6.2958887075,
25719.1509623392,
2.3794032E-04,
4.9648867E-07,
-2.4069012E-09
];
static final List<double> M21 = [
0.0743000,
11.9537467337,
6480.9861772950,
4.9705523E-07,
6.8280480E-08,
-2.7450635E-10,
0.0304300,
8.7259027166,
7737.5900877920,
-4.8307078E-06,
6.9513264E-08,
-3.8338581E-10,
0.0222900,
12.8540026510,
15019.2270678508,
-2.7985829E-04,
-1.9203053E-07,
9.5226618E-10,
0.0199900,
15.2095572232,
23347.9184925760,
-1.2754553E-04,
5.8380585E-08,
-2.3407289E-10,
0.0186900,
9.5981921614,
-1847.7052474301,
-1.5181570E-04,
-1.8213063E-07,
9.1183272E-10,
0.0169600,
7.1681781524,
16133.8556271171,
9.0955337E-05,
2.4484477E-07,
-1.1116826E-09,
0.0162300,
1.5847795630,
9061.7681128890,
-6.6685176E-05,
-4.3335556E-09,
-3.4222998E-11,
0.0141900,
-0.7707750092,
733.0766881638,
-2.1899793E-04,
-2.5474467E-07,
1.1521161E-09
];
static final List<double> M30 = [
385000.5290396,
1.5707963268,
0.0000000000,
0.0000000E+00,
0.0000000E+00,
0.0000000E+00,
-20905.3551378,
3.9263508990,
8328.6914247251,
1.5231275E-04,
2.5041111E-07,
-1.1863391E-09,
-3699.1109330,
9.6121753977,
7214.0628654588,
-2.1850087E-04,
-1.8646419E-07,
8.7760973E-10,
-2955.9675626,
11.9677299699,
15542.7542901840,
-6.6188121E-05,
6.3946925E-08,
-3.0872935E-10,
-569.9251264,
6.2819054713,
16657.3828494503,
3.0462550E-04,
5.0082223E-07,
-2.3726782E-09,
246.1584797,
7.2566208254,
-1114.6285592663,
-3.7081362E-04,
-4.3687530E-07,
2.0639488E-09,
-204.5861179,
12.0108556517,
14914.4523349355,
-6.3524240E-05,
6.3330532E-08,
-2.5428962E-10,
-170.7330791,
14.3232845422,
23871.4457149091,
8.6124629E-05,
3.1435804E-07,
-1.4950684E-09,
-152.1378118,
9.6553010794,
6585.7609102104,
-2.1583699E-04,
-1.8708058E-07,
9.3204945E-10,
-129.6202242,
-0.8278839272,
-7700.3894694766,
-1.5497663E-04,
-2.4979472E-07,
1.1318993E-09,
108.7427014,
6.7692631483,
7771.3771450920,
-3.3094061E-05,
3.1973462E-08,
-1.5436468E-10,
104.7552944,
3.8832252173,
8956.9933799736,
1.4964887E-04,
2.5102751E-07,
-1.2407788E-09,
79.6605685,
0.6705404095,
-8538.2408905558,
2.8035534E-04,
2.6031101E-07,
-1.2267725E-09,
48.8883284,
1.5276706450,
628.3019552485,
-2.6638815E-06,
6.1639211E-10,
-5.4439728E-11,
-34.7825237,
20.0091090408,
22756.8171556428,
-2.8468899E-04,
-1.2251727E-07,
5.6888037E-10,
30.8238599,
11.9246042882,
16171.0562454324,
-6.8852003E-05,
6.4563317E-08,
-3.6316908E-10,
24.2084985,
9.5690497159,
7842.3648207073,
-2.2116475E-04,
-1.8584780E-07,
8.2317000E-10,
-23.2104305,
8.6374600436,
24986.0742741754,
4.5693825E-04,
7.5123334E-07,
-3.5590172E-09,
-21.6363439,
17.6535544685,
14428.1257309177,
-4.3700174E-04,
-3.7292838E-07,
1.7552195E-09,
-16.6747239,
6.7261374666,
8399.6791003405,
-3.5757942E-05,
3.2589854E-08,
-2.0880440E-10,
14.4026890,
4.9010662531,
-9443.3199839914,
-5.2312637E-04,
-6.8728642E-07,
3.2502879E-09,
-12.8314035,
14.3664102239,
23243.1437596606,
8.8788511E-05,
3.1374165E-07,
-1.4406287E-09,
-11.6499478,
22.3646636130,
31085.5085803679,
-1.3237624E-04,
1.2789385E-07,
-6.1745870E-10,
-10.4447578,
16.6788391144,
32200.1371396342,
2.3843738E-04,
5.6476915E-07,
-2.6814075E-09,
10.3211071,
8.7119194804,
-1324.1780250970,
6.1854469E-05,
7.3846820E-08,
-3.4916281E-10,
10.0562033,
7.2997465071,
-1742.9305145148,
-3.6814974E-04,
-4.3749170E-07,
2.1183885E-09,
-9.8844667,
12.0539813334,
14286.1503796870,
-6.0860358E-05,
6.2714140E-08,
-1.9984990E-10,
8.7515625,
6.3563649081,
-9652.8694498221,
-9.0458282E-05,
-1.7656429E-07,
8.3717626E-10,
-8.3791067,
4.4137085761,
-557.3142796331,
-1.8540681E-04,
-2.1843765E-07,
1.0319744E-09,
-7.0026961,
-3.1834384995,
-16029.0808942018,
-3.0728938E-04,
-5.0020584E-07,
2.3182384E-09,
6.3220032,
9.1248177206,
16100.0685698171,
1.1921869E-04,
2.8238458E-07,
-1.3407038E-09,
5.7508579,
6.2387797896,
17285.6848046987,
3.0196162E-04,
5.0143862E-07,
-2.4271179E-09,
-4.9501349,
9.6984267611,
5957.4589549619,
-2.1317311E-04,
-1.8769697E-07,
9.8648918E-10,
-4.4211770,
3.0260949818,
-209.5494658307,
4.3266809E-04,
5.1072212E-07,
-2.4131116E-09,
4.1311145,
11.0674740526,
7004.5133996281,
2.1416722E-04,
3.2425793E-07,
-1.5355019E-09,
-3.9579827,
20.0522347225,
22128.5152003943,
-2.8202511E-04,
-1.2313366E-07,
6.2332010E-10,
3.2582371,
14.8106422192,
14985.4400105508,
-2.5159493E-04,
-1.5449073E-07,
7.2324505E-10,
-3.1483020,
4.8266068163,
16866.9323152810,
-1.2804259E-04,
-9.8998954E-09,
4.0433461E-11,
2.6164092,
14.2801588604,
24499.7476701576,
8.3460748E-05,
3.1497443E-07,
-1.5495082E-09,
2.3536310,
9.5259240342,
8470.6667759558,
-2.2382863E-04,
-1.8523141E-07,
7.6873027E-10,
-2.1171283,
-0.8710096090,
-7072.0875142282,
-1.5764051E-04,
-2.4917833E-07,
1.0774596E-09,
-1.8970368,
17.6966801503,
13799.8237756692,
-4.3433786E-04,
-3.7354477E-07,
1.8096592E-09,
-1.7385258,
2.0581540038,
-8886.0057043583,
-3.3771956E-04,
-4.6884877E-07,
2.2183135E-09,
-1.5713944,
22.4077892948,
30457.2066251194,
-1.2971236E-04,
1.2727746E-07,
-5.6301898E-10,
-1.4225541,
24.7202181853,
39414.2000050930,
1.9936508E-05,
3.7830496E-07,
-1.8037978E-09,
-1.4189284,
17.1661967915,
23314.1314352759,
-9.9282182E-05,
9.5920387E-08,
-4.6309403E-10,
1.1655364,
3.8400995356,
9585.2953352221,
1.4698499E-04,
2.5164390E-07,
-1.2952185E-09,
-1.1169371,
10.9930146158,
33314.7656989005,
6.0925100E-04,
1.0016445E-06,
-4.7453563E-09,
1.0656723,
1.4845449633,
1256.6039104970,
-5.3277630E-06,
1.2327842E-09,
-1.0887946E-10,
1.0586190,
11.9220903668,
8364.7398411275,
-2.1850087E-04,
-1.8646419E-07,
8.7760973E-10,
-0.9333176,
9.0816920389,
16728.3705250656,
1.1655481E-04,
2.8300097E-07,
-1.3951435E-09,
0.8624328,
12.4550876470,
6656.7485858257,
-4.0390768E-04,
-4.0490184E-07,
1.9095841E-09,
0.8512404,
4.3705828944,
70.9876756153,
-1.8807069E-04,
-2.1782126E-07,
9.7753467E-10,
-0.8488018,
16.7219647962,
31571.8351843857,
2.4110126E-04,
5.6415276E-07,
-2.6269678E-09,
-0.7956264,
3.5134526588,
-9095.5551701890,
9.4948529E-05,
4.1873358E-08,
-1.9479814E-10
];
static final List<double> M31 = [
0.5139500,
12.0108556517,
14914.4523349355,
-6.3524240E-05,
6.3330532E-08,
-2.5428962E-10,
0.3824500,
9.6553010794,
6585.7609102104,
-2.1583699E-04,
-1.8708058E-07,
9.3204945E-10,
0.3265400,
3.9694765808,
7700.3894694766,
1.5497663E-04,
2.4979472E-07,
-1.1318993E-09,
0.2639600,
0.7416325637,
8956.9933799736,
1.4964887E-04,
2.5102751E-07,
-1.2407788E-09,
0.1230200,
-1.6139220085,
628.3019552485,
-2.6638815E-06,
6.1639211E-10,
-5.4439728E-11,
0.0775400,
8.7830116346,
16171.0562454324,
-6.8852003E-05,
6.4563317E-08,
-3.6316908E-10,
0.0606800,
6.4274570623,
7842.3648207073,
-2.2116475E-04,
-1.8584780E-07,
8.2317000E-10,
0.0497000,
12.0539813334,
14286.1503796870,
-6.0860358E-05,
6.2714140E-08,
-1.9984990E-10
];
static final List<double> M1n = [
3.81034392032, 8.39968473021E+03, -3.31919929753E-05, //月球平黄经系数
3.20170955005E-08, -1.53637455544E-10
];
static double EnnT = 0; // 调用Enn前先设置EnnT时间变量
/**
* 计算E10,E11,E20等,即:某一组周期项或泊松项算出,计算前先设置EnnT时间
*
* @param F F
* @return 计算E10, E11, E20等
*/
static double Enn(List<double> F) {
double v = 0;
for (int i = 0; i < F.length; i += 3)
v += F[i] * cos(F[i + 1] + EnnT * F[i + 2]);
return v;
}
/**
* 返回地球位置,日心Date黄道分点坐标
*
* @param jd jd
* @return 返回地球位置, 日心Date黄道分点坐标
*/
static List<double> earCal(double jd) {
EnnT = jd / 365250;
List<double> llr = [];
double t1 = EnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1, t5 = t4 * t1;
llr[0] = Enn(E10) +
Enn(E11) * t1 +
Enn(E12) * t2 +
Enn(E13) * t3 +
Enn(E14) * t4 +
Enn(E15) * t5;
llr[1] = Enn(E20) + Enn(E21) * t1;
llr[2] = Enn(E30) + Enn(E31) * t1 + Enn(E32) * t2 + Enn(E33) * t3;
llr[0] = rad2mrad(llr[0]);
return llr;
}
// ==================月位置计算===================
static double MnnT = 0; // 调用Mnn前先设置MnnT时间变量
/**
* 计算M10,M11,M20等,计算前先设置MnnT时间
*
* @param F F
* @return 计算M10, M11, M20等, 计算前先设置MnnT时间
*/
static double Mnn(List<double> F) {
double v = 0, t1 = MnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
for (int i = 0; i < F.length; i += 6)
v += F[i] *
sin(F[i + 1] +
t1 * F[i + 2] +
t2 * F[i + 3] +
t3 * F[i + 4] +
t4 * F[i + 5]);
return v;
}
/**
* 返回月球位置,返回地心Date黄道坐标
*
* @param julian 儒略历
* @return return 地心黄道坐标
*/
static List<double?> moonCoord(double julian) {
MnnT = julian / 36525;
double t1 = MnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
List<double?> llr = [];
llr[0] = (Mnn(M10) + Mnn(M11) * t1 + Mnn(M12) * t2) / SECOND_PER_RAD;
llr[1] = (Mnn(M20) + Mnn(M21) * t1) / SECOND_PER_RAD;
llr[2] = (Mnn(M30) + Mnn(M31) * t1) * 0.999999949827;
llr[0] =
llr[0]! + M1n[0] + M1n[1] * t1 + M1n[2] * t2 + M1n[3] * t3 + M1n[4] * t4;
llr[0] = rad2mrad(llr[0]!); // 地心Date黄道原点坐标(不含岁差)
precession(julian, llr); // 补岁差
return llr;
}
/**
* 地心坐标中的日月位置计算
*
* @param lx lx=1时计算t时刻日月角距与jiao的差, lx=0计算t时刻太阳黄经与jiao的差
* @param time time
* @param angle angle
* @return 地心坐标中的日月位置计算
*/
static double angleDiff(int lx, double time, double angle) {
List<double> sun = earCal(time); // 计算太阳真位置(先算出日心坐标中地球的位置)
sun[0] += pi;
sun[1] = -sun[1]; // 转为地心坐标
addGxc(time, sun); // 补周年光行差
if (lx == 0) {
Nutation d = nutation(time);
sun[0] += d.Lon; // 补黄经章动
return rad2mrad(angle - sun[0]);
}
List<double?> moon = moonCoord(time); // 日月角差与章动无关
return rad2mrad(angle - (moon[0]! - sun[0]));
}
/**
* 已知位置反求时间,对于节气计算,应满足t在t1到t1+360天之间,对于Y年第n个节气(n=0是春分),t1可取值Y*365.2422+n*15.2,
* 对于朔望计算,应满足t在t1到t1+25天之间,在此范围之外,求右边的根
*
* @param t1 J2000起算儒略日数,传入的t1是指定角度对应真时刻t的前一些天
* @param angle 已知角度(jiao)求时间(t)
* @param lx lx=0是太阳黄经达某角度的时刻计算(用于节气计算)
* lx=1是日月角距达某角度的时刻计算(用于定朔望等)
* @return 已知位置反求时间
*/
static double getTimeFromAngle(double t1, double angle, int lx) {
double t2 = t1, t = 0, v;
if (lx == 0)
t2 += 360; // 在t1到t2范围内求解(范气360天范围),结果置于t
else
t2 += 25;
angle *= pi / 180; // 待搜索目标角
// 利用截弦法计算
double v1 = angleDiff(lx, t1, angle); // v1,v2为t1,t2时对应的黄经
double v2 = angleDiff(lx, t2, angle);
if (v1 < v2) v2 -= 2 * pi; // 减2pi作用是将周期性角度转为连续角度
double k = 1, k2; // k是截弦的斜率
for (int i = 0; i < 10; i++) {
// 快速截弦求根,通常截弦三四次就已达所需精度
k2 = (v2 - v1) / (t2 - t1); // 算出斜率
if (Math.abs(k2) > 1e-15) k = k2; // 差商可能为零,应排除
t = t1 - v1 / k;
v = angleDiff(lx, t, angle); // 直线逼近法求根(直线方程的根)
if (v > 1) v -= 2 * pi; // 一次逼近后,v1就已接近0,如果很大,则应减1周
if (Math.abs(v) < 1e-8) break; // 已达精度
t1 = t2;
v1 = v2;
t2 = t;
v2 = v; // 下一次截弦
}
return t;
}
/**
* 获得某一年24节气
*
* @param year 年
* @return 24节气
*/
static List<String?> getSolarTerms(int year) {
List<String?> solarTerms = [];
List<String?> preOffset = getSolarTermsPreOffset(year - 1);
List<String?> nextOffset = getSolarTermsNextOffset(year - 1);
System.arraycopy(preOffset, 0, solarTerms, 0, preOffset.length);
System.arraycopy(nextOffset, 0, solarTerms, 22, nextOffset.length);
double jd = 365.2422 * (year - 2000), q;
for (int i = 0; i < 19; i++) {
q = getTimeFromAngle(jd + i * 15.2, i * 15.toDouble(), 0);
q = q + J2000 + 8 / 24; // 计算第i个节气(i=0是春分),结果转为北京时
Time time = setFromJulian(q, true);
solarTerms[i + 3] = time.toString() + SOLAR_TERMS[i];
}
return solarTerms;
}
/**
* 要获得2018年24节气需要传入2017年
*
* @param year 要获得2018年24节气需要传入2017年
* @return 返回 立春 雨水 惊蛰
*/
static List<String?> getSolarTermsPreOffset(int year) {
List<String?> solarTerms = [];
double jd = 365.2422 * (year - 2000), q;
for (int i = 21; i < 24; i++) {
q = getTimeFromAngle(jd + i * 15.2, i * 15.toDouble(), 0);
q = q + J2000 + 8 / 24; // 计算第i个节气(i=0是春分)
Time time = setFromJulian(q, true);
solarTerms[i - 21] = time.toString() + SOLAR_TERMS[i];
}
return solarTerms;
}
/**
* 要获得2018年24节气需要传入2017年
*
* @param year 要获得2018年24节气需要传入2017年
* @return 返回 小寒大寒
*/
static List<String?> getSolarTermsNextOffset(int year) {
List<String?> solarTerms = [];
double jd = 365.2422 * (year - 2000), q;
for (int i = 19; i < 21; i++) {
q = getTimeFromAngle(jd + i * 15.2, i * 15.toDouble(), 0);
q = q + J2000 + 8 / 24; // 计算第i个节气(i=0是春分)
Time time = setFromJulian(q, true);
solarTerms[i - 19] = time.toString() + SOLAR_TERMS[i];
}
return solarTerms;
}
}
/**
* 章动
*/
class Nutation {
/**
* 章动角
*/
late double Lon;
/**
* 交角
*/
late double Obl;
}
class Time {
late double year;
late double month;
late double day;
late double hour;
late double minute;
late double second;
String toString() {
return doubleToString(year) + doubleToString(month) + doubleToString(day);
}
static String doubleToString(double value) {
int v = value.toInt();
return value < 10 ? "0$v" : v.toString();
}
}