diff options
Diffstat (limited to 'src/Julian.cpp')
-rw-r--r-- | src/Julian.cpp | 116 |
1 files changed, 53 insertions, 63 deletions
diff --git a/src/Julian.cpp b/src/Julian.cpp index 907c94e..5a0522b 100644 --- a/src/Julian.cpp +++ b/src/Julian.cpp | |||
@@ -9,93 +9,83 @@ | |||
9 | * 但是我目前提供的中time_t类型为64位整数,因而可以表示数千年的时间范围 | 9 | * 但是我目前提供的中time_t类型为64位整数,因而可以表示数千年的时间范围 |
10 | */ | 10 | */ |
11 | 11 | ||
12 | double Julian::d[23][5]={ | 12 | double Julian::d[23][5] = { |
13 | {-4000, 108371.700000, -13036.800000, 392.000000, 0.000000}, | 13 | {-4000, 108371.700000, -13036.800000, 392.000000, 0.000000}, |
14 | { -500, 17201.000000, -627.820000, 16.170000, -0.341300}, | 14 | {-500, 17201.000000, -627.820000, 16.170000, -0.341300}, |
15 | { -150, 12200.600000, -346.410000, 5.403000, -0.159300}, | 15 | {-150, 12200.600000, -346.410000, 5.403000, -0.159300}, |
16 | { 150, 9113.800000, -328.130000, -1.647000, 0.037700}, | 16 | {150, 9113.800000, -328.130000, -1.647000, 0.037700}, |
17 | { 500, 5707.500000, -391.410000, 0.915000, 0.314500}, | 17 | {500, 5707.500000, -391.410000, 0.915000, 0.314500}, |
18 | { 900, 2203.400000, -283.450000, 13.034000, -0.177800}, | 18 | {900, 2203.400000, -283.450000, 13.034000, -0.177800}, |
19 | { 1300, 490.100000, -57.350000, 2.085000, -0.007200}, | 19 | {1300, 490.100000, -57.350000, 2.085000, -0.007200}, |
20 | { 1600, 120.000000, -9.810000, -1.532000, 0.140300}, | 20 | {1600, 120.000000, -9.810000, -1.532000, 0.140300}, |
21 | { 1700, 10.200000, -0.910000, 0.510000, -0.037000}, | 21 | {1700, 10.200000, -0.910000, 0.510000, -0.037000}, |
22 | { 1800, 13.400000, -0.720000, 0.202000, -0.019300}, | 22 | {1800, 13.400000, -0.720000, 0.202000, -0.019300}, |
23 | { 1830, 7.800000, -1.810000, 0.416000, -0.024700}, | 23 | {1830, 7.800000, -1.810000, 0.416000, -0.024700}, |
24 | { 1860, 8.300000, -0.130000, -0.406000, 0.029200}, | 24 | {1860, 8.300000, -0.130000, -0.406000, 0.029200}, |
25 | { 1880, -5.400000, 0.320000, -0.183000, 0.017300}, | 25 | {1880, -5.400000, 0.320000, -0.183000, 0.017300}, |
26 | { 1900, -2.300000, 2.060000, 0.169000, -0.013500}, | 26 | {1900, -2.300000, 2.060000, 0.169000, -0.013500}, |
27 | { 1920, 21.200000, 1.690000, -0.304000, 0.016700}, | 27 | {1920, 21.200000, 1.690000, -0.304000, 0.016700}, |
28 | { 1940, 24.200000, 1.220000, -0.064000, 0.003100}, | 28 | {1940, 24.200000, 1.220000, -0.064000, 0.003100}, |
29 | { 1960, 33.200000, 0.510000, 0.231000, -0.010900}, | 29 | {1960, 33.200000, 0.510000, 0.231000, -0.010900}, |
30 | { 1980, 51.000000, 1.290000, -0.026000, 0.003200}, | 30 | {1980, 51.000000, 1.290000, -0.026000, 0.003200}, |
31 | { 2000, 63.870000, 0.100000, 0.000000, 0.000000}, | 31 | {2000, 63.870000, 0.100000, 0.000000, 0.000000}, |
32 | { 2005, 64.700000, 0.210000, 0.000000, 0.000000}, | 32 | {2005, 64.700000, 0.210000, 0.000000, 0.000000}, |
33 | { 2012, 66.800000, 0.220000, 0.000000, 0.000000}, | 33 | {2012, 66.800000, 0.220000, 0.000000, 0.000000}, |
34 | { 2018, 69.000000, 0.360000, 0.000000, 0.000000}, | 34 | {2018, 69.000000, 0.360000, 0.000000, 0.000000}, |
35 | { 2028, 72.600000, 0.000000, 0.000000, 0.000000} | 35 | {2028, 72.600000, 0.000000, 0.000000, 0.000000}}; |
36 | }; | ||
37 | 36 | ||
38 | double Julian::dt_ext(int y,double jsd) | 37 | double Julian::dt_ext(int y, double jsd) { |
39 | { | 38 | double dy = (double)(y - 1820) / 100.0; |
40 | double dy=(double)(y-1820)/100.0; | 39 | return -20 + jsd * dy * dy; |
41 | return -20+jsd*dy*dy; | ||
42 | } | 40 | } |
43 | 41 | ||
44 | //计算力学时与世界时之差,传入年份 | 42 | //计算力学时与世界时之差,传入年份 |
45 | double Julian::delta_t(int y) | 43 | double Julian::delta_t(int y) { |
46 | { | 44 | int y0 = d[22][0]; //表中最后一行的年份 |
47 | int y0=d[22][0];//表中最后一行的年份 | 45 | double t0 = d[22][1]; //表中最后一行的delta_t |
48 | double t0=d[22][1];//表中最后一行的delta_t | ||
49 | double jsd; | 46 | double jsd; |
50 | 47 | ||
51 | if(y>y0) | 48 | if (y > y0) { |
52 | { | 49 | jsd = 31; |
53 | jsd=31; | 50 | if (y - y0 > 100) { |
54 | if(y-y0>100) | 51 | return dt_ext(y, jsd); |
55 | { | ||
56 | return dt_ext(y,jsd); | ||
57 | } | 52 | } |
58 | 53 | ||
59 | double v=dt_ext(y,jsd); | 54 | double v = dt_ext(y, jsd); |
60 | double dv=dt_ext(y0,jsd)-t0; | 55 | double dv = dt_ext(y0, jsd) - t0; |
61 | return v-dv*(y0+100-y)/100; | 56 | return v - dv * (y0 + 100 - y) / 100; |
62 | } | 57 | } |
63 | 58 | ||
64 | double res; | 59 | double res; |
65 | for(int i=0;i<22;i++) | 60 | for (int i = 0; i < 22; i++) { |
66 | { | 61 | if (y < d[i + 1][0]) { |
67 | if(y<d[i+1][0]) | ||
68 | { | ||
69 | break; | 62 | break; |
70 | } | 63 | } |
71 | double t1=(y-d[i][0])/(d[i+1][0]-d[i][0])*10; | 64 | double t1 = (y - d[i][0]) / (d[i + 1][0] - d[i][0]) * 10; |
72 | double t2=t1*t1; | 65 | double t2 = t1 * t1; |
73 | double t3=t2*t1; | 66 | double t3 = t2 * t1; |
74 | res=d[i][1]+d[i][2]*t1+d[i][3]*t2+d[i][4]*t3; | 67 | res = d[i][1] + d[i][2] * t1 + d[i][3] * t2 + d[i][4] * t3; |
75 | } | 68 | } |
76 | return res; | 69 | return res; |
77 | } | 70 | } |
78 | 71 | ||
79 | // 计算儒略日 | 72 | // 计算儒略日 |
80 | double Julian::getJulianDay(time_t time) | 73 | double Julian::getJulianDay(time_t time) { |
81 | { | 74 | double t = (double)time; |
82 | double t=(double)time; | 75 | // 2440587.5为1970年1月1日0时的儒略日数 |
83 | //2440587.5为1970年1月1日0时的儒略日数 | 76 | return (double)t / 86400.0 + 2440587.5; |
84 | return (double)t/86400.0+2440587.5; | ||
85 | } | 77 | } |
86 | 78 | ||
87 | // 计算儒略千年数,自JD2000(即2000年1月1日12时)起算 | 79 | // 计算儒略千年数,自JD2000(即2000年1月1日12时)起算 |
88 | double Julian::getJulianKiloYear(time_t time) | 80 | double Julian::getJulianKiloYear(time_t time) { |
89 | { | ||
90 | double jd = getJulianDay(time); | 81 | double jd = getJulianDay(time); |
91 | //2451545.0为2000年1月1日12时的儒略日数,365250.0为一千年的天数 | 82 | // 2451545.0为2000年1月1日12时的儒略日数,365250.0为一千年的天数 |
92 | return (double)(jd-2451545.0)/365250.0; | 83 | return (double)(jd - 2451545.0) / 365250.0; |
93 | } | 84 | } |
94 | 85 | ||
95 | //儒略千年数转时间戳 | 86 | //儒略千年数转时间戳 |
96 | time_t Julian::kiloYearToTime(double t,int year) | 87 | time_t Julian::kiloYearToTime(double t, int year) { |
97 | { | 88 | double jd = t * 365250.0 + 2451545.0; |
98 | double jd=t*365250.0+2451545.0; | 89 | time_t time = (time_t)((jd - 2440587.5) * 86400.0 - delta_t(year)); |
99 | time_t time=(time_t)((jd-2440587.5)*86400.0-delta_t(year)); | ||
100 | return time; | 90 | return time; |
101 | } | 91 | } |