xref: /plan9/sys/src/cmd/astro/occ.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include "astro.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier Occ	 o1, o2;
43e12c5d1SDavid du Colombier Obj2	 xo1, xo2;
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier void
occult(Obj2 * p1,Obj2 * p2,double)7*7dd7cddfSDavid du Colombier occult(Obj2 *p1, Obj2 *p2, double)
83e12c5d1SDavid du Colombier {
93e12c5d1SDavid du Colombier 	int i, i1, N;
103e12c5d1SDavid du Colombier 	double d1, d2, d3, d4;
113e12c5d1SDavid du Colombier 	double x, di, dx, x1;
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier 	d3 = 0;
143e12c5d1SDavid du Colombier 	d2 = 0;
15*7dd7cddfSDavid du Colombier 	occ.t1 = -100;
16*7dd7cddfSDavid du Colombier 	occ.t2 = -100;
17*7dd7cddfSDavid du Colombier 	occ.t3 = -100;
18*7dd7cddfSDavid du Colombier 	occ.t4 = -100;
19*7dd7cddfSDavid du Colombier 	occ.t5 = -100;
203e12c5d1SDavid du Colombier 	for(i=0; i<=NPTS+1; i++) {
213e12c5d1SDavid du Colombier 		d1 = d2;
223e12c5d1SDavid du Colombier 		d2 = d3;
233e12c5d1SDavid du Colombier 		d3 = dist(&p1->point[i], &p2->point[i]);
243e12c5d1SDavid du Colombier 		if(i >= 2 && d2 <= d1 && d2 <= d3)
253e12c5d1SDavid du Colombier 			goto found;
263e12c5d1SDavid du Colombier 	}
273e12c5d1SDavid du Colombier 	return;
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier found:
303e12c5d1SDavid du Colombier 	N = 2880*PER/NPTS; /* 1 min steps */
313e12c5d1SDavid du Colombier 	i -= 2;
323e12c5d1SDavid du Colombier 	set3pt(p1, i, &o1);
333e12c5d1SDavid du Colombier 	set3pt(p2, i, &o2);
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier 	di = i;
363e12c5d1SDavid du Colombier 	x = 0;
373e12c5d1SDavid du Colombier 	dx = 2./N;
383e12c5d1SDavid du Colombier 	for(i=0; i<=N; i++) {
393e12c5d1SDavid du Colombier 		setpt(&o1, x);
403e12c5d1SDavid du Colombier 		setpt(&o2, x);
413e12c5d1SDavid du Colombier 		d1 = d2;
423e12c5d1SDavid du Colombier 		d2 = d3;
433e12c5d1SDavid du Colombier 		d3 = dist(&o1.act, &o2.act);
443e12c5d1SDavid du Colombier 		if(i >= 2 && d2 <= d1 && d2 <= d3)
453e12c5d1SDavid du Colombier 			goto found1;
463e12c5d1SDavid du Colombier 		x += dx;
473e12c5d1SDavid du Colombier 	}
483e12c5d1SDavid du Colombier 	fprint(2, "bad 1 \n");
493e12c5d1SDavid du Colombier 	return;
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier found1:
523e12c5d1SDavid du Colombier 	if(d2 > o1.act.semi2+o2.act.semi2+50)
533e12c5d1SDavid du Colombier 		return;
543e12c5d1SDavid du Colombier 	di += x - 3*dx;
553e12c5d1SDavid du Colombier 	x = 0;
563e12c5d1SDavid du Colombier 	for(i=0; i<3; i++) {
573e12c5d1SDavid du Colombier 		setime(day + deld*(di + x));
583e12c5d1SDavid du Colombier 		(*p1->obj)();
593e12c5d1SDavid du Colombier 		setobj(&xo1.point[i]);
603e12c5d1SDavid du Colombier 		(*p2->obj)();
613e12c5d1SDavid du Colombier 		setobj(&xo2.point[i]);
623e12c5d1SDavid du Colombier 		x += 2*dx;
633e12c5d1SDavid du Colombier 	}
643e12c5d1SDavid du Colombier 	dx /= 60;
653e12c5d1SDavid du Colombier 	x = 0;
663e12c5d1SDavid du Colombier 	set3pt(&xo1, 0, &o1);
673e12c5d1SDavid du Colombier 	set3pt(&xo2, 0, &o2);
683e12c5d1SDavid du Colombier 	for(i=0; i<=240; i++) {
693e12c5d1SDavid du Colombier 		setpt(&o1, x);
703e12c5d1SDavid du Colombier 		setpt(&o2, x);
713e12c5d1SDavid du Colombier 		d1 = d2;
723e12c5d1SDavid du Colombier 		d2 = d3;
733e12c5d1SDavid du Colombier 		d3 = dist(&o1.act, &o2.act);
743e12c5d1SDavid du Colombier 		if(i >= 2 && d2 <= d1 && d2 <= d3)
753e12c5d1SDavid du Colombier 			goto found2;
763e12c5d1SDavid du Colombier 		x += 1./120.;
773e12c5d1SDavid du Colombier 	}
783e12c5d1SDavid du Colombier 	fprint(2, "bad 2 \n");
793e12c5d1SDavid du Colombier 	return;
803e12c5d1SDavid du Colombier 
813e12c5d1SDavid du Colombier found2:
823e12c5d1SDavid du Colombier 	if(d2 > o1.act.semi2 + o2.act.semi2)
833e12c5d1SDavid du Colombier 		return;
843e12c5d1SDavid du Colombier 	i1 = i-1;
853e12c5d1SDavid du Colombier 	x1 = x - 1./120.;
863e12c5d1SDavid du Colombier 	occ.t3 = di + i1 * dx;
87*7dd7cddfSDavid du Colombier 	occ.e3 = o1.act.el;
883e12c5d1SDavid du Colombier 	d3 = o1.act.semi2 - o2.act.semi2;
893e12c5d1SDavid du Colombier 	if(d3 < 0)
903e12c5d1SDavid du Colombier 		d3 = -d3;
913e12c5d1SDavid du Colombier 	d4 = o1.act.semi2 + o2.act.semi2;
923e12c5d1SDavid du Colombier 	for(i=i1,x=x1;; i++) {
933e12c5d1SDavid du Colombier 		setpt(&o1, x);
943e12c5d1SDavid du Colombier 		setpt(&o2, x);
953e12c5d1SDavid du Colombier 		d1 = d2;
963e12c5d1SDavid du Colombier 		d2 = dist(&o1.act, &o2.act);
973e12c5d1SDavid du Colombier 		if(i != i1) {
98*7dd7cddfSDavid du Colombier 			if(d1 <= d3 && d2 > d3) {
993e12c5d1SDavid du Colombier 				occ.t4 = di + (i-.5) * dx;
100*7dd7cddfSDavid du Colombier 				occ.e4 = o1.act.el;
101*7dd7cddfSDavid du Colombier 			}
1023e12c5d1SDavid du Colombier 			if(d2 > d4) {
103*7dd7cddfSDavid du Colombier 				if(d1 <= d4) {
1043e12c5d1SDavid du Colombier 					occ.t5 = di + (i-.5) * dx;
105*7dd7cddfSDavid du Colombier 					occ.e5 = o1.act.el;
106*7dd7cddfSDavid du Colombier 				}
1073e12c5d1SDavid du Colombier 				break;
1083e12c5d1SDavid du Colombier 			}
1093e12c5d1SDavid du Colombier 		}
1103e12c5d1SDavid du Colombier 		x += 1./120.;
1113e12c5d1SDavid du Colombier 	}
1123e12c5d1SDavid du Colombier 	for(i=i1,x=x1;; i--) {
1133e12c5d1SDavid du Colombier 		setpt(&o1, x);
1143e12c5d1SDavid du Colombier 		setpt(&o2, x);
1153e12c5d1SDavid du Colombier 		d1 = d2;
1163e12c5d1SDavid du Colombier 		d2 = dist(&o1.act, &o2.act);
1173e12c5d1SDavid du Colombier 		if(i != i1) {
118*7dd7cddfSDavid du Colombier 			if(d1 <= d3 && d2 > d3) {
1193e12c5d1SDavid du Colombier 				occ.t2 = di + (i+.5) * dx;
120*7dd7cddfSDavid du Colombier 				occ.e2 = o1.act.el;
121*7dd7cddfSDavid du Colombier 			}
1223e12c5d1SDavid du Colombier 			if(d2 > d4) {
123*7dd7cddfSDavid du Colombier 				if(d1 <= d4) {
1243e12c5d1SDavid du Colombier 					occ.t1 = di + (i+.5) * dx;
125*7dd7cddfSDavid du Colombier 					occ.e1 = o1.act.el;
126*7dd7cddfSDavid du Colombier 				}
1273e12c5d1SDavid du Colombier 				break;
1283e12c5d1SDavid du Colombier 			}
1293e12c5d1SDavid du Colombier 		}
1303e12c5d1SDavid du Colombier 		x -= 1./120.;
1313e12c5d1SDavid du Colombier 	}
1323e12c5d1SDavid du Colombier }
1333e12c5d1SDavid du Colombier 
1343e12c5d1SDavid du Colombier void
setpt(Occ * o,double x)1353e12c5d1SDavid du Colombier setpt(Occ *o, double x)
1363e12c5d1SDavid du Colombier {
1373e12c5d1SDavid du Colombier 	double y;
1383e12c5d1SDavid du Colombier 
1393e12c5d1SDavid du Colombier 	y = x * (x-1);
1403e12c5d1SDavid du Colombier 	o->act.ra = o->del0.ra +
1413e12c5d1SDavid du Colombier 		x*o->del1.ra + y*o->del2.ra;
1423e12c5d1SDavid du Colombier 	o->act.decl2 = o->del0.decl2 +
1433e12c5d1SDavid du Colombier 		x*o->del1.decl2 + y*o->del2.decl2;
1443e12c5d1SDavid du Colombier 	o->act.semi2 = o->del0.semi2 +
1453e12c5d1SDavid du Colombier 		x*o->del1.semi2 + y*o->del2.semi2;
1463e12c5d1SDavid du Colombier 	o->act.el = o->del0.el +
1473e12c5d1SDavid du Colombier 		x*o->del1.el + y*o->del2.el;
1483e12c5d1SDavid du Colombier }
1493e12c5d1SDavid du Colombier 
1503e12c5d1SDavid du Colombier 
1513e12c5d1SDavid du Colombier double
pinorm(double a)1523e12c5d1SDavid du Colombier pinorm(double a)
1533e12c5d1SDavid du Colombier {
1543e12c5d1SDavid du Colombier 
1553e12c5d1SDavid du Colombier 	while(a < -pi)
1563e12c5d1SDavid du Colombier 		a += pipi;
1573e12c5d1SDavid du Colombier 	while(a > pi)
1583e12c5d1SDavid du Colombier 		a -= pipi;
1593e12c5d1SDavid du Colombier 	return a;
1603e12c5d1SDavid du Colombier }
1613e12c5d1SDavid du Colombier 
1623e12c5d1SDavid du Colombier void
set3pt(Obj2 * p,int i,Occ * o)1633e12c5d1SDavid du Colombier set3pt(Obj2 *p, int i, Occ *o)
1643e12c5d1SDavid du Colombier {
1653e12c5d1SDavid du Colombier 	Obj1 *p1, *p2, *p3;
1663e12c5d1SDavid du Colombier 	double a;
1673e12c5d1SDavid du Colombier 
1683e12c5d1SDavid du Colombier 	p1 = p->point+i;
1693e12c5d1SDavid du Colombier 	p2 = p1+1;
1703e12c5d1SDavid du Colombier 	p3 = p2+1;
1713e12c5d1SDavid du Colombier 
1723e12c5d1SDavid du Colombier 	o->del0.ra = p1->ra;
1733e12c5d1SDavid du Colombier 	o->del0.decl2 = p1->decl2;
1743e12c5d1SDavid du Colombier 	o->del0.semi2 = p1->semi2;
1753e12c5d1SDavid du Colombier 	o->del0.el = p1->el;
1763e12c5d1SDavid du Colombier 
1773e12c5d1SDavid du Colombier 	a = p2->ra - p1->ra;
1783e12c5d1SDavid du Colombier 	o->del1.ra = pinorm(a);
1793e12c5d1SDavid du Colombier 	a = p2->decl2 - p1->decl2;
1803e12c5d1SDavid du Colombier 	o->del1.decl2 = pinorm(a);
1813e12c5d1SDavid du Colombier 	o->del1.semi2 = p2->semi2 - p1->semi2;
1823e12c5d1SDavid du Colombier 	o->del1.el = p2->el - p1->el;
1833e12c5d1SDavid du Colombier 
1843e12c5d1SDavid du Colombier 	a = p1->ra + p3->ra - 2*p2->ra;
1853e12c5d1SDavid du Colombier 	o->del2.ra = pinorm(a)/2;
1863e12c5d1SDavid du Colombier 	a = p1->decl2 + p3->decl2 - 2*p2->decl2;
1873e12c5d1SDavid du Colombier 	o->del2.decl2 = pinorm(a)/2;
1883e12c5d1SDavid du Colombier 	o->del2.semi2 = (p1->semi2 + p3->semi2 - 2*p2->semi2) / 2;
1893e12c5d1SDavid du Colombier 	o->del2.el = (p1->el + p3->el - 2*p2->el) / 2;
1903e12c5d1SDavid du Colombier }
191