/// <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); }