azm=fmod((azm+360), 360);
return azm;
}
+int day_of_year(int year, int month, int day)
+{
+ int n1, n2, n3, n;
+ n1 = floor(275 * month / 9);
+ n2 = floor((month + 9) / 12);
+ n3 = (1 + floor((year - 4 * floor(year / 4) + 2) / 3));
+ n = n1 - (n2 * n3) + day - 30;
+ return n;
+}
+double deg2rad(double deg)
+{
+ return M_PI * deg / 180;
+}
+double truel(double m)
+{
+ double l;
+ l = m + (1.916 * sin(deg2rad(m))) + (0.020 * sin(deg2rad(2*m))) + 282.634;
+ if (l >= 360)
+ l -= 360;
+ else if (l < 0)
+ l += 360;
+ return l;
+}
+double rightasc(double l)
+{
+ double ra, lq, rq;
+ ra = 180 * atan(0.91764 * tan(l * M_PI/180)) / M_PI;
+ lq = 90 * floor(l/90);
+ rq = 90 * floor(ra / 90);
+ ra = ra + (lq - rq);
+ return ra / 15;
+}
+double locangle(double lat, double sindec, double cosdec)
+{
+ double cosh = (-0.01454 - sindec * sin(deg2rad(lat))) / (cosdec * cos(deg2rad(lat)));
+ return cosh;
+}
+double tout(double t, double lng_hour)
+{
+ double ut = t - lng_hour;
+ if (ut < 0)
+ ut += 24;
+ else if (ut >= 24)
+ ut -= 24;
+ return ut;
+}
+void
+sun_rise_set(double lon, double lat,
+ int year, int month, int day,
+ int zone,
+ int * hourrise, int *minrise, int *hourset, int *minset)
+{
+ int n;
+ double lng_hour, trise, tset, mrise, mset, lrise, lset,
+ rarise, raset, sindecrise, cosdecrise, sindecset, cosdecset,
+ coshrise, coshset,
+ hrise, hset, ttrise, ttset, utrise, utset;
+ int utrisehour, utrisemin, utsethour, utsetmin;
+ n = day_of_year(year, month, day);
+ lng_hour = lon / 15;
+ trise = (double)n + (double)((6 - lng_hour) / 24);
+ tset = (double)n + (double)((18 - lng_hour) / 24);
+ mrise = (0.9856 * trise) - 3.289;
+ mset = (0.9856 * tset) - 3.289;
+ lrise = truel(mrise);
+ lset = truel(mset);
+ rarise = rightasc(lrise);
+ raset = rightasc(lset);
+ sindecrise = 0.39782 * sin(deg2rad(lrise));
+ cosdecrise = cos(asin(sindecrise));
+ sindecset = 0.39782 * sin(deg2rad(lset));
+ cosdecset = cos(asin(sindecset));
+ coshrise = locangle(lat, sindecrise, cosdecrise);
+ /* if (coshrise > 1) sun never rises
+ * if (coshrise < -1) sun never sets
+ */
+ coshset = locangle(lat, sindecset, cosdecset);
+ hrise = (360 - 180 * acos(coshrise) / M_PI) / 15;
+ hset = (180 * acos(coshrise) / M_PI) / 15;
+ ttrise = hrise + rarise - (0.06571 * trise) - 6.622;
+ ttset = hset + raset - (0.06571 * tset) - 6.622;
+ utrise = tout(ttrise, lng_hour);
+ utset = tout(ttset, lng_hour);
+
+ utrisehour = floor(utrise);
+ utrisemin = floor((utrise - utrisehour) * 60);
+ utsethour = floor(utset);
+ utsetmin = floor((utset - utsethour) * 60);
+
+ *hourrise = utrisehour + zone;
+ if (*hourrise >= 24)
+ *hourrise -= 24;
+ else if (*hourrise < 0)
+ *hourrise += 24;
+ *minrise = utrisemin;
+ *hourset = utsethour + zone;
+ if (*hourset >= 24)
+ *hourset -= 24;
+ else if (*hourset < 0)
+ *hourset += 24;
+ *minset = utsetmin;
+
+}
+
+
double moon_phase(int year, int month, int day)
{
int lg;
double altitude(double lon, double lat, int year, int month, int day, int hour, int min, int zone);
double azimuth(double lon, double lat, int year, int month, int day, int hour, int min, int zone);
double moon_phase(int year, int month, int day);
+void sun_rise_set(double lon, double lat,
+ int year, int month, int day,
+ int zone,
+ int * hourrise, int *minrise, int *hourset, int *minset);
+
/*******************************************************************************/
#endif