private double SinDegrees(double degrees) { return(Math.Sin(MathHelpers.DegreesToRadians(degrees))); }
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(); }