public static SkyPositionModel GetSkyPosition(
     this CelestialObjectPositionModel celestialObjectPosition,
     double latitude,
     SideRealTimeModel siderealTime)
 {
     return(GetSkyPosition(celestialObjectPosition.Declination, latitude, siderealTime.DateTimeOffset, siderealTime.SideRealTime));
 }
        public static RiseTransitSetModel GetRiseTransitSet(
            this CelestialObjectPositionModel celestialObjectPosition,
            CelestialObjectPositionModel earthPosition,
            double longitudeDegrees,
            double latitudeDegrees)
        {
            var transitTimeSpan = celestialObjectPosition.GetTransitTimeSpan(earthPosition, longitudeDegrees);

            var transit = new DateTimeOffset(
                celestialObjectPosition.ReferenceDate.DateTime.Year,
                celestialObjectPosition.ReferenceDate.DateTime.Month,
                celestialObjectPosition.ReferenceDate.DateTime.Day,
                transitTimeSpan.Hours,
                transitTimeSpan.Minutes,
                transitTimeSpan.Seconds,
                transitTimeSpan.Milliseconds,
                TimeSpan.Zero);

            var hourHorizonDegrees  = celestialObjectPosition.GetHourHorizon(latitudeDegrees, 0);
            var hourHorizonTimeSpan = DegreeHelper.DegreeToTimeSpan(hourHorizonDegrees);
            var rise = transit - hourHorizonTimeSpan;
            var set  = transit + hourHorizonTimeSpan;

            return(new RiseTransitSetModel(rise, transit, set));
        }
 public static double GetSiderealTime(
     this CelestialObjectPositionModel celestialObjectPosition,
     CelestialObjectModel celestialObject,
     KeplerianOrbitValueModel keplerianOrbitValue,
     DateTimeOffset referenceDate)
 {
     return(celestialObjectPosition.GetCelestialObjectSiderealTime(celestialObject, keplerianOrbitValue, (int)Math.Round(referenceDate.TimeOfDay.TotalMinutes), referenceDate.Offset.Minutes));
 }
 /// <summary>
 /// Θ = MEarth + ΠEarth + 15° (t+tz) (mod360°)
 /// </summary>
 /// <param name="celestialObjectPosition">
 /// The celestial Object Position.</param>
 /// <param name="minuteConstant">degree ratation per minute</param>
 /// <param name="keplerianOrbitValue"></param>
 /// <param name="utcMinutes"></param>
 /// <returns></returns>
 private static double GetSiderealTime(
     this CelestialObjectPositionModel celestialObjectPosition,
     double minuteConstant,
     KeplerianOrbitValueModel keplerianOrbitValue,
     int utcMinutes)
 {
     return(GetSiderealTime(celestialObjectPosition.MeanAnomaly, minuteConstant, keplerianOrbitValue, utcMinutes));
 }
 public static double GetCelestialObjectSiderealTime(
     this CelestialObjectPositionModel celestialObjectPosition,
     CelestialObjectModel celestialObject,
     KeplerianOrbitValueModel keplerianOrbitValue,
     int minute,
     int minuteOffset)
 {
     return(celestialObjectPosition.GetCelestialObjectSiderealTime(celestialObject, keplerianOrbitValue, minute - minuteOffset));
 }
        /// <summary>
        /// Θ = MEarth + ΠEarth + 15° (t+tz) (mod360°)
        /// </summary>
        /// <param name="celestialObjectPosition">
        /// The celestial Object Position.</param>
        /// <param name="celestialObject">The celestial Object.</param>
        /// <param name="keplerianOrbitValue"></param>
        /// <param name="utcMinutes"></param>
        /// <returns></returns>
        private static double GetCelestialObjectSiderealTime(
            this CelestialObjectPositionModel celestialObjectPosition,
            CelestialObjectModel celestialObject,
            KeplerianOrbitValueModel keplerianOrbitValue,
            int utcMinutes)
        {
            var minuteConstant = celestialObject.SiderealRotationPeriod / (int)Interval.Day;

            return(celestialObjectPosition.GetSiderealTime(minuteConstant, keplerianOrbitValue, utcMinutes));
        }
 public static double GetTransitDegrees(
     this CelestialObjectPositionModel celestialObjectPosition,
     CelestialObjectPositionModel earthPosition,
     double longitudeDegrees)
 {
     return(GetTransitDegrees(
                celestialObjectPosition.RightAscension,
                earthPosition.MeanAnomaly,
                longitudeDegrees));
 }
 public static IEnumerable <SideRealTimeModel> GetEarthSiderealTimePerDay(
     this CelestialObjectPositionModel celestialObjectPosition,
     Interval interval,
     int hourRange)
 {
     return(GetEarthSiderealTimePerDay(
                celestialObjectPosition.MeanAnomaly,
                celestialObjectPosition.ReferenceDate,
                interval,
                hourRange));
 }
        public static TimeSpan GetTransitTimeSpan(
            this CelestialObjectPositionModel celestialObjectPosition,
            CelestialObjectPositionModel earthPosition,
            double longitudeDegrees)
        {
            var degrees = celestialObjectPosition.GetTransitDegrees(
                earthPosition,
                longitudeDegrees);

            return(DegreeHelper.DegreeToTimeSpan(degrees));
        }
 public static IEnumerable <SkyPositionModel> GetSkyPositions(
     this CelestialObjectPositionModel celestialObjectPosition,
     double latitude,
     List <SideRealTimeModel> siderealTimes,
     RiseTransitSetModel transitModel)
 {
     foreach (var sideRealTime in siderealTimes.Where(x => x.DateTimeOffset >= transitModel.Rise &&
                                                      x.DateTimeOffset <= transitModel.Set))
     {
         yield return(celestialObjectPosition.GetSkyPosition(latitude, sideRealTime));
     }
 }
        private static double GetHourHorizon(
            this CelestialObjectPositionModel celestialObjectPosition,
            double latitudeDegrees,
            double h0)
        {
            if (h0.EqualsWithinTolerance(0, 6))
            {
                return(DegreeHelper.RadiansToDegrees(
                           Math.Acos(
                               -MathDegrees.Tan(latitudeDegrees) *
                               MathDegrees.Tan(celestialObjectPosition.Declination))));
            }

            return(DegreeHelper.RadiansToDegrees(Math.Acos(
                                                     (MathDegrees.Sin(h0) - (MathDegrees.Sin(latitudeDegrees) * MathDegrees.Sin(celestialObjectPosition.Declination))) /
                                                     (MathDegrees.Cos(latitudeDegrees) * MathDegrees.Cos(celestialObjectPosition.Declination)))));
        }
 public static double GetEarthSiderealTimeMidnight(
     this CelestialObjectPositionModel celestialObjectPosition)
 {
     return(GetEarthSiderealTimeMidnight(celestialObjectPosition.MeanAnomaly, celestialObjectPosition.ReferenceDate));
 }