24 const int KSNumbers::arguments[
NUTTERMS][5] = {
90 const int KSNumbers::amp[
NUTTERMS][4] = {
91 {-171996,-1742, 92025, 89},
92 { -13187, -16, 5736,-31},
93 { -2274, -2, 977, -5},
158 K.
setD( 20.49552 / 3600. );
179 XB.SinCos( SXB, CXB );
180 YB.SinCos( SYB, CYB );
181 ZB.SinCos( SZB, CZB );
185 P1B[0][0] = CXB*CYB*CZB - SXB*SZB;
186 P1B[1][0] = CXB*CYB*SZB + SXB*CZB;
188 P1B[0][1] = -1.0*SXB*CYB*CZB - CXB*SZB;
189 P1B[1][1] = -1.0*SXB*CYB*SZB + CXB*CZB;
190 P1B[2][1] = -1.0*SXB*SYB;
191 P1B[0][2] = -1.0*SYB*CZB;
192 P1B[1][2] = -1.0*SYB*SZB;
197 P2B[0][0] = CXB*CYB*CZB - SXB*SZB;
198 P2B[1][0] = -1.0*SXB*CYB*CZB - CXB*SZB;
199 P2B[2][0] = -1.0*SYB*CZB;
200 P2B[0][1] = CXB*CYB*SZB + SXB*CZB;
201 P2B[1][1] = -1.0*SXB*CYB*SZB + CXB*CZB;
202 P2B[2][1] = -1.0*SYB*SZB;
204 P2B[1][2] = -1.0*SXB*SYB;
218 T = ( jd -
J2000 ) / 36525.;
227 L.
setD( 280.46645 + 36000.76983*T + 0.0003032*T2 );
230 D.
setD( 297.85036 + 445267.111480*T - 0.0019142*T2 + T3/189474.);
233 M.
setD( 357.52910 + 35999.05030*T - 0.0001559*T2 - 0.00000048*T3);
236 MM.
setD( 134.96298 + 477198.867398*T + 0.0086972*T2 + T3/56250.0 );
239 LM.
setD( 218.3164591 + 481267.88134236*T - 0.0013268*T2 + T3/538841. - T*T*T*T/6519400.);
242 F.
setD( 93.27191 + 483202.017538*T - 0.0036825*T2 + T3/327270.);
245 O.
setD( 125.04452 - 1934.136261*T + 0.0020708*T2 + T3/450000.0 );
248 e = 0.016708617 - 0.000042037*T - 0.0000001236*T2;
250 double C = ( 1.914600 - 0.004817*T - 0.000014*T2 ) * sin( M.radians() )
251 + ( 0.019993 - 0.000101*T ) * sin( 2.0* M.radians() )
252 + 0.000290 * sin( 3.0* M.radians() );
263 double dObliq = -4680.93*U - 1.55*U*U + 1999.25*U*U*U
264 - 51.38*U*U*U*U - 249.67*U*U*U*U*U
265 - 39.05*U*U*U*U*U*U + 7.12*U*U*U*U*U*U*U
266 + 27.87*U*U*U*U*U*U*U*U + 5.79*U*U*U*U*U*U*U*U*U
267 + 2.45*U*U*U*U*U*U*U*U*U*U;
268 Obliquity.
setD( 23.43929111 + dObliq/3600.0);
272 double sin2L, cos2L, sin2M, cos2M;
273 double sinO, cosO, sin2O, cos2O;
279 O.SinCos( sinO, cosO );
280 O2.SinCos( sin2O, cos2O );
281 L2.SinCos( sin2L, cos2L );
282 M2.SinCos( sin2M, cos2M );
290 for (
unsigned int i=0; i <
NUTTERMS; i++) {
294 arg.SinCos( args, argc );
296 deltaEcLong += (amp[i][0] + amp[i][1]/10. * T ) * args * 1e-4 ;
297 deltaObliquity += (amp[i][2] + amp[i][3]/10. * T ) * argc * 1e-4 ;
300 deltaEcLong/= 3600.0;
301 deltaObliquity /= 3600.0;
304 XP.
setD( 0.6406161*T + 0.0000839*T2 + 0.0000050*T3 );
305 YP.
setD( 0.5567530*T - 0.0001185*T2 - 0.0000116*T3 );
306 ZP.
setD( 0.6406161*T + 0.0003041*T2 + 0.0000051*T3 );
315 P1[0][0] = CX*CY*CZ - SX*SZ;
316 P1[1][0] = CX*CY*SZ + SX*CZ;
318 P1[0][1] = -1.0*SX*CY*CZ - CX*SZ;
319 P1[1][1] = -1.0*SX*CY*SZ + CX*CZ;
320 P1[2][1] = -1.0*SX*SY;
321 P1[0][2] = -1.0*SY*CZ;
322 P1[1][2] = -1.0*SY*SZ;
341 double LVenus = 3.1761467+1021.3285546*T;
342 double LMars = 1.7534703+ 628.3075849*T;
343 double LEarth = 6.2034809+ 334.0612431*T;
344 double LJupiter = 0.5995465+ 52.9690965*T;
345 double LSaturn = 0.8740168+ 21.3299095*T;
346 double LNeptune = 5.3118863+ 3.8133036*T;
347 double LUranus = 5.4812939+ 7.4781599*T;
349 double LMRad = 3.8103444+8399.6847337*T;
350 double DRad = 5.1984667+7771.3771486*T;
351 double MMRad = 2.3555559+8328.6914289*T;
352 double FRad = 1.6279052+8433.4661601*T;
360 double vondrak[36][7] = {
361 {LMars, -1719914-2*T, -25, 25-13*T,1578089+156*T, 10+32*T,684185-358*T},
362 {2*LMars, 6434+141*T,28007-107*T,25697-95*T, -5904-130*T,11141-48*T, -2559-55*T},
363 {LJupiter, 715, 0, 6, -657, -15, -282},
364 {LMRad, 715, 0, 0, -656, 0, -285},
365 {3*LMars, 486-5*T, -236-4*T, -216-4*T, -446+5*T, -94, -193},
366 {LSaturn, 159, 0, 2, -147, -6, -61},
367 {FRad, 0, 0, 0, 26, 0, -59},
368 {LMRad+MMRad, 39, 0, 0, -36, 0, -16},
369 {2*LJupiter, 33, -10, -9, -30, -5, -13},
370 {2*LMars-LJupiter, 31, 1, 1, -28, 0, -12},
371 {3*LMars-8*LEarth+3*LJupiter, 8, -28, 25, 8, 11, 3},
372 {5*LMars-8*LEarth+3*LJupiter, 8, -28, -25, -8, -11, -3},
373 {2*LVenus-LMars, 21, 0, 0, -19, 0, -8},
374 {LVenus, -19, 0, 0, 17, 0, 8},
375 {LNeptune, 17, 0, 0, -16, 0, -7},
376 {LMars-2*LJupiter, 16, 0, 0, 15, 1, 7},
377 {LUranus, 16, 0, 1, -15, -3, -6},
378 {LMars+LJupiter, 11, -1, -1, -10, -1, -5},
379 {2*LVenus-2*LMars, 0, -11, -10, 0, -4, 0},
380 {LMars-LJupiter, -11, -2, -2, 9, -1, 4},
381 {4*LMars, -7, -8, -8, 6, -3, 3},
382 {3*LMars-2*LJupiter, -10, 0, 0, 9, 0, 4},
383 {LVenus-2*LMars, -9, 0, 0, -9, 0, -4},
384 {2*LVenus-3*LMars, -9, 0, 0, -8, 0, -4},
385 {2*LSaturn, 0, -9, -8, 0, -3, 0},
386 {2*LVenus-4*LMars, 0, -9, 8, 0, 3, 0},
387 {3*LMars-2*LEarth, 8, 0, 0, -8, 0, -3},
388 {LMRad+2*DRad-MMRad, 8, 0, 0, -7, 0, -3},
389 {8*LVenus-12*LMars, -4, -7, -6, 4, -3, 2},
390 {8*LVenus-14*LMars, -4, -7, 6, -4, 3, -2},
391 {2*LEarth, -6, -5, -4, 5, -2, 2},
392 {3*LVenus-4*LMars, -1, -1, -2, -7, 1, -4},
393 {2*LMars-2*LJupiter, 4, -6, -5, -4, -2, -2},
394 {3*LVenus-3*LMars, 0, -7, -6, 0, -3, 0},
395 {2*LMars-2*LEarth, 5, -5, -4, -5, -2, -2},
396 {LMRad-2*DRad, 5, 0, 0, -5, 0, -2}
408 for (
unsigned int i=0; i<36; i++) {
409 anglev.setRadians(vondrak[i][0]);
410 anglev.SinCos(sa,ca);
411 for (
unsigned int j=0; j<3; j++) {
412 vearth[j] += vondrak[i][2*j+1]*sa +vondrak[i][2*j+2]*ca;
416 const double UA2km = 1.49597870/86400.;
418 for (
unsigned int j=0; j<3; j++) {
419 vearth[j] = vearth[j] * UA2km;
void updateValues(long double jd)
update all values for the date given as an argument.
const double & Degrees() const
KSNumbers(long double jd)
Constructor.
void computeConstantValues()
compute constant values that need to be computed only once per instance of the application ...
~KSNumbers()
Destructor (empty).
An angle, stored as degrees, but expressible in many ways.
void setD(const double &x)
Sets floating-point value of angle, in degrees.