Ejemplo n.º 1
0
 private double SinDegrees(double degrees)
 {
     return(Math.Sin(MathHelpers.DegreesToRadians(degrees)));
 }
Ejemplo n.º 2
0
        private void _CalculateSunriseSunset(double latitude, double longitude, out DateTime sunrise, out DateTime sunset)
        {
            //equation from https://en.wikipedia.org/wiki/Sunrise_equation#Complete_calculation_on_Earth

            //calculate current julian day. don't want extra hours so we chop off any decimals from the current julian date
            double n = (double)((int)DateTimeToJulianDate(DateTime.Now.ToUniversalTime())) - 2451545.0 + 0.0008;

            //calculate  mean solar noon
            double msn = n - (longitude / 360.0);

            //calculate solar mean anomaly
            double sma = (357.5291 + 0.98560028 * msn) % 360;

            //equation of the center
            double center = (1.9148 * SinDegrees(sma)) + (0.02 * SinDegrees(2 * sma)) + (0.0003 * SinDegrees(3 * sma));

            //ecliptic longitude
            double elong = (sma + center + 180 + 102.9372) % 360;

            //solar transit
            double strans = 2451545.0 + msn + (0.0053 * SinDegrees(sma)) - (0.0069 * SinDegrees(2 * elong));

            //declination of the sun and hour-angle
            double declination = MathHelpers.RadiansToDegrees(Math.Asin(SinDegrees(elong) * SinDegrees(23.55)));

            //hour angle
            double hAngle = MathHelpers.RadiansToDegrees(Math.Acos((SinDegrees(-0.83) - SinDegrees(latitude) * SinDegrees(declination)) / (Math.Cos(MathHelpers.DegreesToRadians(latitude)) * Math.Cos(MathHelpers.DegreesToRadians(declination)))));

            //julian date of sunrise
            double rise = strans - (hAngle / 360);
            double set  = strans + (hAngle / 360);

            sunrise = JulianDateToUTC(rise).ToLocalTime();
            sunset  = JulianDateToUTC(set).ToLocalTime();
        }