1*3e12c5d1SDavid du Colombier #include "astro.h"
2*3e12c5d1SDavid du Colombier
3*3e12c5d1SDavid du Colombier double
dist(Obj1 * p,Obj1 * q)4*3e12c5d1SDavid du Colombier dist(Obj1 *p, Obj1 *q)
5*3e12c5d1SDavid du Colombier {
6*3e12c5d1SDavid du Colombier double a;
7*3e12c5d1SDavid du Colombier
8*3e12c5d1SDavid du Colombier a = sin(p->decl2)*sin(q->decl2) +
9*3e12c5d1SDavid du Colombier cos(p->decl2)*cos(q->decl2)*cos(p->ra-q->ra);
10*3e12c5d1SDavid du Colombier a = fabs(atan2(pyth(a), a)) / radsec;
11*3e12c5d1SDavid du Colombier return a;
12*3e12c5d1SDavid du Colombier }
13*3e12c5d1SDavid du Colombier
14*3e12c5d1SDavid du Colombier int
rline(int f)15*3e12c5d1SDavid du Colombier rline(int f)
16*3e12c5d1SDavid du Colombier {
17*3e12c5d1SDavid du Colombier char *p;
18*3e12c5d1SDavid du Colombier int c;
19*3e12c5d1SDavid du Colombier static char buf[1024];
20*3e12c5d1SDavid du Colombier static int bc, bn, bf;
21*3e12c5d1SDavid du Colombier
22*3e12c5d1SDavid du Colombier if(bf != f) {
23*3e12c5d1SDavid du Colombier bf = f;
24*3e12c5d1SDavid du Colombier bn = 0;
25*3e12c5d1SDavid du Colombier }
26*3e12c5d1SDavid du Colombier p = line;
27*3e12c5d1SDavid du Colombier do {
28*3e12c5d1SDavid du Colombier if(bn <= 0) {
29*3e12c5d1SDavid du Colombier bn = read(bf, buf, sizeof(buf));
30*3e12c5d1SDavid du Colombier if(bn <= 0)
31*3e12c5d1SDavid du Colombier return 1;
32*3e12c5d1SDavid du Colombier bc = 0;
33*3e12c5d1SDavid du Colombier }
34*3e12c5d1SDavid du Colombier c = buf[bc];
35*3e12c5d1SDavid du Colombier bn--; bc++;
36*3e12c5d1SDavid du Colombier *p++ = c;
37*3e12c5d1SDavid du Colombier } while(c != '\n');
38*3e12c5d1SDavid du Colombier return 0;
39*3e12c5d1SDavid du Colombier }
40*3e12c5d1SDavid du Colombier
41*3e12c5d1SDavid du Colombier double
sunel(double t)42*3e12c5d1SDavid du Colombier sunel(double t)
43*3e12c5d1SDavid du Colombier {
44*3e12c5d1SDavid du Colombier int i;
45*3e12c5d1SDavid du Colombier
46*3e12c5d1SDavid du Colombier i = floor(t);
47*3e12c5d1SDavid du Colombier if(i < 0 || i > NPTS+1)
48*3e12c5d1SDavid du Colombier return -90;
49*3e12c5d1SDavid du Colombier t = osun.point[i].el +
50*3e12c5d1SDavid du Colombier (t-i)*(osun.point[i+1].el - osun.point[i].el);
51*3e12c5d1SDavid du Colombier return t;
52*3e12c5d1SDavid du Colombier }
53*3e12c5d1SDavid du Colombier
54*3e12c5d1SDavid du Colombier double
rise(Obj2 * op,double el)55*3e12c5d1SDavid du Colombier rise(Obj2 *op, double el)
56*3e12c5d1SDavid du Colombier {
57*3e12c5d1SDavid du Colombier Obj2 *p;
58*3e12c5d1SDavid du Colombier int i;
59*3e12c5d1SDavid du Colombier double e1, e2;
60*3e12c5d1SDavid du Colombier
61*3e12c5d1SDavid du Colombier e2 = 0;
62*3e12c5d1SDavid du Colombier p = op;
63*3e12c5d1SDavid du Colombier for(i=0; i<=NPTS; i++) {
64*3e12c5d1SDavid du Colombier e1 = e2;
65*3e12c5d1SDavid du Colombier e2 = p->point[i].el;
66*3e12c5d1SDavid du Colombier if(i >= 1 && e1 <= el && e2 > el)
67*3e12c5d1SDavid du Colombier goto found;
68*3e12c5d1SDavid du Colombier }
69*3e12c5d1SDavid du Colombier return -1;
70*3e12c5d1SDavid du Colombier
71*3e12c5d1SDavid du Colombier found:
72*3e12c5d1SDavid du Colombier return i - 1 + (el-e1)/(e2-e1);
73*3e12c5d1SDavid du Colombier }
74*3e12c5d1SDavid du Colombier
75*3e12c5d1SDavid du Colombier double
set(Obj2 * op,double el)76*3e12c5d1SDavid du Colombier set(Obj2 *op, double el)
77*3e12c5d1SDavid du Colombier {
78*3e12c5d1SDavid du Colombier Obj2 *p;
79*3e12c5d1SDavid du Colombier int i;
80*3e12c5d1SDavid du Colombier double e1, e2;
81*3e12c5d1SDavid du Colombier
82*3e12c5d1SDavid du Colombier e2 = 0;
83*3e12c5d1SDavid du Colombier p = op;
84*3e12c5d1SDavid du Colombier for(i=0; i<=NPTS; i++) {
85*3e12c5d1SDavid du Colombier e1 = e2;
86*3e12c5d1SDavid du Colombier e2 = p->point[i].el;
87*3e12c5d1SDavid du Colombier if(i >= 1 && e1 > el && e2 <= el)
88*3e12c5d1SDavid du Colombier goto found;
89*3e12c5d1SDavid du Colombier }
90*3e12c5d1SDavid du Colombier return -1;
91*3e12c5d1SDavid du Colombier
92*3e12c5d1SDavid du Colombier found:
93*3e12c5d1SDavid du Colombier return i - 1 + (el-e1)/(e2-e1);
94*3e12c5d1SDavid du Colombier }
95*3e12c5d1SDavid du Colombier
96*3e12c5d1SDavid du Colombier double
solstice(int n)97*3e12c5d1SDavid du Colombier solstice(int n)
98*3e12c5d1SDavid du Colombier {
99*3e12c5d1SDavid du Colombier int i;
100*3e12c5d1SDavid du Colombier double d1, d2, d3;
101*3e12c5d1SDavid du Colombier
102*3e12c5d1SDavid du Colombier d3 = (n*pi)/2 - pi;
103*3e12c5d1SDavid du Colombier if(n == 0)
104*3e12c5d1SDavid du Colombier d3 += pi;
105*3e12c5d1SDavid du Colombier d2 = 0.;
106*3e12c5d1SDavid du Colombier for(i=0; i<=NPTS; i++) {
107*3e12c5d1SDavid du Colombier d1 = d2;
108*3e12c5d1SDavid du Colombier d2 = osun.point[i].ra;
109*3e12c5d1SDavid du Colombier if(n == 0) {
110*3e12c5d1SDavid du Colombier d2 -= pi;
111*3e12c5d1SDavid du Colombier if(d2 < -pi)
112*3e12c5d1SDavid du Colombier d2 += pipi;
113*3e12c5d1SDavid du Colombier }
114*3e12c5d1SDavid du Colombier if(i >= 1 && d3 >= d1 && d3 < d2)
115*3e12c5d1SDavid du Colombier goto found;
116*3e12c5d1SDavid du Colombier }
117*3e12c5d1SDavid du Colombier return -1;
118*3e12c5d1SDavid du Colombier
119*3e12c5d1SDavid du Colombier found:
120*3e12c5d1SDavid du Colombier return i - (d3-d2)/(d1-d2);
121*3e12c5d1SDavid du Colombier }
122*3e12c5d1SDavid du Colombier
123*3e12c5d1SDavid du Colombier double
betcross(double b)124*3e12c5d1SDavid du Colombier betcross(double b)
125*3e12c5d1SDavid du Colombier {
126*3e12c5d1SDavid du Colombier int i;
127*3e12c5d1SDavid du Colombier double d1, d2;
128*3e12c5d1SDavid du Colombier
129*3e12c5d1SDavid du Colombier d2 = 0;
130*3e12c5d1SDavid du Colombier for(i=0; i<=NPTS; i++) {
131*3e12c5d1SDavid du Colombier d1 = d2;
132*3e12c5d1SDavid du Colombier d2 = osun.point[i].mag;
133*3e12c5d1SDavid du Colombier if(i >= 1 && b >= d1 && b < d2)
134*3e12c5d1SDavid du Colombier goto found;
135*3e12c5d1SDavid du Colombier }
136*3e12c5d1SDavid du Colombier return -1;
137*3e12c5d1SDavid du Colombier
138*3e12c5d1SDavid du Colombier found:
139*3e12c5d1SDavid du Colombier return i - (b-d2)/(d1-d2);
140*3e12c5d1SDavid du Colombier }
141*3e12c5d1SDavid du Colombier
142*3e12c5d1SDavid du Colombier double
melong(Obj2 * op)143*3e12c5d1SDavid du Colombier melong(Obj2 *op)
144*3e12c5d1SDavid du Colombier {
145*3e12c5d1SDavid du Colombier Obj2 *p;
146*3e12c5d1SDavid du Colombier int i;
147*3e12c5d1SDavid du Colombier double d1, d2, d3;
148*3e12c5d1SDavid du Colombier
149*3e12c5d1SDavid du Colombier d2 = 0;
150*3e12c5d1SDavid du Colombier d3 = 0;
151*3e12c5d1SDavid du Colombier p = op;
152*3e12c5d1SDavid du Colombier for(i=0; i<=NPTS; i++) {
153*3e12c5d1SDavid du Colombier d1 = d2;
154*3e12c5d1SDavid du Colombier d2 = d3;
155*3e12c5d1SDavid du Colombier d3 = dist(&p->point[i], &osun.point[i]);
156*3e12c5d1SDavid du Colombier if(i >= 2 && d2 >= d1 && d2 >= d3)
157*3e12c5d1SDavid du Colombier goto found;
158*3e12c5d1SDavid du Colombier }
159*3e12c5d1SDavid du Colombier return -1;
160*3e12c5d1SDavid du Colombier
161*3e12c5d1SDavid du Colombier found:
162*3e12c5d1SDavid du Colombier return i - 2;
163*3e12c5d1SDavid du Colombier }
164*3e12c5d1SDavid du Colombier
165*3e12c5d1SDavid du Colombier #define NEVENT 100
166*3e12c5d1SDavid du Colombier Event events[NEVENT];
167*3e12c5d1SDavid du Colombier Event* eventp = 0;
168*3e12c5d1SDavid du Colombier
169*3e12c5d1SDavid du Colombier void
event(char * format,char * arg1,char * arg2,double tim,int flag)170*3e12c5d1SDavid du Colombier event(char *format, char *arg1, char *arg2, double tim, int flag)
171*3e12c5d1SDavid du Colombier {
172*3e12c5d1SDavid du Colombier Event *p;
173*3e12c5d1SDavid du Colombier
174*3e12c5d1SDavid du Colombier if(flag & DARK)
175*3e12c5d1SDavid du Colombier if(sunel(tim) > -12)
176*3e12c5d1SDavid du Colombier return;
177*3e12c5d1SDavid du Colombier if(flag & LIGHT)
178*3e12c5d1SDavid du Colombier if(sunel(tim) < 0)
179*3e12c5d1SDavid du Colombier return;
180*3e12c5d1SDavid du Colombier if(eventp == 0)
181*3e12c5d1SDavid du Colombier eventp = events;
182*3e12c5d1SDavid du Colombier p = eventp;
183*3e12c5d1SDavid du Colombier if(p >= events+NEVENT) {
184*3e12c5d1SDavid du Colombier fprint(2, "too many events\n");
185*3e12c5d1SDavid du Colombier return;
186*3e12c5d1SDavid du Colombier }
187*3e12c5d1SDavid du Colombier eventp++;
188*3e12c5d1SDavid du Colombier p->format = format;
189*3e12c5d1SDavid du Colombier p->arg1 = arg1;
190*3e12c5d1SDavid du Colombier p->arg2 = arg2;
191*3e12c5d1SDavid du Colombier p->tim = tim;
192*3e12c5d1SDavid du Colombier p->flag = flag;
193*3e12c5d1SDavid du Colombier }
194*3e12c5d1SDavid du Colombier
195*3e12c5d1SDavid du Colombier void
evflush(void)196*3e12c5d1SDavid du Colombier evflush(void)
197*3e12c5d1SDavid du Colombier {
198*3e12c5d1SDavid du Colombier Event *p;
199*3e12c5d1SDavid du Colombier
200*3e12c5d1SDavid du Colombier if(eventp == 0)
201*3e12c5d1SDavid du Colombier return;
202*3e12c5d1SDavid du Colombier qsort(events, eventp-events, sizeof *p, evcomp);
203*3e12c5d1SDavid du Colombier for(p = events; p<eventp; p++) {
204*3e12c5d1SDavid du Colombier if((p->flag&SIGNIF) && flags['s'])
205*3e12c5d1SDavid du Colombier print("ding ding ding ");
206*3e12c5d1SDavid du Colombier print(p->format, p->arg1, p->arg2);
207*3e12c5d1SDavid du Colombier if(p->flag & PTIME)
208*3e12c5d1SDavid du Colombier ptime(day + p->tim*deld);
209*3e12c5d1SDavid du Colombier print("\n");
210*3e12c5d1SDavid du Colombier }
211*3e12c5d1SDavid du Colombier eventp = 0;
212*3e12c5d1SDavid du Colombier }
213*3e12c5d1SDavid du Colombier
214*3e12c5d1SDavid du Colombier int
evcomp(void * a1,void * a2)215*3e12c5d1SDavid du Colombier evcomp(void *a1, void *a2)
216*3e12c5d1SDavid du Colombier {
217*3e12c5d1SDavid du Colombier double t1, t2;
218*3e12c5d1SDavid du Colombier Event *p1, *p2;
219*3e12c5d1SDavid du Colombier
220*3e12c5d1SDavid du Colombier p1 = a1;
221*3e12c5d1SDavid du Colombier p2 = a2;
222*3e12c5d1SDavid du Colombier t1 = p1->tim;
223*3e12c5d1SDavid du Colombier t2 = p2->tim;
224*3e12c5d1SDavid du Colombier if(p1->flag & SIGNIF)
225*3e12c5d1SDavid du Colombier t1 -= 1000.;
226*3e12c5d1SDavid du Colombier if(p2->flag & SIGNIF)
227*3e12c5d1SDavid du Colombier t2 -= 1000.;
228*3e12c5d1SDavid du Colombier if(t1 > t2)
229*3e12c5d1SDavid du Colombier return 1;
230*3e12c5d1SDavid du Colombier if(t2 > t1)
231*3e12c5d1SDavid du Colombier return -1;
232*3e12c5d1SDavid du Colombier return 0;
233*3e12c5d1SDavid du Colombier }
234*3e12c5d1SDavid du Colombier
235*3e12c5d1SDavid du Colombier double
pyth(double x)236*3e12c5d1SDavid du Colombier pyth(double x)
237*3e12c5d1SDavid du Colombier {
238*3e12c5d1SDavid du Colombier
239*3e12c5d1SDavid du Colombier x *= x;
240*3e12c5d1SDavid du Colombier if(x > 1)
241*3e12c5d1SDavid du Colombier x = 1;
242*3e12c5d1SDavid du Colombier return sqrt(1-x);
243*3e12c5d1SDavid du Colombier }
244*3e12c5d1SDavid du Colombier
245*3e12c5d1SDavid du Colombier char*
skip(int n)246*3e12c5d1SDavid du Colombier skip(int n)
247*3e12c5d1SDavid du Colombier {
248*3e12c5d1SDavid du Colombier int i;
249*3e12c5d1SDavid du Colombier char *cp;
250*3e12c5d1SDavid du Colombier
251*3e12c5d1SDavid du Colombier cp = line;
252*3e12c5d1SDavid du Colombier for(i=0; i<n; i++) {
253*3e12c5d1SDavid du Colombier while(*cp == ' ' || *cp == '\t')
254*3e12c5d1SDavid du Colombier cp++;
255*3e12c5d1SDavid du Colombier while(*cp != '\n' && *cp != ' ' && *cp != '\t')
256*3e12c5d1SDavid du Colombier cp++;
257*3e12c5d1SDavid du Colombier }
258*3e12c5d1SDavid du Colombier while(*cp == ' ' || *cp == '\t')
259*3e12c5d1SDavid du Colombier cp++;
260*3e12c5d1SDavid du Colombier return cp;
261*3e12c5d1SDavid du Colombier }
262