xref: /plan9-contrib/sys/src/cmd/astro/dist.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
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