/// <summary>
 /// Показывает, видно ли когда-нибудь звезду.
 /// </summary>
 /// <param name="s">Звезда.</param>
 /// <param name="h">НАблюдатель</param>
 /// <returns>Потенциальная видимость звезды.</returns>
 public static bool IsEverVisible(Star s, Human h)
 {
     return(IsEverVisible(s, h.Location));
 }
        /// <summary>
        /// Возвращает положение звезды в Горизонтальной системе координат.
        /// То есть, координаты относительно горизонта и направления на Север.
        /// </summary>
        /// <param name="s">Звезда.</param>
        /// <param name="h">Наблюдатель.</param>
        /// <returns>Координаты звезды в горизонтальной системе координат.</returns>
        public static HorizontalCS GetCurrentStarLocation(Star s, Human h)
        {
            // 1.Вычисление модифицированной юлианской даты на начало суток MD.

            // Lon – долгота наблюдателя.
            double Lon = h.Location.Longitude.GetDegrees();
            // Lat - широта.
            double Lat = h.Location.Latitude.GetDegrees();

            // Время по Гринвичу.
            DateTime utc = h.UTC;

            // Прямое восхождение звезды.
            double RA = s.Location.RightAscension.GetDegrees();
            // Склонение звезды.
            double Dec = s.Location.Declination.GetDegrees();

            // Модифицировання Юлианская дата.
            double MD = ToModJulianDate(utc);

            // 2.Вычисление местного звездного времени на момент всемирного времени UT.

            // Гринвическое среднее звездное время в градусах.
            double Sg = GetGMST(MD);
            // Местное звездное время, среднее.
            double St = Sg + Lon;

            //3.Часовой угол звезды и высота над горизонтом.

            // Часовой угол.
            double Th = (St - RA) % 360;

            // Cos(z) = Sin(Lat) * Sin(Dec) + Cos(Lat) * Cos(Dec) * Cos(Th).
            // Косинус зенитного угла.
            double z = Math.Acos(
                Math.Sin(GetRadFromDeg(Lat))
                * Math.Sin(GetRadFromDeg(Dec))
                + Math.Cos(GetRadFromDeg(Lat))
                * Math.Cos(GetRadFromDeg(Dec))
                * Math.Cos(GetRadFromDeg(Th)));

            // Перевод в секунды.
            z = GetDegFromRad(z);

            // Высота над горизонтом.
            double H = 90 - z;

            // Az = atn2(Sin(Th) * Cos(Dec), (sin(H) * Sin(Lat) - Sin(Dec)) / Cos(Lat)).
            // Азимут звезды в радианах.
            double Az = Math.Atan2(
                Math.Sin(GetRadFromDeg(Th))
                * Math.Cos(GetRadFromDeg(Dec)),
                (Math.Sin(GetRadFromDeg(H)) * Math.Cos(GetRadFromDeg(Lat)) - Math.Sin(GetRadFromDeg(Dec)))
                / Math.Cos(GetRadFromDeg(Lat)));

            // Азимут звезды в градусах.
            double az = GetDegFromRad(Az);

            // Формируем координаты в горизонтальной системе координат.
            VerticalCord   altitude = new VerticalCord(GetSecondsFromGeg(H));
            HorizontalCord azimuth  = new HorizontalCord(GetSecondsFromGeg(az));

            return(new HorizontalCS(altitude, azimuth));
        }
        /// <summary>
        /// Показывает, видима ли звезда для наблюдателя.
        /// </summary>
        /// <param name="s">Звезда</param>
        /// <param name="h">Наблюдатель</param>
        /// <returns>Видима ли звезда</returns>
        public static bool IsStarVisible(Star s, Human h)
        {
            HorizontalCS horCS = GetCurrentStarLocation(s, h);

            return(horCS.Altitude.GetDegrees() >= 0);
        }