void get_coord(double * lat, double * lon)
{
- *lat = 55.166666;
- *lon = 30.166666;
+ /* coordinates St.-Petersburg */
+ *lat = 59.883333;
+ *lon = 30.25;
+
+ /* coordinates Vitebsk */
+ //*lat = 55.166666;
+ //*lon = 30.133333;
+
+
+}
+
+double
+get_max_sun_alt(double lon, double lat, int year, int month, int day, int zone)
+{
+ int h1, m1, h2, m2, h, m;
+ struct tm;
+ double alt, hour1, hour2, hh, x;
+
+ sun_rise_set(lon, lat,
+ year, month, day,
+ zone,
+ &h1, &m1, &h2, &m2);
+ //printf("h1=%d m1=%d h2=%d m2=%d\n", h1, m1, h2, m2);
+
+ hour1 = (double)h1 + (double)m1/60;
+ hour2 = (double)h2 + (double)m2/60;
+
+ hh = (hour2 - hour1) / 2 + hour1;
+ h = floor(hh);
+ m = (modf(hh, &x) * 60);
+
+ alt = altitude(lon, lat, year, month, day, h, m, zone);
+ //printf("alt = %f \n", alt);
+ return alt;
+}
+void get_sun_pos(int h, int m, double * alt, double * azm)
+{
+ int year, month, day, hour, min, zone;
+ double lat, lon, alt_max;
+ //get_localtime(&year, &month, &day, &hour, &min, &zone);
+ year = 2010;
+ month = 4;
+ day = 14;
+ hour = h;
+ min = m;
+ zone = 3;
+ get_coord(&lat, &lon);
+ alt_max = get_max_sun_alt(lon, lat, year, month, day, zone);
+ *alt = altitude(lon, lat, year, month, day, hour, min, zone);
+ //printf("max = %f alt = %f ",alt_max, *alt);
+ *alt = *alt / (alt_max + 10); // sun height in percent
+ //printf("alt1 = %f \n", *alt);
+
+ *azm = azimuth(lon, lat, year, month, day, hour, min, zone);
+ //printf("azm = %f ", *azm);
+ //if south latitude
+ if (lat < 0){
+ *azm = 75 + (75 - *azm);
+ *azm = fmod(*azm, 380);
+ }
+ *azm = (*azm - 75) / 210; // sun azimuth in percent
+ //printf("azm1 = %f \n", *azm);
}
-void get_sun_pos(double * alt, double * azm)
+void get_sun_pos1(double * alt, double * azm)
{
int year, month, day, hour, min, zone;
- double lat, lon;
+ double lat, lon, alt_max;
get_localtime(&year, &month, &day, &hour, &min, &zone);
get_coord(&lat, &lon);
+ alt_max = get_max_sun_alt(lon, lat, year, month, day, zone);
*alt = altitude(lon, lat, year, month, day, hour, min, zone);
- *alt = *alt / 70; // sun height in percent
+ //printf("max = %f alt = %f ",alt_max, *alt);
+ *alt = *alt / (alt_max + 10); // sun height in percent
+ //printf("alt1 = %f \n", *alt);
*azm = azimuth(lon, lat, year, month, day, hour, min, zone);
+ //printf("azm = %f ", *azm);
//if south latitude
if (lat < 0){
- *azm = 90 + (90 - *azm);
- *azm = fmod(*azm, 360);
+ *azm = 75 + (75 - *azm);
+ *azm = fmod(*azm, 380);
}
- *azm = (*azm - 90) / 180; // sun azimuth in percent
+ *azm = (*azm - 75) / 210; // sun azimuth in percent
+ //printf("azm1 = %f \n", *azm);
+}
+time_t get_next_sunrise()
+{
+ return time(NULL) + 60*60*8;
+}
+time_t get_next_sunset()
+{
+ return time(NULL) + 60*60*12;
}
-int get_daytime()
+
+int get_daytime(int h, int m)
+{
+ double alt, azm;
+ get_sun_pos(h, m, &alt, &azm);
+ alt = alt * 100;
+ azm = azm * 100;
+ //printf("alt = %f azm=%f\n", alt, azm);
+ if (alt <= -12) return TIME_NIGHT;
+ if (alt > -12 && alt < 12 && azm < 50) return TIME_SUNRISE;
+ if (alt > -12 && alt < 12 && azm > 50) return TIME_SUNSET;
+ if (alt >= 12) return TIME_DAY;
+ return TIME_DAY;
+}
+int get_daytime1()
{
double alt, azm;
- get_sun_pos(&alt, &azm);
+ get_sun_pos1(&alt, &azm);
alt = alt * 100;
azm = azm * 100;
- //fprintf("alt = %f azm=%f\n", alt, azm);
+ //printf("alt = %f azm=%f\n", alt, azm);
if (alt <= -7) return TIME_NIGHT;
if (alt > -7 && alt < 7 && azm < 50) return TIME_SUNRISE;
- if (alt > 7 && alt < azm > 50) return TIME_SUNSET;
+ if (alt > -7 && alt < 7 && azm > 50) return TIME_SUNSET;
if (alt >= 7) return TIME_DAY;
-
+ return TIME_DAY;
}
int get_moon_phase()
{
double phase;
get_localtime(&year, &month, &day, &hour, &min, &zone);
phase = moon_phase(year, month, day) * 100;
- printf("ph = %f\n", phase);
+ /* printf("ph = %f\n", phase); */
if (phase <= 3 || phase >=97) return MOON_NONE;
if (phase > 5 && phase <= 25) return MOON_GROWS;
if (phase > 25 && phase <= 45) return MOON_GROWSHALF;
if (phase > 45 && phase <= 55) return MOON_FULL;
if (phase > 55 && phase <= 75) return MOON_DECREASHALF;
if (phase > 75 && phase < 97) return MOON_DECREAS;
+ return MOON_NONE;
+
}