logic sunrise & sunset calculation
authorTanya <tanya@bookdmitri.oblgaz>
Thu, 8 Apr 2010 21:56:00 +0000 (00:56 +0300)
committerTanya <tanya@bookdmitri.oblgaz>
Thu, 8 Apr 2010 21:56:00 +0000 (00:56 +0300)
applet/src/livewp-astro.c
applet/src/livewp-astro.h
applet/src/livewp-home-widget.c

index ec2a8eb..0a70d43 100644 (file)
@@ -86,6 +86,111 @@ double azimuth(double lon, double lat, int year, int month, int day, int hour, i
     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;
index 6bb25d1..216b1d7 100644 (file)
@@ -31,5 +31,10 @@ double jd(int year, int month, int day, double uu);
 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
index 4898cf7..c16fef4 100644 (file)
@@ -710,6 +710,8 @@ plugin_on_timeout (AWallpaperPlugin *desktop_plugin)
   void (*pfunc)(gpointer, gpointer);
   time_t now;
   gint t;
+
+
   Actor *actor;
 fprintf(stderr, "timer daytime=%d\n", daytime);
   if (scene.daytime != daytime){