4 double ut(int hour, int min, int zone)
6 return (hour - zone + (double)min/60);
9 double jd(int year, int month, int day, double uu)
11 return (367*year)-floor((floor((month+9)/12)+year)*7/4)+floor(275*month/9)+day-730531.5+(uu/24);
14 double altitude(double lon, double lat, int year, int month, int day, int hour, int min, int zone)
16 double uu, jj, T, k, M, Lo, DL, L, eps, delta, RA, GMST, LMST, H, eqt, alt;
17 uu = ut(hour, min, zone);
18 jj = jd(year, month, day, uu);
21 M = 357.5291 + 35999.0503 * T - 0.0001559 * T * T - 0.00000045 * T * T * T;
23 Lo = 280.46645 + 36000.76983 * T + 0.0003032 * T * T;
25 DL = (1.9146-0.004817*T-0.000014*T*T)*sin(k*M)+(0.019993-0.000101*T)*sin(k*2*M)+0.00029*sin(k*3*M);
28 delta=(1/k)*asin(sin(L*k)*sin(eps*k));
29 RA=(1/k)*atan2(cos(eps*k)*sin(L*k),cos(L*k));
30 RA=fmod((RA+360), 360);
31 GMST=280.46061837+360.98564736629*jj+0.000387933*T*T-T*T*T/38710000;
32 GMST=fmod((GMST+360), 360);
36 alt=(1/k)*asin(sin(lat*k)*sin(delta*k)+cos(lat*k)*cos(delta*k)*cos(H*k));
40 double azimuth(double lon, double lat, int year, int month, int day, int hour, int min, int zone)
42 double uu, jj, T, k, M, Lo, DL, L, eps, delta, RA, GMST, LMST, H, eqt, azm;
43 uu = ut(hour, min, zone);
44 fprintf(stderr, "%f, %f, %i.%i.%i %i:%i %i uu=%f", lon, lat, year, month, day, hour, min, zone, uu);
45 jj = jd(year, month, day, uu);
48 M = 357.5291 + 35999.0503 * T - 0.0001559 * T * T - 0.00000045 * T * T * T;
50 Lo = 280.46645 + 36000.76983 * T + 0.0003032 * T * T;
52 DL = (1.9146-0.004817*T-0.000014*T*T)*sin(k*M)+(0.019993-0.000101*T)*sin(k*2*M)+0.00029*sin(k*3*M);
55 delta=(1/k)*asin(sin(L*k)*sin(eps*k));
56 RA=(1/k)*atan2(cos(eps*k)*sin(L*k),cos(L*k));
57 RA=fmod((RA+360), 360);
58 GMST=280.46061837+360.98564736629*jj+0.000387933*T*T-T*T*T/38710000;
59 GMST=fmod((GMST+360), 360);
63 azm=(1/k)*atan2(-sin(H*k),cos(lat*k)*tan(delta*k)-sin(lat*k)*cos(H*k));
64 azm=fmod((azm+360), 360);
67 double moon_phase(int year, int month, int day)
69 int yy, mm, dd, k1, k2, k3, jd;
71 yy = year - floor((12 - month) / 10);
73 if (mm >= 12) mm = mm - 12;
75 k1 = floor(365.35 * (yy + 4712));
76 k2 = floor(30.6 * mm + 0.05);
77 k3 = floor(floor(yy/100+49) * 0.75) - 38;
79 jd = k1 + k2 + day + 59;
80 if (jd > 2299160) jd = jd - k3;
82 v = (jd - 2451550.1) / 29.530588853;
84 if (ip < 0) ip = ip + 1;
86 fprintf(stderr, "ip = %f, ag = %f\n", ip, ag);
89 double moon_phase1(int year, int month, int day)
91 int yy, mm, dd, k1, k2, k3, lg;
92 double agepart, ageday, ge, moonday, jd, moonfill;
94 moonday = 29.530588853;
95 if (month <= 2) lg = 0;
97 if ((fmod(year, 4) == 0) && (!(fmod(year, 100) == 0) && (fmod(year, 400) != 0)))
103 floor((year - 1) / 4) +
104 (-floor((year - 1) / 100)) +
105 floor((year - 1) / 400) +
106 floor((((367 * month) - 362) / 12) + lg + day);
108 agepart = (jd - 2451550.1) / moonday;
109 agepart = agepart - floor(agepart);
110 if (agepart < 0) agepart + 1;
112 ageday = agepart * moonday;
114 moonfill = 1.0 - ((moonday/2 - ageday) / (moonday/2));
115 fprintf(stderr, "agepart = %f, ageday = %f, moonfill = %f\n", agepart, ageday, moonfill);
121 int main(int argc, char * argv)
123 int year, month, day, hour, min, zone;
124 double alt, azm, lon, lat, moonpart;
134 moonpart = moon_phase1(year, month, day);
135 fprintf(stderr, "moon path = %f\n", moonpart);
136 //alt = altitude(lon, lat, year, month, day, hour, min, zone);
137 //azm = azimuth(lon, lat, year, month, day, hour, min, zone);
138 //fprintf(stderr, "alt=%5.6f azm=%5.6f\n", alt, azm);