// MNeptune.Conjuction(double) /// <summary> /// Liefert die julianische Tageszahl des nächsten Durchgangs durch die Konjunktion mit der Sonne nach der julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Julianische Tageszahl des nächsten Durchgangs durch die Konjunktion mit der Sonne nach der julianischen Tageszahl.</returns> public static double Conjunction(double jd) { // Lokale Felder einrichten double y = (double)MCalendar.GregorianYear(jd) + MEphemerides.YearFragment(jd); double k = MMath.Floor((365.2425 * y + 1721060.0 - 2451569.379) / 367.486703) - 1.0; double j = 0.0; // Berechnungsschleife while (j <= jd) { // Näherung berechnen k += 1.0; j = 2451569.379 + k * 367.486703; // Hilfsfelder berechnen double m = MMath.Mod(MMath.ToRad(21.5569 + k * 2.194998), MMath.Pi2); double t = (j - 2451545.0) / 36525.0; double a = MMath.Mod(MMath.ToRad(207.83 + 8.51 * t), MMath.Pi2); double b = MMath.Mod(MMath.ToRad(276.74 + 209.98 * t), MMath.Pi2); double h; // Korrektur berechnen und anwenden h = 0.0168; h += MMath.Polynome(t, -2.5606, 0.0088, 0.00002) * MMath.Sin(m); h += MMath.Polynome(t, -0.8611, -0.0037, 0.00002) * MMath.Cos(m); h += MMath.Polynome(t, 0.0118, -0.0004, 0.00001) * MMath.Sin(2.0 * m); h += MMath.Polynome(t, 0.0307, -0.0003) * MMath.Cos(2.0 * m); h += -0.5964 * MMath.Cos(a); h += 0.0728 * MMath.Cos(b); j += h; } return(j); }
// MNeptune.MeanLongitude(double) /// <summary> /// Liefert die mittlere Länge der mittleren Planetenbahn zur julianischen Tageszahl. /// </summary> /// <param name="jd">Julianischen Tageszahl.</param> /// <returns>Mittlere Länge der mittleren Planetenbahn zur julianischen Tageszahl.</returns> /// <remarks>Die Winkelangabe erfolgt in Gradmaß.</remarks> public static double MeanLongitude(double jd) { // Lokale Felder einrichten und Länge berechnen double t = (jd - 2451545.0) / 36525.0; return(MMath.Mod(MMath.Polynome(t, 304.348665, 219.8833092, 0.00030882, 0.000000018), 360.0)); }
// MNeptune.Opposition(double) /// <summary> /// Liefert die julianische Tageszahl des nächsten Durchgangs durch die Opposition mit der Sonne nach der aktuellen Systemzeit. /// </summary> /// <returns>Julianische Tageszahl des nächsten Durchgangs durch die Opposition mit der Sonne nach der aktuellen Systemzeit.</returns> public static double Opposition(double jd) { // Deklaration der lokalen Felder double y = (double)MCalendar.GregorianYear(jd) + MEphemerides.YearFragment(jd); double k = MMath.Floor((365.2425 * y + 1721060.0 - 2451753.122) / 367.486703) - 1.0; double j = 0.0; // Berechnungsschleife while (j <= jd) { // Näherung berechnen k += 1.0; j = 2451753.122 + k * 367.486703; // Hilfsfelder berechnen double m = MMath.Mod(MMath.ToRad(202.6544 + k * 2.194998), MMath.Pi2); double t = (j - 2451545.0) / 36525.0; double a = MMath.Mod(MMath.ToRad(207.83 + 8.51 * t), MMath.Pi2); double b = MMath.Mod(MMath.ToRad(276.74 + 209.98 * t), MMath.Pi2); double h; // Korrektur berechnen und anwenden h = MMath.Polynome(t, -0.0140, 0.0000, 0.00001); h += MMath.Polynome(t, -1.3486, 0.0010, 0.00001) * MMath.Sin(m); h += MMath.Polynome(t, 0.8597, 0.0037) * MMath.Cos(m); h += MMath.Polynome(t, -0.0082, -0.0002, 0.00001) * MMath.Sin(2.0 * m); h += MMath.Polynome(t, 0.0037, -0.0003) * MMath.Cos(2.0 * m); h += -0.5964 * MMath.Cos(a); h += 0.0728 * MMath.Cos(b); j += h; } return(j); }
// MUranus.Conjuction(double) /// <summary> /// Liefert die julianische Tageszahl des nächsten Durchgangs durch die Konjunktion mit der Sonne nach der julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Julianische Tageszahl des nächsten Durchgangs durch die Konjunktion mit der Sonne nach der julianischen Tageszahl.</returns> public static double Conjunction(double jd) { // Lokale Felder einrichten double y = (double)MCalendar.GregorianYear(jd) + MEphemerides.YearFragment(jd); double k = MMath.Floor((365.2425 * y + 1721060.0 - 2451579.489) / 369.656035) - 1.0; double j = 0.0; // Berechnungsschleife while (j <= jd) { // Näherung berechnen k += 1.0; j = 2451579.489 + k * 369.656035; // Hilfsfelder berechnen double m = MMath.Mod(MMath.ToRad(31.5219 + k * 4.333093), MMath.Pi2); double t = (j - 2451545.0) / 36525.0; double a = MMath.Mod(MMath.ToRad(207.83 + 8.51 * t), MMath.Pi2); double b = MMath.Mod(MMath.ToRad(108.84 + 419.96 * t), MMath.Pi2); double h; // Korrektur berechnen und anwenden h = MMath.Polynome(t, -0.0859, 0.0003); h += MMath.Polynome(t, -3.8179, -0.0148, 0.00003) * MMath.Sin(m); h += MMath.Polynome(t, 5.1228, -0.0105, -0.00002) * MMath.Cos(m); h += MMath.Polynome(t, -0.0803, 0.0011) * MMath.Sin(2.0 * m); h += MMath.Polynome(t, -0.1905, -0.0006) * MMath.Cos(2.0 * m); h += MMath.Polynome(t, 0.0088, 0.0001) * MMath.Sin(3.0 * m); h += 0.8850 * MMath.Cos(a); h += 0.2153 * MMath.Cos(b); j += h; } return(j); }
// MEarth.MeanLongitude(double) /// <summary> /// Liefert die mittlere Länge der mittleren Planetenbahn zur julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Mittlere Länge der mittleren Planetenbahn zur julianischen Tageszahl.</returns> /// <remarks>Die Winkelangabe erfolgt in Gradmaß.</remarks> public static double MeanLongitude(double jd) { // Lokale Felder einrichten und Länge berechnen double t = (jd - 2451545.0) / 36525.0; return(MMath.Mod(MMath.Polynome(t, 100.466457, 36000.7698278, 0.00030322, 0.000000020), 360.0)); }
// MUranus.MeanLongitude(double) /// <summary> /// Liefert die mittlere Länge der mittleren Planetenbahn zur julianischen Tageszahl. /// </summary> /// <param name="jd">Julianischen Tageszahl.</param> /// <returns>Mittlere Länge der mittleren Planetenbahn zur julianischen Tageszahl.</returns> /// <remarks>Die Winkelangabe erfolgt in Gradmaß.</remarks> public static double MeanLongitude(double jd) { // Lokale Felder einrichten und Länge berechnen double t = (jd - 2451545.0) / 36525.0; return(MMath.Mod(MMath.Polynome(t, 314.055005, 429.8640561, 0.00030390, 0.000000026), 360.0)); }
// MUranus.Opposition(double) /// <summary> /// Liefert die julianische Tageszahl des nächsten Durchgangs durch die Opposition mit der Sonne nach der aktuellen Systemzeit. /// </summary> /// <returns>Julianische Tageszahl des nächsten Durchgangs durch die Opposition mit der Sonne nach der aktuellen Systemzeit.</returns> public static double Opposition(double jd) { // Lokale Felder einrichten double y = (double)MCalendar.GregorianYear(jd) + MEphemerides.YearFragment(jd); double k = MMath.Floor((365.2425 * y + 1721060.0 - 2451764.317) / 369.656035) - 1.0; double j = 0.0; // Berechnungsschleife while (j <= jd) { // Näherung berechnen k += 1.0; j = 2451764.317 + k * 369.656035; // Hilfsfelder berechnen double m = MMath.Mod(MMath.ToRad(213.6884 + k * 4.333093), MMath.Pi2); double t = (j - 2451545.0) / 36525.0; double a = MMath.Mod(MMath.ToRad(207.83 + 8.51 * t), MMath.Pi2); double b = MMath.Mod(MMath.ToRad(108.84 + 419.96 * t), MMath.Pi2); double h; // Korrektur berechnen und anwenden h = MMath.Polynome(t, 0.0844, -0.0006); h += MMath.Polynome(t, -0.1048, 0.0246) * MMath.Sin(m); h += MMath.Polynome(t, -5.1221, 0.0104, 0.00003) * MMath.Cos(m); h += MMath.Polynome(t, -0.1428, 0.0005) * MMath.Sin(2.0 * m); h += MMath.Polynome(t, -0.0148, -0.0013) * MMath.Cos(2.0 * m); h += 0.0055 * MMath.Cos(3.0 * m); h += 0.8850 * MMath.Cos(a); h += 0.2153 * MMath.Cos(b); j += h; } return(j); }
private static double m_TL4; // Wahre Länge für Callisto. // ------------------- // // Felder und Methoden // // ------------------- // // MGalileanMoon.Calculate(double) /// <summary> /// Richtet die privaten Felder zur julianischen Tageszahl ein. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> private static void Calculate(double jd) { // Tageszahl berechnen m_d = jd - 2443000.5; // ---------- // // Basisdaten // // ---------- // // Mittlere Längen berechnen m_ML1 = MMath.ToRad(MMath.Mod(106.077187 + 203.48895579033 * m_d, 360.0)); m_ML2 = MMath.ToRad(MMath.Mod(175.731615 + 101.37472473479 * m_d, 360.0)); m_ML3 = MMath.ToRad(MMath.Mod(120.558829 + 50.31760920702 * m_d, 360.0)); m_ML4 = MMath.ToRad(MMath.Mod(84.444587 + 21.57107117668 * m_d, 360.0)); // Perijovenlängen berechnen m_LP1 = MMath.ToRad(MMath.Mod(97.088086 + 0.16138586144 * m_d, 360.0)); m_LP2 = MMath.ToRad(MMath.Mod(154.866335 + 0.04726306609 * m_d, 360.0)); m_LP3 = MMath.ToRad(MMath.Mod(188.184037 + 0.00712733949 * m_d, 360.0)); m_LP4 = MMath.ToRad(MMath.Mod(335.286807 + 0.00183999637 * m_d, 360.0)); // Knotenlängen berechnen m_LO1 = MMath.ToRad(MMath.Mod(312.334566 - 0.13279385940 * m_d, 360.0)); m_LO2 = MMath.ToRad(MMath.Mod(100.441116 - 0.03263063731 * m_d, 360.0)); m_LO3 = MMath.ToRad(MMath.Mod(119.194241 - 0.00717703155 * m_d, 360.0)); m_LO4 = MMath.ToRad(MMath.Mod(322.618633 - 0.00175933880 * m_d, 360.0)); // Korrektur der Jupiterlänge berechnen m_G0 = 0.33033 * MMath.Sin(MMath.ToRad(163.679 + 0.0010512 * m_d)); m_G0 += 0.03439 * MMath.Sin(MMath.ToRad(34.486 - 0.0161731 * m_d)); // Phase der freien Libration berechnen m_Phi = MMath.ToRad(MMath.Mod(199.676608 + 0.17379190461 * m_d, 360.0)); // Knotenlänge des Jupiteräquator berechnen m_Psi = MMath.ToRad(MMath.Mod(316.518203 + 0.00000208362 * m_d, 360.0)); // Mittlere Anomalien berechnen m_G1 = MMath.ToRad(MMath.Mod(30.237557 + 0.08309257010 * m_d + m_G0, 360.0)); m_G2 = MMath.ToRad(MMath.Mod(31.978528 + 0.03345973390 * m_d, 360.0)); // Länge des Perihels berechnen m_Pi = MMath.ToRad(13.469942); // ----------- // // Korrekturen // // ----------- // // Hilfswinkel einrichten m_H1 = MMath.ToRad(52.225); // Wahre Längen berechnen m_TL1 = m_ML1 + MGalileanMoon.m_dL1(); m_TL2 = m_ML2 + MGalileanMoon.m_dL2(); m_TL3 = m_ML3 + MGalileanMoon.m_dL3(); m_TL4 = m_ML4 + MGalileanMoon.m_dL4(); }
// MEarth.Direction(double, double, double, double) /// <summary> /// Liefert die geographische Richtung zweier Orte auf der Erdoberfläche. /// </summary> /// <param name="lamdaA">Geographische Länge des Ortes A.</param> /// <param name="phiA">Geographische Breite des Ortes A.</param> /// <param name="lamdaB">Geographische Länge des Ortes B.</param> /// <param name="phiB">Geographische Breite des Ortes B.</param> /// <returns>Geographische Richtung zweier Orte auf der Erdoberfläche.</returns> public static double Direction(double lamdaA, double phiA, double lamdaB, double phiB) { // Lokale Felder einrichten double d = MMath.Cos(phiA) * MMath.Tan(phiB) - MMath.Sin(phiA) * MMath.Cos(lamdaA - lamdaB); // Winkel berechnen und liefern if (d == 0.0) { return(0.0); } return(MMath.Mod(MMath.ArcTan(MMath.Sin(lamdaA - lamdaB), d), MMath.Pi2)); }
// MEphemerides.NutationInObliquity(double) /// <summary> /// Liefert die Nutation der Ekliptikschiefe zur julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Nutation der Ekliptikschiefe zur julianischen Tageszahl.</returns> public static double NutationInObliquity(double jd) { // Lokale Felder einrichten double t = (jd - 2451545.0) / 36525.0; double d = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 297.85036, 445267.111480, -0.0019142, 1 / 189474)), MMath.Pi2); double s = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 357.52772, 35999.050340, -0.0001603, -1 / 300000)), MMath.Pi2); double m = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 134.96298, 477198.867398, 0.0086972, 1 / 56250)), MMath.Pi2); double f = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 93.27191, 483202.017538, -0.0036825, 1 / 327270)), MMath.Pi2); double o = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 125.04452, -1934.136261, 0.0020708, 1 / 450000)), MMath.Pi2); double e = 0.0; // Korrektur berechnen und anwenden e += (92025.0 + 8.9 * t) * MMath.Cos(o); e += (5736.0 - 3.1 * t) * MMath.Cos(-2.0 * d + 2.0 * f + 2.0 * o); e += (977.0 - 0.5 * t) * MMath.Cos(+2.0 * f + 2.0 * o); e += (-895.0 + 0.5 * t) * MMath.Cos(+2.0 * o); e += (54.0 - 0.1 * t) * MMath.Cos(s); e += (-7.0) * MMath.Cos(m); e += (224.0 - 0.6 * t) * MMath.Cos(-2.0 * d + s + 2.0 * f + 2.0 * o); e += (200.0) * MMath.Cos(+2.0 * f + o); e += (129.0 - 0.1 * t) * MMath.Cos(m + 2.0 * f + 2.0 * o); e += (-95.0 + 0.3 * t) * MMath.Cos(-2.0 * d - s + 2.0 * f + 2.0 * o); e += (-70.0) * MMath.Cos(-2.0 * d + 2.0 * f + o); e += (-53.0) * MMath.Cos(-m + 2.0 * f + 2.0 * o); e += (-33.0) * MMath.Cos(m + o); e += (26.0) * MMath.Cos(2.0 * d - m + 2.0 * f + 2.0 * o); e += (32.0) * MMath.Cos(-m + o); e += (27.0) * MMath.Cos(m + 2.0 * f + o); e += (-24.0) * MMath.Cos(-2.0 * m + 2.0 * f + o); e += (16.0) * MMath.Cos(2.0 * d + 2.0 * f + 2.0 * o); e += (13.0) * MMath.Cos(+2.0 * m + 2.0 * f + 2.0 * o); e += (-12.0) * MMath.Cos(-2.0 * d + m + 2.0 * f + 2.0 * o); e += (-10.0) * MMath.Cos(-m + 2.0 * f + o); e += (-8.0) * MMath.Cos(2.0 * d - m + o); e += (7.0) * MMath.Cos(-2.0 * d + 2.0 * s + 2.0 * f + 2.0 * o); e += (9.0) * MMath.Cos(s + o); e += (7.0) * MMath.Cos(-2.0 * d + m + o); e += (6.0) * MMath.Cos(-s + o); e += (5.0) * MMath.Cos(2.0 * d - m + 2.0 * f + o); e += (3.0) * MMath.Cos(2.0 * d + m + 2.0 * f + 2.0 * o); e += (-3.0) * MMath.Cos(s + 2.0 * f + 2.0 * o); e += (3.0) * MMath.Cos(-s + 2.0 * f + 2.0 * o); e += (3.0) * MMath.Cos(2.0 * d + 2.0 * f + o); e += (-3.0) * MMath.Cos(-2.0 * d + 2.0 * m + 2.0 * f + 2.0 * o); e += (-3.0) * MMath.Cos(-2.0 * d + m + 2.0 * f + o); e += (3.0) * MMath.Cos(2.0 * d - 2.0 * m + o); e += (3.0) * MMath.Cos(2.0 * d + o); e += (3.0) * MMath.Cos(-2.0 * d - s + 2.0 * f + o); e += (3.0) * MMath.Cos(-2.0 * d + o); e += (3.0) * MMath.Cos(+2.0 * m + 2.0 * f + o); return(MMath.ToRad(e / (10000.0 * 3600.0))); }
// MMoon.m_LongitudeLow(double) /// <summary> /// Liefert die geozentrisch-ekliptikale Länge des Mondes zur julianischen Tageszahl in geringer Genauigkeit. /// </summary> /// <param name="jd">Julianische Tageszahl</param> /// <returns>Geozentrisch-ekliptikale Länge des Mondes zur julianischen Tageszahl.</returns> private static double m_LongitudeLow(double jd) { // Lokale Felder einrichten double t = (jd - 2451545.0) / 36525.0; double l = MMath.Mod(218.32 + 481267.883 * t, 360.0); // Terme aufsummieren l += 6.29 * MMath.Sin(MMath.ToRad(134.9 + 477198.85 * t)); l += -1.27 * MMath.Sin(MMath.ToRad(259.2 - 413335.38 * t)); l += 0.66 * MMath.Sin(MMath.ToRad(235.7 + 890534.23 * t)); l += 0.21 * MMath.Sin(MMath.ToRad(269.9 + 954397.70 * t)); l += -0.19 * MMath.Sin(MMath.ToRad(357.5 + 35999.05 * t)); l += -0.11 * MMath.Sin(MMath.ToRad(186.6 + 966404.05 * t)); return(MMath.ToRad(MMath.Mod(l, 360.0))); }
// MNeptune.MeanAnomaly(double) /// <summary> /// Liefert die mittlere Anomalie der mittleren Planetenbahn zur julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Mittlere Anomalie der mittleren Planetenbahn zur julianischen Tageszahl.</returns> /// <remarks>Die Winkelangabe erfolgt in Gradmaß.</remarks> public static double MeanAnomaly(double jd) { // Rückgabe return(MMath.Mod(MNeptune.MeanLongitude(jd) + MNeptune.LongitudeOfPerihelion(jd), 360.0)); }
// MEphemerides.NutationInLongitude(double) /// <summary> /// Liefert die Nutation der Länge zur julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Nutation der Länge zur julianischen Tageszahl.</returns> public static double NutationInLongitude(double jd) { // Lokale Felder einrichten double t = (jd - 2451545.0) / 36525.0; double d = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 297.85036, 445267.111480, -0.0019142, 1 / 189474)), MMath.Pi2); double s = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 357.52772, 35999.050340, -0.0001603, -1 / 300000)), MMath.Pi2); double m = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 134.96298, 477198.867398, 0.0086972, 1 / 56250)), MMath.Pi2); double f = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 93.27191, 483202.017538, -0.0036825, 1 / 327270)), MMath.Pi2); double o = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 125.04452, -1934.136261, 0.0020708, 1 / 450000)), MMath.Pi2); double p = 0.0; // Korrektur berechnen und anwenden p += (-171996.0 - 174.2 * t) * MMath.Sin(o); p += (-13187.0 - 1.6 * t) * MMath.Sin(-2.0 * d + 2.0 * f + 2.0 * o); p += (-2274.0 - 0.2 * t) * MMath.Sin(+2.0 * f + 2.0 * o); p += (2062.0 + 0.2 * t) * MMath.Sin(2.0 * o); p += (1426.0 - 3.4 * t) * MMath.Sin(s); p += (712.0 + 0.1 * t) * MMath.Sin(m); p += (-517.0 + 1.2 * t) * MMath.Sin(-2.0 * d + s + 2.0 * f + 2.0 * o); p += (-386.0 - 0.4 * t) * MMath.Sin(2.0 * f + o); p += (-301.0) * MMath.Sin(m + 2.0 * f + 2.0 * o); p += (217.0 - 0.5 * t) * MMath.Sin(-2.0 * d - s + 2.0 * f + 2.0 * o); p += (-158.0) * MMath.Sin(-2.0 * d + m); p += (129.0 + 0.1 * t) * MMath.Sin(-2.0 * d + 2.0 * f + o); p += (123.0) * MMath.Sin(-m + 2.0 * f + 2.0 * o); p += (63.0) * MMath.Sin(2.0 * d); p += (63.0 + 1.0 * t) * MMath.Sin(m + o); p += (-59.0) * MMath.Sin(2.0 * d - m + 2.0 * f + 2.0 * o); p += (-58.0 - 0.1 * t) * MMath.Sin(-m + o); p += (-51.0) * MMath.Sin(m + 2.0 * f + o); p += (48.0) * MMath.Sin(-2.0 * d + 2.0 * m); p += (46.0) * MMath.Sin(-2.0 * m + 2.0 * f + o); p += (-38.0) * MMath.Sin(2.0 * d + 2.0 * f + 2.0 * o); p += (-31.0) * MMath.Sin(+2.0 * m + 2.0 * f + 2.0 * o); p += (29.0) * MMath.Sin(+2.0 * m); p += (29.0) * MMath.Sin(-2.0 * d + m + 2.0 * f + 2.0 * o); p += (26.0) * MMath.Sin(+2.0 * f); p += (-22.0) * MMath.Sin(-2.0 * d + 2.0 * f); p += (21.0) * MMath.Sin(-m + 2.0 * f + o); p += (17.0 - 0.1 * t) * MMath.Sin(+2.0 * s); p += (16.0) * MMath.Sin(-m + o); p += (-16.0 + 0.1 * t) * MMath.Sin(-2.0 * d + 2.0 * s + 2.0 * f + 2.0 * o); p += (-15.0) * MMath.Sin(s + o); p += (-13.0) * MMath.Sin(-2.0 * d + m + o); p += (-12.0) * MMath.Sin(-s + o); p += (11.0) * MMath.Sin(+2.0 * m - 2.0 * f); p += (-10.0) * MMath.Sin(2.0 * d - m + 2.0 * f + o); p += (-8.0) * MMath.Sin(2.0 * d + m + 2.0 * f + 2.0 * o); p += (7.0) * MMath.Sin(s + 2.0 * f + 2.0 * o); p += (-7.0) * MMath.Sin(-2.0 * d + s + m); p += (-7.0) * MMath.Sin(-s + 2.0 * f + 2.0 * o); p += (-7.0) * MMath.Sin(2.0 * d + 2.0 * f + o); p += (6.0) * MMath.Sin(2.0 * d + m); p += (6.0) * MMath.Sin(-2.0 * d + 2.0 * m + 2.0 * f + 2.0 * o); p += (6.0) * MMath.Sin(-2.0 * d + m + 2.0 * f + o); p += (-6.0) * MMath.Sin(2.0 * d - 2.0 * m + o); p += (-6.0) * MMath.Sin(2.0 * d + o); p += (5.0) * MMath.Sin(-s + m); p += (-5.0) * MMath.Sin(-2.0 * d - s + 2.0 * f + o); p += (-5.0) * MMath.Sin(-2.0 * d + o); p += (-5.0) * MMath.Sin(+2.0 * m + 2.0 * f + o); p += (4.0) * MMath.Sin(-2.0 * d + 2.0 * m + o); p += (4.0) * MMath.Sin(-2.0 * d + s + 2.0 * f + o); p += (4.0) * MMath.Sin(-m - 2.0 * f); p += (-4.0) * MMath.Sin(-d - m); p += (-4.0) * MMath.Sin(-2.0 * d + s); p += (-4.0) * MMath.Sin(d); p += (3.0) * MMath.Sin(m + 2.0 * f); p += (-3.0) * MMath.Sin(-2.0 * m + 2.0 * f + 2.0 * o); p += (-3.0) * MMath.Sin(-d - s + m); p += (-3.0) * MMath.Sin(s + m); p += (-3.0) * MMath.Sin(s + m + 2.0 * f + 2.0 * o); p += (-3.0) * MMath.Sin(2.0 * d + s - m + 2.0 * f + 2.0 * o); p += (-3.0) * MMath.Sin(+3.0 * m + 2.0 * f + 2.0 * o); p += (-3.0) * MMath.Sin(2.0 * d - s + 2.0 * f + 2.0 * o); return(MMath.ToRad(p / (10000.0 * 3600.0))); }
// MMoon.m_LongitudeMedium(double) /// <summary> /// Liefert die geozentrisch-ekliptikale Länge des Mondes zur julianischen Tageszahl in mittlerer Genauigkeit. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Geozentrisch-ekliptikale Länge des Mondes zur julianischen Tageszahl.</returns> private static double m_LongitudeMedium(double jd) { // Lokale Felder einrichten double t = (jd - 2451545.0) / 36525.0; double dl = 0.0; double l = MMath.ToRad(MMath.Mod(MMath.Polynome(t, 218.3164477, 481267.88123421, -0.0015786, 1 / 538841, -1 / 65194000), 360.0)); double d = MMath.ToRad(MMath.Mod(MMath.Polynome(t, 297.8501921, 445267.1114034, -0.0018819, 1 / 545868, -1 / 113065000), 360.0)); double s = MMath.ToRad(MMath.Mod(MMath.Polynome(t, 357.5291092, 35999.0502909, -0.0001536, 1 / 24490000), 360.0)); double m = MMath.ToRad(MMath.Mod(MMath.Polynome(t, 134.9633964, 477198.8675055, 0.0087414, 1 / 69699, -1 / 14712000), 360.0)); double f = MMath.ToRad(MMath.Mod(MMath.Polynome(t, 93.2720950, 483202.0175233, -0.0036539, 1 / 3526000, 1 / 863310000), 360.0)); // Störungen durch Planeten Jupiter, Venus und Erde double a1 = MMath.ToRad(MMath.Mod(119.75 + 131.849 * t, 360.0)); double a2 = MMath.ToRad(MMath.Mod(53.09 + 479264.290 * t, 360.0)); double a3 = MMath.ToRad(MMath.Mod(313.45 + 481266.848 * t, 360.0)); // Terme für Extentrizität double e0 = 1.0; double e1 = MMath.Polynome(t, 1.0, -0.002516, -0.0000074); double e2 = e1 * e1; // Störungsterme aufsummieren dl += 6288774 * e0 * MMath.Sin(+m); dl += 1274027 * e0 * MMath.Sin(2.0 * d - m); dl += 658314 * e0 * MMath.Sin(2.0 * d); dl += 213618 * e0 * MMath.Sin(+2.0 * m); dl += -185116 * e1 * MMath.Sin(+s); dl += -114332 * e0 * MMath.Sin(+2.0 * f); dl += 58793 * e0 * MMath.Sin(2.0 * d - 2.0 * m); dl += 57066 * e1 * MMath.Sin(2.0 * d - s - m); dl += 53322 * e0 * MMath.Sin(2.0 * d + m); dl += 45758 * e1 * MMath.Sin(2.0 * d - s); dl += -40923 * e1 * MMath.Sin(+s - m); dl += -34720 * e0 * MMath.Sin(d); dl += -30383 * e1 * MMath.Sin(+s - m); dl += 15327 * e0 * MMath.Sin(2.0 * d - 2.0 * f); dl += -12528 * e0 * MMath.Sin(+m + 2.0 * f); dl += 10980 * e0 * MMath.Sin(+m - 2.0 * f); dl += 10675 * e0 * MMath.Sin(4.0 * d - m); dl += 10034 * e0 * MMath.Sin(+3.0 * m); dl += 8548 * e0 * MMath.Sin(4.0 * d - 2.0 * m); dl += -7888 * e1 * MMath.Sin(2.0 * d + s - m); dl += -6766 * e1 * MMath.Sin(2.0 * d + s); dl += -5163 * e0 * MMath.Sin(d - m); dl += 4987 * e1 * MMath.Sin(d + s); dl += 4036 * e1 * MMath.Sin(2.0 * d - s); dl += 3994 * e0 * MMath.Sin(2.0 * d + 2.0 * m); dl += 3861 * e0 * MMath.Sin(4.0 * d); dl += 3665 * e0 * MMath.Sin(2.0 * d - 3.0 * m); dl += -2689 * e1 * MMath.Sin(+s - 2.0 * m); dl += -2602 * e0 * MMath.Sin(2.0 * d - m + 2.0 * f); dl += 2390 * e1 * MMath.Sin(2.0 * d - s - 2.0 * m); dl += -2348 * e0 * MMath.Sin(d + m); dl += 2236 * e2 * MMath.Sin(2.0 * d + 2.0 * s); dl += -2120 * e1 * MMath.Sin(s + 2.0 * m); dl += -2069 * e2 * MMath.Sin(2.0 * s); dl += 2048 * e2 * MMath.Sin(2.0 * d - 2.0 * s - m); dl += -1773 * e0 * MMath.Sin(2.0 * d + m - 2.0 * f); dl += -1595 * e0 * MMath.Sin(2.0 * d + 2.0 * f); dl += 1215 * e1 * MMath.Sin(4.0 * d - s - m); dl += -1110 * e0 * MMath.Sin(2.0 * m + 2.0 * f); dl += -892 * e0 * MMath.Sin(3.0 * d - m); dl += -810 * e1 * MMath.Sin(2.0 * d + s + m); dl += 759 * e1 * MMath.Sin(4.0 * d - s - 2.0 * m); dl += -713 * e2 * MMath.Sin(2.0 * s - m); dl += -700 * e2 * MMath.Sin(2.0 * d + 2.0 * s - m); dl += 691 * e1 * MMath.Sin(2.0 * d - s - 2.0 * m); dl += 596 * e1 * MMath.Sin(2.0 * d - s - 2.0 * f); dl += 549 * e0 * MMath.Sin(4.0 * d + m); dl += 537 * e0 * MMath.Sin(4.0 * m); dl += 520 * e1 * MMath.Sin(4.0 * d - s); dl += -487 * e0 * MMath.Sin(d - 2.0 * m); dl += -399 * e1 * MMath.Sin(2.0 * d - s - 2.0 * f); dl += -381 * e0 * MMath.Sin(2.0 * m - 2.0 * f); dl += 351 * e1 * MMath.Sin(d + s + m); dl += -340 * e0 * MMath.Sin(3.0 * d - 2.0 * m); dl += 330 * e0 * MMath.Sin(4.0 * d - 3.0 * m); dl += 327 * e1 * MMath.Sin(2.0 * d - s + 2.0 * m); dl += -323 * e2 * MMath.Sin(2.0 * s + m); dl += 299 * e1 * MMath.Sin(d + s - m); dl += 294 * e0 * MMath.Sin(2.0 * d + 3.0 * m); // Störungen durch Planeten dl += 3958 * MMath.Sin(a1); dl += 1962 * MMath.Sin(l - f); dl += 318 * MMath.Sin(a2); // Terme anwenden und Länge normalisieren return(MMath.ToRad(MMath.Mod(l + dl / 1000000.0, 360.0))); }
// MMoon.NewMoon(double, ref EEclipseType) /// <summary> /// Setzt die Kennung der Finsternisabschätzung und liefert die julianische Tageszahl des nächsten Neumondes nach der julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <param name="type">Kennung der Finsternisabschätzung.</param> /// <returns>Julianische Tageszahl des nächsten Neumondes nach der julianischen Tageszahl.</returns> public static double NewMoon(double jd, ref EEclipseType type) { // Lokale Felder einrichten und Ereigniszeit berechen double y = (double)MCalendar.GregorianYear(jd) + MEphemerides.YearFragment(jd); double k = MMath.Floor(12.3685 * (y - 2000.0)) - 1.0; double j = 0.0; // Berechnungsschleife while (j <= jd) { // Lunation inkrementieren und lokale Felder einrichten k += 1.0; double t = k / 1236.85; // Näherung berechnen und Hilfsfelder einrichten j = MMath.Polynome(t, 2451550.09766 + 29.530588861 * k, 0.0, 0.00015437, -0.000000150, 0.00000000073); double e1 = MMath.Polynome(t, 1.0, -0.002516, -0.0000074); double e2 = e1 * e1; double m = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 2.5534 + 29.10535670 * k, 0.0, -0.0000014, -0.00000011)), MMath.Pi2); double a = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 201.5643 + 385.81693528 * k, 0.0, 0.0107582, 0.00001238, -0.000000058)), MMath.Pi2); double f = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 160.7108 + 390.67050284 * k, 0.0, -0.0016118, -0.00000227, 0.000000011)), MMath.Pi2); double o = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 124.7746 - 1.56375588 * k, 0.0, 0.0020672, 0.00000215)), MMath.Pi2); double h; // Korrektur berechnen h = -0.40720 * MMath.Sin(a); h += 0.17241 * e1 * MMath.Sin(m); h += 0.01608 * MMath.Sin(2.0 * a); h += 0.01039 * MMath.Sin(2.0 * f); h += 0.00739 * e1 * MMath.Sin(a - m); h += -0.00514 * e1 * MMath.Sin(a + m); h += 0.00208 * e2 * MMath.Sin(2.0 * m); h += -0.00111 * MMath.Sin(a - 2.0 * f); h += -0.00057 * MMath.Sin(a + 2.0 * f); h += 0.00056 * e1 * MMath.Sin(2.0 * a + m); h += -0.00042 * MMath.Sin(3.0 * a); h += 0.00042 * e1 * MMath.Sin(m + 2.0 * f); h += 0.00038 * e1 * MMath.Sin(m - 2.0 * f); h += -0.00024 * e1 * MMath.Sin(2.0 * a - m); h += -0.00017 * MMath.Sin(o); h += -0.00007 * MMath.Sin(a + 2.0 * m); h += 0.00004 * MMath.Sin(2.0 * a - 2.0 * f); h += 0.00004 * MMath.Sin(3.0 * m); h += 0.00003 * MMath.Sin(a + m - 2.0 * f); h += 0.00003 * MMath.Sin(2.0 * a + 2.0 * f); h += -0.00003 * MMath.Sin(a + m + 2.0 * f); h += 0.00003 * MMath.Sin(a - m + 2.0 * f); h += -0.00002 * MMath.Sin(a - m - 2.0 * f); h += -0.00002 * MMath.Sin(3.0 * a + m); h += 0.00002 * MMath.Sin(4.0 * a); // Störungen durch Planeten berechnen h += 0.000325 * MMath.Sin(MMath.ToRad(299.77 + 0.107408 * k - 0.009173 * t * t)); h += 0.000165 * MMath.Sin(MMath.ToRad(251.88 + 0.016321 * k)); h += 0.000164 * MMath.Sin(MMath.ToRad(251.83 + 26.651886 * k)); h += 0.000126 * MMath.Sin(MMath.ToRad(349.42 + 36.412478 * k)); h += 0.000110 * MMath.Sin(MMath.ToRad(84.66 + 18.206239 * k)); h += 0.000062 * MMath.Sin(MMath.ToRad(141.74 + 53.303771 * k)); h += 0.000060 * MMath.Sin(MMath.ToRad(207.14 + 2.453732 * k)); h += 0.000056 * MMath.Sin(MMath.ToRad(154.84 + 7.306860 * k)); h += 0.000047 * MMath.Sin(MMath.ToRad(34.52 + 27.261239 * k)); h += 0.000042 * MMath.Sin(MMath.ToRad(207.19 + 0.121824 * k)); h += 0.000040 * MMath.Sin(MMath.ToRad(291.34 + 1.844379 * k)); h += 0.000037 * MMath.Sin(MMath.ToRad(161.72 + 24.198154 * k)); h += 0.000035 * MMath.Sin(MMath.ToRad(239.56 + 25.513099 * k)); h += 0.000023 * MMath.Sin(MMath.ToRad(331.55 + 3.592518 * k)); // Korrekturen anwenden j += h; } // Ekliptikale Breite berechnen und Finsternisabschätzung bestimmen double b = MMath.Abs(MMoon.Latitude(EPrecision.Medium, j)); if (b < 0.015223) { type = EEclipseType.SunCentralDefinite; } else if (b < 0.018210) { type = EEclipseType.SunCentralPotential; } else if (b < 0.024595) { type = EEclipseType.SunPartialDefinite; } else if (b < 0.027586) { type = EEclipseType.SunPartialPotential; } else { type = EEclipseType.SunNoEclipse; } return(j); }
// MMoon.FirstQuarter(double) /// <summary> /// Liefert die julianische Tageszahl des nächsten ersten Viertels nach der julianischen Tageszahl. /// </summary> /// <param name="jd">Julianische Tageszahl.</param> /// <returns>Julianische Tageszahl des nächsten ersten Viertels nach der julianischen Tageszahl.</returns> public static double FirstQuarter(double jd) { // Lokale Felder einrichten double y = (double)MCalendar.GregorianYear(jd) + MEphemerides.YearFragment(jd); double k = MMath.Floor(12.3685 * (y - 2000.0)) - 0.75; double j = 0.0; // Berechnungsschleife while (j <= jd) { // Lunation inkrementieren und lokale Felder einrichten k += 1.0; double t = k / 1236.85; // Näherung berechnen und Hilfsfelder einrichten j = MMath.Polynome(t, 2451550.09766 + 29.530588861 * k, 0.0, 0.00015437, -0.000000150, 0.00000000073); double e1 = MMath.Polynome(t, 1.0, -0.002516, -0.0000074); double e2 = e1 * e1; double m = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 2.5534 + 29.10535670 * k, 0.0, -0.0000014, -0.00000011)), MMath.Pi2); double a = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 201.5643 + 385.81693528 * k, 0.0, 0.0107582, 0.00001238, -0.000000058)), MMath.Pi2); double f = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 160.7108 + 390.67050284 * k, 0.0, -0.0016118, -0.00000227, 0.000000011)), MMath.Pi2); double o = MMath.Mod(MMath.ToRad(MMath.Polynome(t, 124.7746 - 1.56375588 * k, 0.0, 0.0020672, 0.00000215)), MMath.Pi2); double h = 0.0; // Korrektur berechnen h = -0.62801 * MMath.Sin(a); h += 0.17172 * e1 * MMath.Sin(m); h += -0.01183 * e1 * MMath.Sin(a + m); h += 0.00862 * MMath.Sin(2.0 * a); h += 0.00804 * MMath.Sin(2.0 * f); h += 0.00454 * e1 * MMath.Sin(a - m); h += 0.00204 * e2 * MMath.Sin(2.0 * m); h += -0.00180 * MMath.Sin(a - 2.0 * f); h += -0.00070 * MMath.Sin(a + 2.0 * f); h += -0.00040 * MMath.Sin(3.0 * a); h += -0.00034 * e1 * MMath.Sin(2.0 * a - m); h += 0.00032 * e1 * MMath.Sin(m + 2.0 * f); h += 0.00032 * e1 * MMath.Sin(m - 2.0 * f); h += -0.00028 * e2 * MMath.Sin(a + 2.0 * m); h += 0.00027 * e1 * MMath.Sin(2.0 * a + m); h += -0.00017 * MMath.Sin(o); h += -0.00005 * MMath.Sin(a - m - 2.0 * f); h += 0.00004 * MMath.Sin(2.0 * a + 2.0 * f); h += -0.00004 * MMath.Sin(a + m + 2.0 * f); h += 0.00004 * MMath.Sin(a - 2.0 * m); h += 0.00003 * MMath.Sin(a + m - 2.0 * f); h += 0.00003 * MMath.Sin(3.0 * m); h += 0.00002 * MMath.Sin(2.0 * a - 2.0 * f); h += 0.00002 * MMath.Sin(a - m + 2.0 * f); h += -0.00002 * MMath.Sin(3.0 * a + m); // Viertelkorrektur berechnen h += 0.00306; h += -0.00038 * e1 * MMath.Cos(m); h += 0.00026 * MMath.Cos(a); h += -0.00002 * MMath.Cos(a - m); h += 0.00002 * MMath.Cos(a + m); h += 0.00002 * MMath.Cos(2.0 * f); // Störungen durch Planeten berechnen h += 0.000325 * MMath.Sin(MMath.ToRad(299.77 + 0.107408 * k - 0.009173 * t * t)); h += 0.000165 * MMath.Sin(MMath.ToRad(251.88 + 0.016321 * k)); h += 0.000164 * MMath.Sin(MMath.ToRad(251.83 + 26.651886 * k)); h += 0.000126 * MMath.Sin(MMath.ToRad(349.42 + 36.412478 * k)); h += 0.000110 * MMath.Sin(MMath.ToRad(84.66 + 18.206239 * k)); h += 0.000062 * MMath.Sin(MMath.ToRad(141.74 + 53.303771 * k)); h += 0.000060 * MMath.Sin(MMath.ToRad(207.14 + 2.453732 * k)); h += 0.000056 * MMath.Sin(MMath.ToRad(154.84 + 7.306860 * k)); h += 0.000047 * MMath.Sin(MMath.ToRad(34.52 + 27.261239 * k)); h += 0.000042 * MMath.Sin(MMath.ToRad(207.19 + 0.121824 * k)); h += 0.000040 * MMath.Sin(MMath.ToRad(291.34 + 1.844379 * k)); h += 0.000037 * MMath.Sin(MMath.ToRad(161.72 + 24.198154 * k)); h += 0.000035 * MMath.Sin(MMath.ToRad(239.56 + 25.513099 * k)); h += 0.000023 * MMath.Sin(MMath.ToRad(331.55 + 3.592518 * k)); // Korrekturen anwenden j += h; } return(j); }