// METHODES PRIVEES
        /// <summary>
        /// Calcule les paramètres d'une planète pour le lieu d'observation et la date de calcul spécifié. La méthode effectue tous les calculs du synoptique
        /// une seule fois sans calcul itératif de convergence pour les heures de lever et de coucher.
        /// </summary>
        /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
        /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du calcul.</param>
        /// <param name="a_essai">Incrémentation de l'heure TU de 23h56min04s lorsque cet argument prend une valeur de 1 pour forcer la 2ème solution possible si l'heure TU est proche de 0h.</param>
        private void CalculerNonIteratif(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil, int a_essai)
        {
            // Déclaration des variables locales de la méthode
            double distanceCalculPrecedent; // variable de calcul
            double precision;               // variable de calcul

            do
            {
                distanceCalculPrecedent = r;
                CalculerCoordonneesEcliptiquesEtRayonVecteur(a_lieuEtDateCalcul, type); // Algorithme 33
                CalculerDistanceALaTerre(a_terreSoleil);                                // Algorithme 34
                precision = r - distanceCalculPrecedent;
            } while (precision > 0.0000000001 || precision < -0.0000000001);


            CalculerCoordonneesEcliptiquesGeocentriquesGeometriques(a_terreSoleil);                    // Algorithme 15
            CalculerCorrectionsCoordonneesEcliptiquesAberration(a_lieuEtDateCalcul, a_terreSoleil);    // Algorithme 20
            CalculerCoordonneesEcliptiquesGeocentriques(a_lieuEtDateCalcul, deltaLambda4, deltaBeta4); // Algorithme 22
            ConvertirCoordonneesEcliptiquesVersEquatoriales(a_lieuEtDateCalcul);                       // Algorithme 12
            ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, true);                // Algorithme 13
            CalculerRefractionAtmospherique(a_lieuEtDateCalcul);                                       // Algorithme 24
            ConvertirCoordonneesHorizontalesVersEquatoriales(a_lieuEtDateCalcul);                      // Algorithme 14
            CalculerCorrectionCoordonneesEquatorialesRefraction();                                     // Algorithme 25
            CalculerCorrectionCoordonneesEquatorialesParallaxe(a_lieuEtDateCalcul);                    // Algorithme 26
            CalculerCoordonneesEquatorialesTopocentriques();                                           // Algorithme 27
            ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, false);               // Algorithme 13
            CalculerTaillePhaseMagnitude(a_lieuEtDateCalcul, a_terreSoleil);                           // Algorithme 35
            CalculerHeuresSideralesEtAzimutsLeverCoucher(a_lieuEtDateCalcul, r, taille.Decimale);      // Algorithme 28
            CalculerHeuresSideralesVraiesAGreenwichLeverCoucher(a_lieuEtDateCalcul);                   // Algorithme 7
            CalculerHeuresTULeverCoucher(a_lieuEtDateCalcul, a_essai);                                 // Algorithme 5
            CalculerHeuresLocalesLeverCoucher(a_lieuEtDateCalcul);                                     // Algorithme 2
        }
        // METHODES PRIVEES
        /// <summary>
        /// Calcule les paramètres d'une planète pour le lieu d'observation et la date de calcul spécifié. La méthode effectue tous les calculs du synoptique
        /// une seule fois sans calcul itératif de convergence pour les heures de lever et de coucher.
        /// </summary>
        /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
        /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du calcul.</param>
        /// <param name="a_essai">Incrémentation de l'heure TU de 23h56min04s lorsque cet argument prend une valeur de 1 pour forcer la 2ème solution possible si l'heure TU est proche de 0h.</param>
        private void CalculerNonIteratif(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil, int a_essai)
        {
            // Déclaration des variables locales de la méthode
            double distanceCalculPrecedent;                 // variable de calcul
            double precision;                               // variable de calcul

            if (type == TypeCorpsCeleste.COMETE_PERIODIQUE) // Cas d'une comète périodique
            {
                do
                {
                    // Affectation de la distance précédemment calculée à la variable distance_calcul_precedent
                    distanceCalculPrecedent = r;
                    CalculerAnomalieMoyenne(a_lieuEtDateCalcul);    // Algorithme 37
                    CalculerAnomalieVraieEtRayonVecteur();          // Algorithme 31
                    CalculerCoordonneesEcliptiqueHeliocentriques(); // Algorithme 32
                    CalculerDistanceALaTerre(a_terreSoleil);        // Algorithme 34
                    // Calcul de la précision sur la distance de la comète
                    precision = r - distanceCalculPrecedent;
                }while (precision > 0.0000000001 || precision < -0.0000000001);
            }
            else // Cas d'une comète périodique
            {
                do
                {
                    // Affectation de la distance précédemment calculée à la variable distance_calcul_precedent
                    distanceCalculPrecedent = r;
                    CalculerAnomalieVraieEtRayonVecteurParabolique(a_lieuEtDateCalcul); // Algorithme 38
                    CalculerCoordonneesEcliptiqueHeliocentriques();                     // Algorithme 32
                    CalculerDistanceALaTerre(a_terreSoleil);                            // Algorithme 34
                    // Calcul de la précision sur la distance de la comète
                    precision = r - distanceCalculPrecedent;
                }while (precision > 0.0000000001 || precision < -0.0000000001);
            }

            CalculerCoordonneesEcliptiquesGeocentriquesGeometriques(a_terreSoleil);                                              // Algorithme 15
            CalculerPrecessionEcliptiques(a_lieuEtDateCalcul);                                                                   // Algorithme 17
            CalculerCorrectionsCoordonneesEcliptiquesAberration(a_lieuEtDateCalcul, a_terreSoleil);                              // Algorithme 20
            CalculerCoordonneesEcliptiquesGeocentriques(a_lieuEtDateCalcul, deltaLambda4, deltaBeta4, deltaLambda2, deltaBeta2); // Algorithme 22
            ConvertirCoordonneesEcliptiquesVersEquatoriales(a_lieuEtDateCalcul);                                                 // Algorithme 12
            ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, true);                                          // Algorithme 13
            CalculerRefractionAtmospherique(a_lieuEtDateCalcul);                                                                 // Algorithme 24
            ConvertirCoordonneesHorizontalesVersEquatoriales(a_lieuEtDateCalcul);                                                // Algorithme 14
            CalculerCorrectionCoordonneesEquatorialesRefraction();                                                               // Algorithme 25
            CalculerCorrectionCoordonneesEquatorialesParallaxe(a_lieuEtDateCalcul);                                              // Algorithme 26
            CalculerCoordonneesEquatorialesTopocentriques();                                                                     // Algorithme 27
            ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, false);                                         // Algorithme 13
            CalculerHeuresSideralesEtAzimutsLeverCoucher(a_lieuEtDateCalcul, r, 0);                                              // Algorithme 28
            CalculerHeuresSideralesVraiesAGreenwichLeverCoucher(a_lieuEtDateCalcul);                                             // Algorithme 7
            CalculerHeuresTULeverCoucher(a_lieuEtDateCalcul, a_essai);                                                           // Algorithme 5
            CalculerHeuresLocalesLeverCoucher(a_lieuEtDateCalcul);                                                               // Algorithme 2
        }
Ejemplo n.º 3
0
        // Algorithme 15
        /// <summary>
        /// Calcule les coordonnées écliptiques géocentriques géométriques (non corrigées de l’aberration de la lumière et de la
        /// nutation) à partir de la longitude écliptique héliocentrique et du rayon vecteur de la Terre.
        /// </summary>
        /// <param name="a_terreSoleil">Objet représentant la Terre/le Soleil.</param>
        protected void CalculerCoordonneesEcliptiquesGeocentriquesGeometriques(CorpsSystemeSolaire a_terreSoleil)
        {
            // Déclaration des variables de la méthode
            double x, y; // variables de calcul

            // Calcul de la longitude écliptique géocentrique géométrique
            y = rSoleil * Math.Cos(Maths.DegToRad(b)) * Math.Sin(Maths.DegToRad(a_terreSoleil.L - l));
            x = a_terreSoleil.R - rSoleil * Math.Cos(Maths.DegToRad(b)) * Math.Cos(Maths.DegToRad(a_terreSoleil.L - l));
            lambdaGeometrique = 180.0 + a_terreSoleil.L + Maths.RadToDeg(Math.Atan2(y, x));
            lambdaGeometrique = Maths.Modulo(lambdaGeometrique, TypeAngle.ANGLE_DEGRES_360);

            // Calcul de la latitude écliptique géocentrique géométrique
            betaGeometrique = Maths.RadToDeg(Math.Atan((rSoleil * Math.Cos(Maths.DegToRad(b)) * Math.Tan(Maths.DegToRad(b)) * Math.Sin((Maths.DegToRad(lambdaGeometrique - l))) / (a_terreSoleil.R * Math.Sin(Maths.DegToRad(l - a_terreSoleil.L))))));
        }
 // METHODES PRIVEES
 /// <summary>
 /// Calcule les paramètres d'un objet du cie profond pour le lieu d'observation et la date de calcul spécifié. La méthode effectue tous les calculs du synoptique
 /// une seule fois sans calcul itératif de convergence pour les heures de lever et de coucher.
 /// </summary>
 /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
 /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du calcul.</param>
 private void CalculerNonIteratif(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil, int a_essai)
 {
     CalculerMouvementPropre(a_lieuEtDateCalcul);                                            // Algorithme 16
     CalculerCorrectionCoordonneesEquatorialesPrecession(a_lieuEtDateCalcul);                // Algorithme 18P
     CalculerCorrectionCoordonneesEquatorialesNutation(a_lieuEtDateCalcul);                  // Algorithme 19
     CalculerCorrectionCoordonneesEquatorialesAberration(a_lieuEtDateCalcul, a_terreSoleil); // Algorithme 21
     CalculerCoordonneesEquatorialesGeocentriques();                                         // Algorithme 23
     ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, true);             // Algorithme 13
     CalculerRefractionAtmospherique(a_lieuEtDateCalcul);                                    // Algorithme 24
     ConvertirCoordonneesHorizontalesVersEquatoriales(a_lieuEtDateCalcul);                   // Algorithme 14
     ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, false);            // Algorithme 13
     CalculerMagnitudeApparente();                                                           // Algorithme 39
     CalculerHeuresSideralesEtAzimutsLeverCoucher(a_lieuEtDateCalcul);                       // Algorithme 28
     CalculerHeuresSideralesVraiesAGreenwichLeverCoucher(a_lieuEtDateCalcul);                // Algorithme 7
     CalculerHeuresTULeverCoucher(a_lieuEtDateCalcul, a_essai);                              // Algorithme 5
     CalculerHeuresLocalesLeverCoucher(a_lieuEtDateCalcul);                                  // Algorithme 2
 }
 // METHODES PRIVEES
 /// <summary>
 /// Calcule les paramètres de la Lune pour le lieu d'observation et la date de calcul spécifié. La méthode effectue tous les calculs du synoptique
 /// une seule fois sans calcul itératif de convergence pour les heures de lever et de coucher.
 /// </summary>
 /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
 /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du calcul.</param>
 /// <param name="a_essai">Incrémentation de l'heure TU de 23h56min04s lorsque cet argument prend une valeur de 1 pour forcer la 2ème solution possible si l'heure TU est proche de 0h.</param>
 public void CalculerNonIteratif(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil, int a_essai)
 {
     CalculerCoordoonneesEcliptiquesEtRayonVecteur(a_lieuEtDateCalcul);                    // Algorithme 40
     ConvertirCoordonneesEcliptiquesVersEquatoriales(a_lieuEtDateCalcul);                  // Algorithme 12
     ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, true);           // Algorithme 13
     CalculerRefractionAtmospherique(a_lieuEtDateCalcul);                                  // Algorithme 24
     ConvertirCoordonneesHorizontalesVersEquatoriales(a_lieuEtDateCalcul);                 // Algorithme 14
     CalculerCorrectionCoordonneesEquatorialesRefraction();                                // Algorithme 25
     CalculerCorrectionCoordonneesEquatorialesParallaxe(a_lieuEtDateCalcul);               // Algorithme 26
     CalculerCoordonneesEquatorialesTopocentriques();                                      // Algorithme 27
     ConvertirCoordonneesEquatorialesVersHorizontales(a_lieuEtDateCalcul, false);          // Algorithme 13
     CalculerPhaseEtTailleApparenteLune(a_terreSoleil);                                    // Algorithme 41
     CalculerHeuresSideralesEtAzimutsLeverCoucher(a_lieuEtDateCalcul, r, taille.Decimale); // Algorithme 28
     CalculerHeuresSideralesVraiesAGreenwichLeverCoucher(a_lieuEtDateCalcul);              // Algorithme 7
     CalculerHeuresTULeverCoucher(a_lieuEtDateCalcul, 0);                                  // Algorithme 5
     CalculerHeuresLocalesLeverCoucher(a_lieuEtDateCalcul);                                // Algorithme 2
 }
        // ***** ALGORITHME 41 *****
        private void CalculerPhaseEtTailleApparenteLune(CorpsSystemeSolaire a_terreSoleil)
        {
            // Déclaration des variables de la méthode
            double elongation, x, y;                // variable de calcul
            double angle_phase, taille_centre_lune; // variable de calcul

            // Calcul de l'élongation de la Lune au Soleil
            elongation = Maths.RadToDeg(Math.Acos(Math.Cos(Maths.DegToRad(beta.Decimale)) * Math.Cos(Maths.DegToRad(lambdaGeometrique - a_terreSoleil.LambdaGeometrique))));

            // Calcul de l'angle de phase
            y           = 149598500 * a_terreSoleil.R * Math.Sin(Maths.DegToRad(elongation));
            x           = r - 149598500 * a_terreSoleil.R * Math.Cos(Maths.DegToRad(elongation));
            angle_phase = Maths.RadToDeg(Math.Atan2(y, x));

            // Calcul de la phase
            phase = (1.0 + Math.Cos(Maths.DegToRad(angle_phase))) / 2.0;

            // Calcul de la taille apparente de la Lune vu du centre de la Terre
            taille_centre_lune = 2 * Maths.RadToDeg(Math.Asin(1737.92196534 / r));

            // Calcul de la taille apparente de la Lune vu du lieu d'observation
            taille = new Angle(taille_centre_lune * (1 + Math.Sin(Maths.DegToRad(altitudeTopocentrique.Decimale)) * (6378.14 / r)), TypeAngle.ANGLE_DEGRES_360);
        }
 /// <summary>
 /// Calcule les paramètres d'une planète pour le lieu d'observation et la date de calcul spécifié. La méthode effectue tous les calculs du synoptique
 /// une seule fois sans calcul itératif de convergence pour les heures de lever et de coucher.
 /// </summary>
 /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
 /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du calcul.</param>
 public void CalculerNonIteratif(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil)
 {
     CalculerNonIteratif(a_lieuEtDateCalcul, a_terreSoleil, 0);
 }
        // Algorithme 35
        /// <summary>
        /// Calcule la taille apparente, la phase et la magnitude apparente des planètes à partir de la distance des planètes à la Terre,
        /// du rayon vecteur des planètes, de la taille apparente des planètes à 1 UA, de l’altitude topocentrique des planètes et du
        /// rayon vecteur de la Terre.
        /// </summary>
        /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
        /// <param name="a_terreSoleil">Objet représentant la Terre/le Soleil.</param>
        private void CalculerTaillePhaseMagnitude(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil)
        {
            // Déclaration des variables de la méthode
            double i, z;                                                                 // variable de calcul

            double[] taille_1UA = { 6.72, 16.82, 9.36, 196.88, 165.40, 70.04, 67.00 };   // taille apparente des planètes à 1 UA

            // Calcul de l'angle de phase (en radians)
            i = Math.Acos((rSoleil * rSoleil + r * r - a_terreSoleil.R * a_terreSoleil.R) / (2 * rSoleil * r));

            // Calcul de la phase
            phase = (1 + Math.Cos(i)) / 2;

            // Conversion de l'angle de phase en degrés
            i = Maths.RadToDeg(i);

            // Cas de Mercure
            if (type == TypeCorpsCeleste.MERCURE)
            {
                taille = new Angle((float)(taille_1UA[0] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[0] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -0.42 + 5 * Math.Log10(rSoleil * r) + 0.0380 * i - 0.000273 * i * i + 0.000002 * i * i * i;
            }

            // Cas de Vénus
            if (type == TypeCorpsCeleste.VENUS)
            {
                taille = new Angle((float)(taille_1UA[1] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[1] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -4.40 + 5 * Math.Log10(rSoleil * r) + 0.0009 * i + 0.000239 * i * i - 0.00000065 * i * i * i;
            }

            // Cas de Mars
            if (type == TypeCorpsCeleste.MARS)
            {
                taille = new Angle((float)(taille_1UA[2] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[2] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -1.52 + 5 * Math.Log10(rSoleil * r) + 0.016 * i;
            }

            // Cas de Jupiter
            if (type == TypeCorpsCeleste.JUPITER)
            {
                taille = new Angle((float)(taille_1UA[3] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[3] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -9.40 + 5 * Math.Log10(rSoleil * r) + 0.005 * i;
            }

            // Cas de Saturne
            if (type == TypeCorpsCeleste.SATURNE)
            {
                taille = new Angle((float)(taille_1UA[4] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[4] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -8.88 + 5 * Math.Log10(rSoleil * r) + 0.044 * i;
            }

            // Cas de Uranus
            if (type == TypeCorpsCeleste.URANUS)
            {
                taille = new Angle((float)(taille_1UA[5] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[5] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -7.19 + 5 * Math.Log10(rSoleil * r);
            }

            // Cas de Neptune
            if (type == TypeCorpsCeleste.NEPTUNE)
            {
                taille = new Angle((float)(taille_1UA[6] / r) / 3600, TypeAngle.ANGLE_DEGRES_360);
                //taille = new Angle(0, 0, (float)(taille_1UA[6] / r), TypeAngle.ANGLE_DEGRES_360);
                magnitude = -6.87 + 5 * Math.Log10(rSoleil * r);
            }

            // Calcul de la baisse de magnitude due à l'extinction atmosphérique
            z = 90.0 - altitudeTopocentrique.Decimale;
            deltaMagnitude = 0.2 / Math.Cos(Maths.DegToRad(z));
        }
        // Algorithme 20
        /// <summary>
        /// Calcule les corrections dues à l’aberration de la lumière à apporter sur les coordonnées écliptiques géocentriques géométriques d’une planète
        /// ou d’une comète à partir du Jour Julien des Ephémérides, de la longitude écliptique géocentrique géométrique du Soleil et des coordonnées écliptiques
        /// géocentriques géométriques de la planète ou de la comète.
        /// </summary>
        /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
        /// <param name="a_terreSoleil">Objet représentant la Terre/le Soleil.</param>
        private void CalculerCorrectionsCoordonneesEcliptiquesAberration(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil)
        {
            // Déclaration des variables de la méthode
            double T, et, pit; // variables de calcul

            // Calcul du nombre de siècles depuis le 1,5 janvier 2000
            T = (a_lieuEtDateCalcul.JourJulienEphemerides - 2451545.0) / 36525.0;

            // Calcul de l'excentricité de l'orbite de la Terre
            et = 0.016708617 - 0.000042037 * T - 0.0000001236 * T * T + 0.00000000004 * T * T * T;

            // Calcul de la longitude du perihélie de la Terre
            pit = 102.937348 + 1.7195269 * T + 0.00045962 * T * T + 0.000000499 * T * T * T;

            // Calcul de la correction à apporter sur la longitude écliptique géocentrique géométrique de la planète ou de la comète
            deltaLambda4  = (-20.49552 * Math.Cos(Maths.DegToRad(a_terreSoleil.LambdaGeometrique - lambdaGeometrique)) + 20.49552 * et * Math.Cos(Maths.DegToRad(pit - lambdaGeometrique))) / Math.Cos(Maths.DegToRad(betaGeometrique));
            deltaLambda4 /= 3600.0;

            // Calcul de la correction à apporter sur la latitude écliptique géocentrique géométrique de la planète ou de la comète
            deltaBeta4  = -20.49552 * Math.Sin(Maths.DegToRad(betaGeometrique)) * (Math.Sin(Maths.DegToRad(a_terreSoleil.LambdaGeometrique - lambdaGeometrique)) - et * Math.Sin(Maths.DegToRad(pit - lambdaGeometrique)));
            deltaBeta4 /= 3600.0;
        }
        /// <summary>
        /// Calcule les paramètres d'une planète pour le lieu d'observation et la date de calcul spécifié. La méthode effectue tous les calculs du synoptique
        /// de façon itérative jusqu'à convergence des heures de lever et de coucher.
        /// </summary>
        /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
        /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du caluul.</param>
        /// <returns>Résultat du succès (true) ou de l'échec (false) du calcul de convergence des heures de lever et de coucher.</returns>
        public bool CalculerIteratif(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil)
        {
            // Déclaration des variables de la méthode
            double        heureSideraleVraieLocaleLever;         // Heure sidérale vraie locale de lever
            double        azimutLever;                           // Azimut de lever
            double        heureSideraleVraieLocaleCoucher;       // Heure sidérale vraie locale de coucher
            double        azimutCoucher;                         // Azimut de coucher
            double        heureSideraleVraieAGreenwichLever;     // Heure sidérale vraie à Greenwich de lever
            double        heureSideraleVraieAGreenwichCoucher;   // Heure sidérale vraie à Greenwich de coucher
            double        heureTULever;                          // Heure TU de lever
            double        heureTUCoucher;                        // Heure TU de coucher
            DateTime      heureLocaleLever     = new DateTime(); // Heure locale de lever
            DateTime      heureLocaleCoucher   = new DateTime(); // Heure locale de coucher
            TimeSpan      precision            = new TimeSpan(); // variable de contrôle de la convergence
            PositionTemps dateTemporaireCalcul = null;           // Objet PositionTemps pour le calcul en temps différé
            Soleil        terreSoleil          = null;           // Objet Soleil pour le calcul en temps différé des paramètres du Soleil
            int           compteur;                              // Variable de contrôle de la convergence du calcul
            bool          succes = true;

            // Calcul initial des paramètres de la planète
            CalculerNonIteratif(a_lieuEtDateCalcul, a_terreSoleil);

            // Sauvegarde des heures de lever et de coucher
            heureSideraleVraieLocaleLever = this.heureSideraleVraieLocaleLever;
            azimutLever = this.azimutLever;
            heureSideraleVraieLocaleCoucher = this.heureSideraleVraieLocaleCoucher;
            azimutCoucher = this.azimutCoucher;
            heureSideraleVraieAGreenwichLever   = this.heureSideraleVraieAGreenwichLever;
            heureSideraleVraieAGreenwichCoucher = this.heureSideraleVraieAGreenwichCoucher;
            heureTULever       = this.heureTULever;
            heureTUCoucher     = this.heureTUCoucher;
            heureLocaleLever   = this.heureLocaleLever;
            heureLocaleCoucher = this.heureLocaleCoucher;

            // Création et initialisation d'un nouvel objet PositionTemps pour calculer les heures de lever et de coucher en temps différé
            dateTemporaireCalcul = new PositionTemps(a_lieuEtDateCalcul.LieuObservation, a_lieuEtDateCalcul.HeureLocale.Year, a_lieuEtDateCalcul.HeureLocale.Month, a_lieuEtDateCalcul.HeureLocale.Day, heureLocaleLever.Hour, heureLocaleLever.Minute, 0, a_lieuEtDateCalcul.ZoneHoraire, a_lieuEtDateCalcul.ChangementHeure, a_lieuEtDateCalcul.DeltaT);

            // Calcul itératif pour l'heure de lever de la planète
            compteur = 0;
            do
            {
                // Paramétrage de l'objet dateTemporaireCalcul avec l'heure de lever précédemment calculée
                dateTemporaireCalcul.HeureLocale = heureLocaleLever;
                // Calcul de dateTemporaireCalcul avec les nouveaux réglages
                dateTemporaireCalcul.CalculerParametres();

                // Création et initialisation d'un nouvel objet Soleil pour calculer les heures de lever et de coucher en temps différé
                terreSoleil = new Soleil();
                terreSoleil.CalculerNonIteratif(dateTemporaireCalcul);

                // Calcul des paramètres de la planète à l'instant différé
                CalculerNonIteratif(dateTemporaireCalcul, terreSoleil);

                // Au-delà de 6 itérations si le calcul n'a pas convergé, la méthode force la 2ème solution TU en ajoutant +23h56min04s si l'heure TU est compris entre 0h TU et 03h3min56s
                if (compteur >= 6)
                {
                    CalculerNonIteratif(dateTemporaireCalcul, terreSoleil, 1);
                }

                // Calcul de la précision atteinte
                precision = this.heureLocaleLever - heureLocaleLever;

                // Détection d'une absence de solution (cas d'un lever du corps céleste proche de minuit et oscillant autour de minuit)
                if (precision > TimeSpan.FromHours(20))
                {
                    this.azimutLever = TOUJOURS_INVISIBLE;
                    this.heureSideraleVraieLocaleLever     = TOUJOURS_INVISIBLE;
                    this.heureSideraleVraieAGreenwichLever = TOUJOURS_INVISIBLE;
                    this.heureTULever     = TOUJOURS_INVISIBLE;
                    this.heureLocaleLever = new DateTime();
                    precision             = TimeSpan.FromSeconds(1);
                }

                // Sauvegarde de la nouvelle heure de lever
                heureSideraleVraieLocaleLever = this.heureSideraleVraieLocaleLever;
                azimutLever = this.azimutLever;
                heureSideraleVraieAGreenwichLever = this.heureSideraleVraieAGreenwichLever;
                heureTULever     = this.heureTULever;
                heureLocaleLever = this.heureLocaleLever;

                // Incrémentation du compteur
                compteur++;

                // Au-delà de 10 itérations si le calcul n'a pas convergé, la méthode la boucle est stoppée
                if (compteur == 10)
                {
                    succes    = false;
                    precision = TimeSpan.FromSeconds(1);
                }
            } while (precision > TimeSpan.FromSeconds(59.0)); // Précision de 1 minute

            // Calcul itératif pour l'heure de coucher de la planète
            compteur = 0;
            do
            {
                // Paramétrage de l'objet dateTemporaireCalcul avec l'heure de coucher précédemment calculée
                dateTemporaireCalcul.HeureLocale = heureLocaleCoucher;
                // Calcul de dateTemporaireCalcul avec les nouveaux réglages
                dateTemporaireCalcul.CalculerParametres();

                // Création et initialisation d'un nouvel objet Soleil pour calculer les heures de lever et de coucher en temps différé
                terreSoleil = new Soleil();
                terreSoleil.CalculerNonIteratif(dateTemporaireCalcul);

                // Calcul des paramètres de la planète à l'instant différé
                CalculerNonIteratif(dateTemporaireCalcul, terreSoleil);

                // Au-delà de 6 itérations si le calcul n'a pas convergé, la méthode force la 2ème solution TU en ajoutant +23h56min04s si l'heure TU est compris entre 0h TU et 03h3min56s
                if (compteur >= 6)
                {
                    CalculerNonIteratif(dateTemporaireCalcul, terreSoleil, 1);
                }

                // Calcul de la précision atteinte
                precision = this.heureLocaleCoucher - heureLocaleCoucher;

                // Détection d'une absence de solution (cas d'un coucher du corps céleste proche de minuit et oscillant autour de minuit)
                if (precision > TimeSpan.FromHours(20))
                {
                    this.azimutCoucher = TOUJOURS_INVISIBLE;
                    this.heureSideraleVraieLocaleCoucher     = TOUJOURS_INVISIBLE;
                    this.heureSideraleVraieAGreenwichCoucher = TOUJOURS_INVISIBLE;
                    this.heureTUCoucher     = TOUJOURS_INVISIBLE;
                    this.heureLocaleCoucher = new DateTime();
                    precision = TimeSpan.FromSeconds(1);
                }

                // Sauvegarde de la nouvelle heure de coucher
                heureSideraleVraieLocaleCoucher = this.heureSideraleVraieLocaleCoucher;
                azimutCoucher = this.azimutCoucher;
                heureSideraleVraieAGreenwichCoucher = this.heureSideraleVraieAGreenwichCoucher;
                heureTUCoucher     = this.heureTUCoucher;
                heureLocaleCoucher = this.heureLocaleCoucher;

                // Incrémentation du compteur
                compteur++;

                // Au-delà de 10 itérations si le calcul n'a pas convergé, la méthode la boucle est stoppée
                if (compteur == 10)
                {
                    succes    = false;
                    precision = TimeSpan.FromSeconds(1);
                }
            } while (precision > TimeSpan.FromSeconds(59.0)); // Précision de 1 minute

            // Calcul des paramètres du Soleil pour la date et l'heure considérée
            CalculerNonIteratif(a_lieuEtDateCalcul, a_terreSoleil);

            // Affectation des heures de lever et de coucher calculées
            this.heureSideraleVraieLocaleLever = heureSideraleVraieLocaleLever;
            this.azimutLever = azimutLever;
            this.heureSideraleVraieLocaleCoucher = heureSideraleVraieLocaleCoucher;
            this.azimutCoucher = azimutCoucher;
            this.heureSideraleVraieAGreenwichLever   = heureSideraleVraieAGreenwichLever;
            this.heureSideraleVraieAGreenwichCoucher = heureSideraleVraieAGreenwichCoucher;
            this.heureTULever       = heureTULever;
            this.heureTUCoucher     = heureTUCoucher;
            this.heureLocaleLever   = heureLocaleLever;
            this.heureLocaleCoucher = heureLocaleCoucher;

            return(succes);
        }
        // ***** ALGORITHME 21 *****
        /// <summary>
        /// Calcule les corrections dues à l’aberration de la lumière à apporter sur les coordonnées équatoriales géocentriques géométriques d’un corps céleste à partir du Jour Julien des Ephémérides correspondant
        /// à la date et l’heure considérées, de la longitude écliptique géocentrique géométrique du Soleil, de l’obliquité moyenne, de la nutation en obliquité, des coordonnées équatoriales géocentriques
        /// géométriques du corps céleste à l’époque J2000, des corrections dues au mouvement propre et des corrections dues à la précession.
        /// </summary>
        /// <param name="a_lieuEtDateCalcul">Lieu d'observation et date pour le calcul.</param>
        /// <param name="a_terreSoleil">Objet Soleil calculé pour le lieu d'observation et la date du calcul.</param>
        private void CalculerCorrectionCoordonneesEquatorialesAberration(PositionTemps a_lieuEtDateCalcul, CorpsSystemeSolaire a_terreSoleil)
        {
            // Déclaration des variables de la méthode
            double T, et, pit; // variables de calcul

            // Calcul du nombre de siècles depuis le 1,5 janvier 2000
            T = (a_lieuEtDateCalcul.JourJulienEphemerides - 2451545.0) / 36525.0;

            // Calcul de l'excentricité de l'orbite de la Terre
            et = 0.016708617 - 0.000042037 * T - 0.0000001236 * T * T + 0.00000000004 * T * T * T;

            // Calcul de la longitude du perihélie de la Terre
            pit = 102.937348 + 1.7195269 * T + 0.00045962 * T * T + 0.000000499 * T * T * T;

            // Calcul de la correction à apporter sur la longitude écliptique géocentrique géométrique
            deltaAlpha4 = -20.49552 * ((Math.Cos(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2))) * Math.Cos(Maths.DegToRad(a_terreSoleil.LambdaGeometrique))
                                        * Math.Cos(Maths.DegToRad(a_lieuEtDateCalcul.ObliquiteMoyenne + a_lieuEtDateCalcul.NutationObliquite)) + Math.Sin(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2)))
                                        * Math.Sin(Maths.DegToRad(a_terreSoleil.LambdaGeometrique))) / Math.Cos(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2)))
                          + 20.49552 * et * ((Math.Cos(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2))) * Math.Cos(Maths.DegToRad(pit))
                                              * Math.Cos(Maths.DegToRad(a_lieuEtDateCalcul.ObliquiteMoyenne + a_lieuEtDateCalcul.NutationObliquite)) + Math.Sin(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2))) * Math.Sin(Maths.DegToRad(pit)))
                                             / Math.Cos(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2)));

            deltaAlpha4 = deltaAlpha4 / 54000.0; // corrections en heure

            // Calcul de la correction à apporter sur la déclinaison géocentrique géométrique
            deltaDelta4 = -20.49552 * (Math.Cos(Maths.DegToRad(a_terreSoleil.LambdaGeometrique)) * Math.Cos(Maths.DegToRad(a_lieuEtDateCalcul.ObliquiteMoyenne + a_lieuEtDateCalcul.NutationObliquite)) * (Math.Tan(Maths.DegToRad(a_lieuEtDateCalcul.ObliquiteMoyenne + a_lieuEtDateCalcul.NutationObliquite))
                                                                                                                                                                                                           * Math.Cos(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2)) - Math.Sin(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2)))
                                                                                                                                                                                                           * Math.Sin(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2))) + Math.Cos(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2)))
                                       * Math.Sin(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2)) * Math.Sin(Maths.DegToRad(a_terreSoleil.LambdaGeometrique)))
                          + 20.49552 * et * (Math.Cos(Maths.DegToRad(pit)) * Math.Cos(Maths.DegToRad(a_lieuEtDateCalcul.ObliquiteMoyenne + a_lieuEtDateCalcul.NutationObliquite)) * (Math.Tan(Maths.DegToRad(a_lieuEtDateCalcul.ObliquiteMoyenne + a_lieuEtDateCalcul.NutationObliquite))
                                                                                                                                                                                     * Math.Cos(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2)) - Math.Sin(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2)))
                                                                                                                                                                                     * Math.Sin(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2))) + Math.Cos(Maths.DegToRad(15 * (objetCielProfond.AlphaJ2000.Decimale + deltaAlpha1 + deltaAlpha2)))
                                             * Math.Sin(Maths.DegToRad(objetCielProfond.DeltaJ2000.Decimale + deltaDelta1 + deltaDelta2)) * Math.Sin(Maths.DegToRad(pit))); // correction en secondes d'arc

            deltaDelta4 = deltaDelta4 / 3600.0;                                                                                                                             // corrections en degrés
        }
Ejemplo n.º 12
0
 // Algorithme 34
 /// <summary>
 /// Calcule la distance à la Terre des planètes et des comètes à partir de la longitude et de la latitude écliptiques
 /// héliocentriques et du rayon vecteur des planètes et des comètes, ainsi que la longitude écliptique héliocentrique
 /// et le rayon vecteur de la Terre.
 /// </summary>
 /// <param name="a_terreSoleil">Objet représentant la Terre/le Soleil.</param>
 protected void CalculerDistanceALaTerre(CorpsSystemeSolaire a_terreSoleil)
 {
     r = Math.Sqrt(a_terreSoleil.R * a_terreSoleil.R + rSoleil * rSoleil - 2 * a_terreSoleil.R * rSoleil * Math.Cos(Maths.DegToRad(l - a_terreSoleil.L)) * Math.Cos(Maths.DegToRad(b)));
 }