Esempio n. 1
0
        /// <summary>
        /// Constructeur d'une instance de Angle.
        /// </summary>
        /// <param name="a_valeur">Angle en décimale. Un angle modulo est accepté et est ramené dans le bon intervalle.</param>
        /// <param name="a_modulo">Type d'angle : [0 , 360°] pour TypeAngle.ANGLE_DEGRES_360, ]-180° , 180°] pour TypeAngle.ANGLE_DEGRES_180, [-90° , 90°] pour TypeAngle.ANGLE_DEGRES_90 ou [0h , 24h[ pour TypeAngle.ANGLE_HEURES_24. Ce paramètre est optionnel, par défaut c'est TypeAngle.ANGLE_DEGRES_360.</param>
        public Angle(double a_valeur, TypeAngle a_modulo = TypeAngle.ANGLE_DEGRES_360)
        {
            decimale = a_valeur;
            decimale = Maths.Modulo(decimale, a_modulo);

            int signe = 1;

            if (decimale < 0.0)
            {
                signe    = -1;
                decimale = -decimale;
            }
            degresOuHeures = (int)decimale;
            minute         = (int)(60.0 * (decimale - (double)degresOuHeures));
            seconde        = (float)(60 * (60.0 * (decimale - (double)degresOuHeures) - (double)minute));

            if ((signe == -1) && (degresOuHeures != 0))
            {
                degresOuHeures = -degresOuHeures;
            }
            if ((signe == -1) && (degresOuHeures == 0) && (minute != 0))
            {
                minute = -minute;
            }
            if ((signe == -1) && (degresOuHeures == 0) && (minute == 0))
            {
                seconde = -seconde;
            }
            if (signe == -1)
            {
                decimale = -decimale;
            }

            typeAngle = a_modulo;
        }
 /// <summary>
 /// Le constructeur
 /// </summary>
 /// <param name="contexVariables">Context des variables</param>
 /// <param name="listeFonc">Liste des fonctions</param>
 /// <param name="angle">Type d'angle pour les calcule trigonométriques</param>
 public EvaluationVisitor(IVariables contexVariables, ListeFonction listeFonc, TypeAngle angle)
 {
     _contexFonction  = null;
     _contexVariables = contexVariables;
     _listeFonc       = listeFonc;
     _typeAngle       = angle;
 }
Esempio n. 3
0
        /// <summary>
        /// Retourne un angle dans l'intervalle spécifié.
        /// </summary>
        /// <param name="a_angle">Angle à ramener dans le bon intervalle.</param>
        /// <param name="a_modulo">Type d'angle déterminant l'intervalle : : [0 , 360°] pour TypeAngle.ANGLE_DEGRES_360, ]-180° , 180°] pour TypeAngle.ANGLE_DEGRES_180, [-90° , 90°] pour TypeAngle.ANGLE_DEGRES_90 ou [0h , 24h[ pour TypeAngle.ANGLE_HEURES_24. Ce paramètre est optionnel, par défaut c'est TypeAngle.ANGLE_DEGRES_360.</param>
        /// <returns>Angle ramené dans l'intervalle spécifié.</returns>
        public static double Modulo(double a_angle, TypeAngle a_modulo = TypeAngle.ANGLE_DEGRES_360)
        {
            // Déclaration des variables
            double resultat = a_angle; // variable de retour de l'angle dans le bon intervalle
            int    arrondi;            // variable intermédiaire pour le forçage du type
            double facteur = 360;

            switch (a_modulo)
            {
            case TypeAngle.ANGLE_DEGRES_180:
                facteur = 180;
                break;

            case TypeAngle.ANGLE_DEGRES_90:
                facteur = 90;
                break;

            case TypeAngle.ANGLE_HEURES_24:
                facteur = 24;
                break;
            }

            if (facteur == 180)
            {
                a_angle += 180;
                if (a_angle < 0)
                {
                    arrondi  = (int)(Math.Abs(a_angle / 360));
                    resultat = a_angle + 360 * (double)(1 + arrondi) - 180;
                }
                else
                {
                    arrondi  = (int)(a_angle / 360);
                    resultat = a_angle - 360 * (double)arrondi - 180;
                }
            }

            if (facteur == 360 || facteur == 24)
            {
                if (a_angle < 0)
                {
                    arrondi  = (int)(a_angle / facteur);
                    resultat = a_angle + facteur * (double)(1 + Math.Abs(arrondi));
                }
                else
                {
                    arrondi  = (int)(System.Math.Abs(a_angle / facteur));
                    resultat = a_angle - facteur * (double)(arrondi);
                }
            }

            if (facteur == 90)
            {
                // A FAIRE SI BESOIN
            }

            return(resultat);
        }
Esempio n. 4
0
        // METHODES PUBLIQUES
        // CONSTRUCTEURS
        /// <summary>
        /// Constructeur d'une instance de Angle. La validité des paramètres est contrôlée, une exception de type ArgumentOutRangeException est levée en cas de non validité.
        /// </summary>
        /// <param name="a_degresOuHeures">Nombre de degrés ou d'heures de l'angle (compris entre 0 et 359 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_360, ou entre -179 et 180 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_180, ou entre -90 et 90 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_90, ou entre 0 et 23 lorsque a_modulo = TypeAngle.ANGLE_HEURES_90).</param>
        /// <param name="a_minute">Nombre de minutes de l'angle (compris entre 0 et 59 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_360 ou TypeAngle.ANGLE_HEURES_24, ou entre -59 et 59 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_180 ou TypeAngle.ANGLE_DEGRES_90).</param>
        /// <param name="a_seconde">Nombre de secondes de l'angle (compris entre [0f , 60f[ lorsque a_modulo = TypeAngle.ANGLE_DEGRES_360 ou TypeAngle.ANGLE_HEURES_24, ou entre ]-60f , 60f[ lorsque a_modulo = TypeAngle.ANGLE_DEGRES_180 ou TypeAngle.ANGLE_DEGRES_90).</param>
        /// <param name="a_modulo">Type d'angle : [0 , 360°] pour TypeAngle.ANGLE_DEGRES_360, ]-180° , 180°] pour TypeAngle.ANGLE_DEGRES_180, [-90° , 90°] pour TypeAngle.ANGLE_DEGRES_90 ou [0h , 24h[ pour TypeAngle.ANGLE_HEURES_24. Ce paramètre est optionnel, par défaut c'est TypeAngle.ANGLE_DEGRES_360.</param>
        public Angle(int a_degresOuHeures, int a_minute, float a_seconde, TypeAngle a_modulo = TypeAngle.ANGLE_DEGRES_360)
        {
            // Validation des arguments
            if (a_modulo != TypeAngle.ANGLE_DEGRES_360 && a_modulo != TypeAngle.ANGLE_DEGRES_180 && a_modulo != TypeAngle.ANGLE_DEGRES_90 && a_modulo != TypeAngle.ANGLE_HEURES_24)
            {
                throw new ArgumentOutOfRangeException("a_modulo", "Le paramètre a_modulo doit être une valeur de l'énumération TypeAngle");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_360 && (a_degresOuHeures < 0 || a_degresOuHeures > 359))
            {
                throw new ArgumentOutOfRangeException("a_degresOuHeures", "Le paramètre a_degresOuHeures doit être compris entre 0 et 359 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_360");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_180 && (a_degresOuHeures < -179 || a_degresOuHeures > 180))
            {
                throw new ArgumentOutOfRangeException("a_degresOuHeures", "Le paramètre a_degresOuHeures doit être compris entre -179 et 180 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_180");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_90 && (a_degresOuHeures < -90 || a_degresOuHeures > 90))
            {
                throw new ArgumentOutOfRangeException("a_degresOuHeures", "Le paramètre a_degresOuHeures doit être compris entre -90 et 90 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_90");
            }
            if (a_modulo == TypeAngle.ANGLE_HEURES_24 && (a_degresOuHeures < 0 || a_degresOuHeures > 23))
            {
                throw new ArgumentOutOfRangeException("a_degresOuHeures", "Le paramètre a_degresOuHeures doit être compris entre 0 et 23 lorsque a_modulo = TypeAngle.ANGLE_HEURES_24");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_180 && a_degresOuHeures == 180 && a_minute != 0)
            {
                throw new ArgumentOutOfRangeException("a_minute", "Le paramètre a_minute doit être égale à 0 si a_degresOuHeures = 180 et a_modulo = TypeAngle.ANGLE_DEGRES_180");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_180 && a_degresOuHeures == 180 && a_minute == 0 && a_seconde != 0f)
            {
                throw new ArgumentOutOfRangeException("a_seconde", "Le paramètre a_seconde doit être égale à 0f si a_degresOuHeures = 180 et a_modulo = TypeAngle.ANGLE_DEGRES_180");
            }
            if ((a_modulo == TypeAngle.ANGLE_DEGRES_180 || a_modulo == TypeAngle.ANGLE_DEGRES_90) && a_degresOuHeures == 0 && (a_minute < -59 || a_minute > 59))
            {
                throw new ArgumentOutOfRangeException("a_minute", "Le paramètre a_minute doit être compris entre -59 et 59 si a_degresOuHeures = 0 et a_modulo = TypeAngle.ANGLE_DEGRES_180 ou TypeAngle.ANGLE_DEGRES_90");
            }
            if ((a_modulo == TypeAngle.ANGLE_DEGRES_180 || a_modulo == TypeAngle.ANGLE_DEGRES_90) && a_degresOuHeures == 0 && (a_seconde <= -60f || a_seconde >= 60f))
            {
                throw new ArgumentOutOfRangeException("a_seconde", "Le paramètre a_seconde doit être compris entre ]60.0f , 60.0f[ si a_degresOuHeures = 0 et a_modulo = TypeAngle.ANGLE_DEGRES_180 ou TypeAngle.ANGLE_DEGRES_90");
            }
            if ((a_modulo == TypeAngle.ANGLE_DEGRES_360 || a_modulo == TypeAngle.ANGLE_HEURES_24) && (a_minute < 0 || a_minute > 59))
            {
                throw new ArgumentOutOfRangeException("a_minute", "Le paramètre a_minute doit être compris entre 0 et 59 lorsque a_modulo = TypeAngle.ANGLE_DEGRES_360 ou TypeAngle.ANGLE_HEURES_24");
            }
            if ((a_modulo == TypeAngle.ANGLE_DEGRES_360 || a_modulo == TypeAngle.ANGLE_HEURES_24) && (a_seconde < 0f || a_seconde >= 60f))
            {
                throw new ArgumentOutOfRangeException("a_seconde", "Le paramètre a_seconde doit être compris entre [0f , 60.0f[ lorsque a_modulo = TypeAngle.ANGLE_DEGRES_360 ou TypeAngle.ANGLE_HEURES_24");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_90 && (a_degresOuHeures == 90 || a_degresOuHeures == -90) && a_minute != 0)
            {
                throw new ArgumentOutOfRangeException("a_minute", "Le paramètre a_minute doit être égale à 0 si a_degresOuHeures = 90 ou -90 et a_modulo = TypeAngle.ANGLE_HEURES_24");
            }
            if (a_modulo == TypeAngle.ANGLE_DEGRES_90 && (a_degresOuHeures == 90 || a_degresOuHeures == -90) && a_minute == 0 && a_seconde != 0f)
            {
                throw new ArgumentOutOfRangeException("a_seconde", "Le paramètre a_seconde doit être égale à 0f si a_degresOuHeures = 90 ou -90 et a_modulo = TypeAngle.ANGLE_HEURES_24");
            }
            if ((a_modulo == TypeAngle.ANGLE_DEGRES_180 || a_modulo == TypeAngle.ANGLE_DEGRES_90) && a_degresOuHeures > 0 && a_minute < 0)
            {
                throw new ArgumentOutOfRangeException("a_minute", "Le paramètre a_minute doit être compris entre 0 et 59");
            }
            if ((a_modulo == TypeAngle.ANGLE_DEGRES_180 || a_modulo == TypeAngle.ANGLE_DEGRES_90) && a_degresOuHeures > 0 && a_seconde < 0f)
            {
                throw new ArgumentOutOfRangeException("a_seconde", "Le paramètre a_seconde doit être compris entre [0f et 60f[");
            }

            degresOuHeures = a_degresOuHeures;
            minute         = a_minute;
            seconde        = a_seconde;
            decimale       = Maths.CalculerAngleDecimal(a_degresOuHeures, a_minute, a_seconde);
            typeAngle      = a_modulo;
            if (decimale < 0 && degresOuHeures == 0)
            {
                if (minute < 0)
                {
                    seconde = Math.Abs(seconde);
                }
            }
        }