753 const int d_lng[] = { 0, 2, 2, 0, 0, 0, 2, 2, 2, 2,
754 0, 1, 0, 2, 0, 0, 4, 0, 4, 2,
755 2, 1, 1, 2, 2, 4, 2, 0, 2, 2,
756 1, 2, 0, 0, 2, 2, 2, 4, 0, 3,
757 2, 4, 0, 2, 2, 2, 4, 0, 4, 1,
758 2, 0, 1, 3, 4, 2, 0, 1, 2, 2};
759 const int m_lng[] = { 0, 0, 0, 0, 1, 0, 0,-1, 0,-1,
760 1, 0, 1, 0, 0, 0, 0, 0, 0, 1,
761 1, 0, 1,-1, 0, 0, 0, 1, 0,-1,
762 0,-2, 1, 2,-2, 0, 0,-1, 0, 0,
763 1,-1, 2, 2, 1,-1, 0, 0,-1, 0,
764 1, 0, 1, 0, 0,-1, 2, 1, 0,0};
765 const int mp_lng[] = { 1,-1, 0, 2, 0, 0,-2,-1, 1, 0,
766 -1, 0, 1, 0, 1, 1,-1, 3,-2,-1,
767 0,-1, 0, 1, 2, 0,-3,-2,-1,-2,
768 1, 0, 2, 0,-1, 1, 0,-1, 2,-1,
769 1,-2,-1,-1,-2, 0, 1, 4, 0,-2,
770 0, 2, 1,-2,-3, 2, 1,-1, 3,-1};
771 const int f_lng[] = { 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
772 0, 0, 0,-2, 2,-2, 0, 0, 0, 0,
773 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
774 0, 0, 0, 0, 0,-2, 2, 0, 2, 0,
775 0, 0, 0, 0, 0,-2, 0, 0, 0, 0,
776 -2,-2, 0, 0, 0, 0, 0, 0, 0,-2};
777 const int sin_lng[] = { 6288774, 1274027, 658314, 213618,-185116,
778 -114332, 58793, 57066, 53322, 45758,
779 -40923, -34720, -30383, 15327, -12528,
780 10980, 10675, 10034, 8548, -7888,
781 -6766, -5163, 4987, 4036, 3994,
782 3861, 3665, -2689, -2602, 2390,
783 -2348, 2236, -2120, -2069, 2048,
784 -1773, -1595, 1215, -1110, -892,
785 -810, 759, -713, -700, 691,
786 596, 549, 537, 520, -487,
787 -399, -381, 351, -340, 330,
788 327, -323, 299, 294, 0};
805 const int d_lat[] = { 0, 0, 0, 2, 2, 2, 2, 0, 2, 0,
806 2, 2, 2, 2, 2, 2, 2, 0, 4, 0,
807 0, 0, 1, 0, 0, 0, 1, 0, 4, 4,
808 0, 4, 2, 2, 2, 2, 0, 2, 2, 2,
809 2, 4, 2, 2, 0, 2, 1, 1, 0, 2,
810 1, 2, 0, 4, 4, 1, 4, 1, 4, 2};
811 const int m_lat[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
812 -1, 0, 0, 1,-1,-1,-1, 1, 0, 1,
813 0, 1, 0, 1, 1, 1, 0, 0, 0, 0,
814 0, 0, 0, 0,-1, 0, 0, 0, 0, 1,
815 1, 0,-1,-2, 0, 1, 1, 1, 1, 1,
816 0,-1, 1, 0,-1, 0, 0, 0,-1,-2};
817 const int mp_lat[] = { 0, 1, 1, 0,-1,-1, 0, 2, 1, 2,
818 0,-2, 1, 0,-1, 0,-1,-1,-1, 0,
819 0,-1, 0, 1, 1, 0, 0, 3, 0,-1,
820 1,-2, 0, 2, 1,-2, 3, 2,-3,-1,
821 0, 0, 1, 0, 1, 1, 0, 0,-2,-1,
822 1,-2, 2,-2,-1, 1, 1,-1, 0, 0};
823 const int f_lat[] = { 1, 1,-1,-1, 1,-1, 1, 1,-1,-1,
824 -1,-1, 1,-1, 1, 1,-1,-1,-1, 1,
825 3, 1, 1, 1,-1,-1,-1, 1,-1, 1,
826 -3, 1,-3,-1,-1, 1,-1, 1,-1, 1,
827 1, 1, 1,-1, 3,-1,-1, 1,-1,-1,
828 1,-1, 1,-1,-1,-1,-1,-1,-1, 1};
829 const int sin_lat[] = {5128122, 280602, 277693, 173237, 55413,
830 46271, 32573, 17198, 9266, 8822,
831 8216, 4324, 4200, -3359, 2463,
832 2211, 2065, -1870, 1828, -1794,
833 -1749, -1565, -1491, -1475, -1410,
834 -1344, -1335, 1107, 1021, 833,
835 777, 671, 607, 596, 491,
836 -451, 439, 422, 421, -366,
837 -351, 331, 315, 302, -283,
838 -229, 223, 223, -220, -220,
839 -185, 181, -177, 176, 166,
840 -164, 132, -119, 115, 107};
847 const int nutate_d_lng[] = { 0,-2, 0, 0, 0, 0,-2, 0, 0,-2,
848 -2,-2, 0, 2, 0, 2, 0, 0,-2, 0,
849 2, 0, 0,-2, 0,-2, 0, 0, 2,-2,
850 0,-2, 0, 0, 2, 2, 0,-2, 0, 2,
851 2,-2,-2, 2, 2, 0,-2,-2, 0,-2,
852 -2, 0,-1,-2, 1, 0, 0,-1, 0, 0,
854 const int nutate_m_lng[] = { 0, 0, 0, 0, 1, 0, 1, 0, 0,-1,
855 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
856 0, 0, 0, 0, 0, 0, 0, 2, 0, 2,
857 1, 0,-1, 0, 0, 0, 1, 1,-1, 0,
858 0, 0, 0, 0, 0,-1,-1, 0, 0, 0,
859 1, 0, 0, 1, 0, 0, 0,-1, 1,-1,
861 const int nutate_mp_lng[] = { 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
862 1, 0,-1, 0, 1,-1,-1, 1, 2,-2,
863 0, 2, 2, 1, 0, 0,-1, 0,-1, 0,
864 0, 1, 0, 2,-1, 1, 0, 1, 0, 0,
865 1, 2, 1,-2, 0, 1, 0, 0, 2, 2,
866 0, 1, 1, 0, 0, 1,-2, 1, 1, 1,
868 const int nutate_f_lng[] = { 0, 2, 2, 0, 0, 0, 2, 2, 2, 2,
869 0, 2, 2, 0, 0, 2, 0, 2, 0, 2,
870 2, 2, 0, 2, 2, 2, 2, 0, 0, 2,
871 0, 0, 0,-2, 2, 2, 2, 0, 2, 2,
872 0, 2, 2, 0, 0, 0, 2, 0, 2, 0,
873 2,-2, 0, 0, 0, 2, 2, 0, 0, 2,
875 const int nutate_om_lng[] = { 1, 2, 2, 2, 0, 0, 2, 1, 2, 2,
876 0, 1, 2, 0, 1, 2, 1, 1, 0, 1,
877 2, 2, 0, 2, 0, 0, 1, 0, 1, 2,
878 1, 1, 1, 0, 1, 2, 2, 0, 2, 1,
879 0, 2, 1, 1, 1, 0, 1, 1, 1, 1,
880 1, 0, 0, 0, 0, 0, 2, 0, 0, 2,
882 const int nutate_sin_lng[] = {-171996, -13187, -2274, 2062, 1426,
883 712, -517, -386, -301, 217,
884 -158, 129, 123, 63, 63,
885 -59, -58, -51, 48, 46,
886 -38, -31, 29, 29, 26,
887 -22, 21, 17, 16, -16,
888 -15, -13, -12, 11, -10,
895 const int nutate_cos_lng[] = { 92025, 5736, 977, -895, 54,
896 -7, 224, 200, 129, -95,
908 const double nutate_sdelt[] = {-174.2, -1.6, -0.2, 0.2, -3.4,
909 0.1, 1.2, -0.4, 0.0, -0.5,
910 0.0, 0.1, 0.0, 0.0, 0.1,
911 0.0, -0.1, 0.0, 0.0, 0.0,
912 0.0, 0.0, 0.0, 0.0, 0.0,
913 0.0, 0.0, -0.1, 0.0, 0.1,
914 0.0, 0.0, 0.0, 0.0, 0.0,
915 0.0, 0.0, 0.0, 0.0, 0.0,
916 0.0, 0.0, 0.0, 0.0, 0.0,
917 0.0, 0.0, 0.0, 0.0, 0.0,
918 0.0, 0.0, 0.0, 0.0, 0.0,
919 0.0, 0.0, 0.0, 0.0, 0.0,
921 const double nutate_cdelt[] = {8.9, -3.1, -0.5, 0.5, -0.1,
922 0.0, -0.6, 0.0, -0.1, 0.3,
923 0.0, 0.0, 0.0, 0.0, 0.0,
924 0.0, 0.0, 0.0, 0.0, 0.0,
925 0.0, 0.0, 0.0, 0.0, 0.0,
926 0.0, 0.0, 0.0, 0.0, 0.0,
927 0.0, 0.0, 0.0, 0.0, 0.0,
928 0.0, 0.0, 0.0, 0.0, 0.0,
929 0.0, 0.0, 0.0, 0.0, 0.0,
930 0.0, 0.0, 0.0, 0.0, 0.0,
931 0.0, 0.0, 0.0, 0.0, 0.0,
932 0.0, 0.0, 0.0, 0.0, 0.0,
936 double t = (time.
jd() - 2451545.0) / 36525.0;
940 double Lprimed = 218.3164477 +
943 (1.0/538841.0 - 1.0/65194000.0 * t) * t) * t) * t;
947 double D = (297.8501921 +
950 (1.0/545868.0 - 1.0/113065000.0 * t) * t) * t) * t) *
954 double M = (357.5291092 +
956 (-0.0001536 + 1.0/24490000.0 * t) * t) * t) *
960 double Mprime = (134.9633964 +
963 (1.0/69699.0 - 1.0/14712000.0 * t) * t) * t) * t) *
967 double F = (93.2720950 +
970 (-1.0/35260000 + 1.0/863310000 * t) * t) * t) * t) *
975 double Omega = (125.04452 +
977 (0.0020708 + 1.0/4.5e5 * t) * t) * t) *
986 double Al = 3958.0 * std::sin(A1) +
987 1962.0 * std::sin(Lprime - F) +
988 318.0 * std::sin(A2);
989 double Ab = -2235.0 * std::sin(Lprime) +
990 382.0 * std::sin(A3) +
991 175.0 * std::sin(A1 - F) +
992 175.0 * std::sin(A1 + F) +
993 127.0 * std::sin(Lprime - Mprime) -
994 115.0 * std::sin(Lprime + Mprime);
997 double E = 1.0 - (0.002516 + 7.4e-6 * t) * t;
1004 for (
int i = 0; i < 60; ++i) {
1007 double sinlng = sin_lng[i];
1009 double sinlat = sin_lat[i];
1010 if (std::abs(m_lng[i]) == 1) {
1014 else if (std::abs(m_lng[i]) == 2) {
1018 if (std::abs(m_lat[i]) == 1) {
1021 else if (std::abs(m_lat[i]) == 2) {
1026 double s_l = d_lng[i] * D + m_lng[i] * M + mp_lng[i] * Mprime +
1028 double s_b = d_lat[i] * D + m_lat[i] * M + mp_lat[i] * Mprime +
1032 sum_l += sinlng * std::sin(s_l);
1033 sum_b += sinlat * std::sin(s_b);
1039 double geolong = Lprimed + 1.0e-6 * sum_l;
1040 double geolat = 1.0e-6 * sum_b;
1046 double nut_long = 0.0;
1047 double nut_obliq = 0.0;
1048 for (
int i = 0; i < 63; ++i) {
1049 double arg = nutate_d_lng[i] * D + nutate_m_lng[i] * M +
1050 nutate_mp_lng[i] * Mprime + nutate_f_lng[i] * F +
1051 nutate_om_lng[i] * Omega;
1052 nut_long += (nutate_sdelt[i] * t + nutate_sin_lng[i]) * std::sin(arg);
1053 nut_obliq += (nutate_cdelt[i] * t + nutate_cos_lng[i]) * std::cos(arg);
1056 nut_obliq *= 0.0001;
1059 geolong += nut_long / 3600.0;
1069 double y = t / 100.0;
1070 double epsilon = (84381.448 +
1079 (5.79 + 2.45 * y)*y)*y)*y)*y)*y)*y)*y)*y)*y)/3600.0;
1083 double ra = std::atan2(std::sin(lambda) * std::cos(eps) -
1084 std::tan(beta) * std::sin(eps), std::cos(lambda)) *
1086 double dec = std::asin(std::sin(beta) * std::cos(eps) +
1087 std::cos(beta) * std::sin(eps) * std::sin(lambda)) *