Beispiel #1
0
        /// <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)
            });
        }
Beispiel #2
0
        /// <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
            });
        }