diff options
Diffstat (limited to 'src/parameters.cpp')
-rw-r--r-- | src/parameters.cpp | 56 |
1 files changed, 9 insertions, 47 deletions
diff --git a/src/parameters.cpp b/src/parameters.cpp index fdcefd1..ff57305 100644 --- a/src/parameters.cpp +++ b/src/parameters.cpp | |||
@@ -5,8 +5,7 @@ | |||
5 | #include <utility> | 5 | #include <utility> |
6 | using namespace std; | 6 | using namespace std; |
7 | 7 | ||
8 | void radToDMS(const char *message, int lowerBound, int upperBound, | 8 | string radToDMS(int lowerBound, int upperBound, double radians) { |
9 | double radians) { | ||
10 | // Convert radians to degrees | 9 | // Convert radians to degrees |
11 | double degrees = radians * 180.0 / M_PI; | 10 | double degrees = radians * 180.0 / M_PI; |
12 | 11 | ||
@@ -15,17 +14,19 @@ void radToDMS(const char *message, int lowerBound, int upperBound, | |||
15 | while (degrees >= upperBound) | 14 | while (degrees >= upperBound) |
16 | degrees -= (upperBound - lowerBound); | 15 | degrees -= (upperBound - lowerBound); |
17 | 16 | ||
18 | bool flag = degrees < 0; | ||
19 | if (flag) | ||
20 | degrees = -degrees; | ||
21 | // Calculate degrees, minutes, and seconds | 17 | // Calculate degrees, minutes, and seconds |
22 | int deg = static_cast<int>(degrees); | 18 | int deg = static_cast<int>(degrees); |
23 | double min_sec = (degrees - deg) * 60.0; | 19 | double min_sec = (degrees - deg) * 60.0; |
24 | int min = static_cast<int>(min_sec); | 20 | int min = static_cast<int>(min_sec); |
25 | double sec = (min_sec - min) * 60.0; | 21 | double sec = (min_sec - min) * 60.0; |
22 | if (degrees < 0) { | ||
23 | min = -min; | ||
24 | sec = -sec; | ||
25 | } | ||
26 | 26 | ||
27 | // Output the result | 27 | char buf[100]; |
28 | printf("%s: %c%d°%d'%06.3f''\n", message, flag ? '-' : ' ', deg, min, sec); | 28 | sprintf(buf, "%4d°%2d'%06.3f''", deg, min, sec); |
29 | return string(buf); | ||
29 | } | 30 | } |
30 | 31 | ||
31 | // 计算地球日心黄经 | 32 | // 计算地球日心黄经 |
@@ -205,51 +206,12 @@ pair<double, double> parameter::sun_longitude(double t) { | |||
205 | return make_pair(L, -B); | 206 | return make_pair(L, -B); |
206 | } | 207 | } |
207 | 208 | ||
208 | // 计算月球地心黄经,外部调用,返回角度制 | ||
209 | double parameter::moon_longitude(double t) { | ||
210 | double T = 10 * t; | ||
211 | vector<double> angles = get_angle(T); | ||
212 | double a, b, c, d, moon_longitude_a; | ||
213 | |||
214 | double L = 218.3164591 + 481267.88134236 * T - 0.0013268 * T * T + | ||
215 | T * T * T / 538841 - T * T * T * T / 65194000; //月球平黄经 | ||
216 | double EI = 0, sita = 0; | ||
217 | double E = 1 - 0.002516 * T - 0.0000074 * T * T; //地球离心率 | ||
218 | |||
219 | for (int i = 0; i < moon_size; i++) { | ||
220 | sita = moon_longitude_parameters[i][0] * angles[0] + | ||
221 | moon_longitude_parameters[i][1] * angles[1] + | ||
222 | moon_longitude_parameters[i][2] * angles[2] + | ||
223 | moon_longitude_parameters[i][3] * angles[3]; | ||
224 | sita *= M_PI / 180; | ||
225 | EI += moon_longitude_parameters[i][4] * sin(sita) * | ||
226 | pow(E, fabs(moon_longitude_parameters[i][1])); | ||
227 | } | ||
228 | |||
229 | //地外行星影响月球地心黄经修正项 | ||
230 | double a1, a2; | ||
231 | a1 = 119.75 + 131.849 * T; | ||
232 | a2 = 53.09 + 479264.290 * T; | ||
233 | |||
234 | EI += 3958.0 * sin(a1 * M_PI / 180); | ||
235 | EI += 1962.0 * sin((L - angles[3]) * M_PI / 180); | ||
236 | EI += 318.0 * sin(a2 * M_PI / 180); | ||
237 | |||
238 | L += EI / 1000000; | ||
239 | L += 180 / M_PI * nutation(T); //地球章动修正 | ||
240 | |||
241 | while (L < 0) | ||
242 | L += 360; | ||
243 | while (L >= 360) | ||
244 | L -= 360; | ||
245 | return L; | ||
246 | } | ||
247 | |||
248 | double parameter::getHourAngle(double julianKiloYear, double longitude, | 209 | double parameter::getHourAngle(double julianKiloYear, double longitude, |
249 | double latitude, double alpha) { | 210 | double latitude, double alpha) { |
250 | double T = julianKiloYear * 10; | 211 | double T = julianKiloYear * 10; |
251 | double GST = 280.46061837 + 360.98564736629 * 36525 * T + | 212 | double GST = 280.46061837 + 360.98564736629 * 36525 * T + |
252 | 0.000387933 * T * T - T * T * T / 38710000; | 213 | 0.000387933 * T * T - T * T * T / 38710000; |
214 | GST += nutation(T) * cos(epsilon); | ||
253 | GST *= M_PI / 180; | 215 | GST *= M_PI / 180; |
254 | return GST + longitude - alpha; // 返回弧度制 | 216 | return GST + longitude - alpha; // 返回弧度制 |
255 | } | 217 | } |