/// <summary> /// Calculates solar position for a given location and point in time /// </summary> /// <param name="date">time and date calculate for</param> /// <param name="latitude">latitude in degrees</param> /// <param name="longitude">longitude in degrees</param> /// <returns></returns> public static SunPosition GetPosition(DateTime date, double latitude, double longitude) { double lw = Constants.Rad * -longitude; double phi = Constants.Rad * latitude; double d = Calendar.ToDays(date); SunCoordinates c = Sun.Coordinates(d); double H = Position.SiderealTime(d, lw) - c.RightAscension; return(new SunPosition { Azimuth = Position.Azimuth(H, phi, c.Declination), Altitude = Position.Altitude(H, phi, c.Declination) }); }
/// <summary> /// calculations for illumination parameters of the moon, /// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and /// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. /// </summary> /// <param name="date">time and date to calculate for</param> /// <returns></returns> public static MoonIllumination GetMoonIllumination(DateTime date) { var d = Calendar.ToDays(date); var s = Sun.Coordinates(d); var m = Moon.Coordinates(d); const int sdist = 149598000; // distance from Earth to Sun in km var phi = Math.Acos(Math.Sin(s.Declination) * Math.Sin(m.Declination) + Math.Cos(s.Declination) * Math.Cos(m.Declination) * Math.Cos(s.RightAscension - m.RightAscension)); var inc = Math.Atan2(sdist * Math.Sin(phi), m.Distance - sdist * Math.Cos(phi)); var angle = Math.Atan2(Math.Cos(s.Declination) * Math.Sin(s.RightAscension - m.RightAscension), Math.Sin(s.Declination) * Math.Cos(m.Declination) - Math.Cos(s.Declination) * Math.Sin(m.Declination) * Math.Cos(s.RightAscension - m.RightAscension)); var progressThroughCycle = 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI; return(new MoonIllumination { Fraction = (1 + Math.Cos(inc)) / 2, Phase = MoonPhaseMapper.FromProgressThroughCycle(progressThroughCycle), Angle = angle }); }