Blob


1 #include "astro.h"
3 Occ o1, o2;
4 Obj2 xo1, xo2;
6 void
7 occult(Obj2 *p1, Obj2 *p2, double d)
8 {
9 int i, i1, N;
10 double d1, d2, d3, d4;
11 double x, di, dx, x1;
13 USED(d);
15 d3 = 0;
16 d2 = 0;
17 occ.t1 = -100;
18 occ.t2 = -100;
19 occ.t3 = -100;
20 occ.t4 = -100;
21 occ.t5 = -100;
22 for(i=0; i<=NPTS+1; i++) {
23 d1 = d2;
24 d2 = d3;
25 d3 = dist(&p1->point[i], &p2->point[i]);
26 if(i >= 2 && d2 <= d1 && d2 <= d3)
27 goto found;
28 }
29 return;
31 found:
32 N = 2880*PER/NPTS; /* 1 min steps */
33 i -= 2;
34 set3pt(p1, i, &o1);
35 set3pt(p2, i, &o2);
37 di = i;
38 x = 0;
39 dx = 2./N;
40 for(i=0; i<=N; i++) {
41 setpt(&o1, x);
42 setpt(&o2, x);
43 d1 = d2;
44 d2 = d3;
45 d3 = dist(&o1.act, &o2.act);
46 if(i >= 2 && d2 <= d1 && d2 <= d3)
47 goto found1;
48 x += dx;
49 }
50 fprint(2, "bad 1 \n");
51 return;
53 found1:
54 if(d2 > o1.act.semi2+o2.act.semi2+50)
55 return;
56 di += x - 3*dx;
57 x = 0;
58 for(i=0; i<3; i++) {
59 setime(day + deld*(di + x));
60 (*p1->obj)();
61 setobj(&xo1.point[i]);
62 (*p2->obj)();
63 setobj(&xo2.point[i]);
64 x += 2*dx;
65 }
66 dx /= 60;
67 x = 0;
68 set3pt(&xo1, 0, &o1);
69 set3pt(&xo2, 0, &o2);
70 for(i=0; i<=240; i++) {
71 setpt(&o1, x);
72 setpt(&o2, x);
73 d1 = d2;
74 d2 = d3;
75 d3 = dist(&o1.act, &o2.act);
76 if(i >= 2 && d2 <= d1 && d2 <= d3)
77 goto found2;
78 x += 1./120.;
79 }
80 fprint(2, "bad 2 \n");
81 return;
83 found2:
84 if(d2 > o1.act.semi2 + o2.act.semi2)
85 return;
86 i1 = i-1;
87 x1 = x - 1./120.;
88 occ.t3 = di + i1 * dx;
89 occ.e3 = o1.act.el;
90 d3 = o1.act.semi2 - o2.act.semi2;
91 if(d3 < 0)
92 d3 = -d3;
93 d4 = o1.act.semi2 + o2.act.semi2;
94 for(i=i1,x=x1;; i++) {
95 setpt(&o1, x);
96 setpt(&o2, x);
97 d1 = d2;
98 d2 = dist(&o1.act, &o2.act);
99 if(i != i1) {
100 if(d1 <= d3 && d2 > d3) {
101 occ.t4 = di + (i-.5) * dx;
102 occ.e4 = o1.act.el;
104 if(d2 > d4) {
105 if(d1 <= d4) {
106 occ.t5 = di + (i-.5) * dx;
107 occ.e5 = o1.act.el;
109 break;
112 x += 1./120.;
114 for(i=i1,x=x1;; i--) {
115 setpt(&o1, x);
116 setpt(&o2, x);
117 d1 = d2;
118 d2 = dist(&o1.act, &o2.act);
119 if(i != i1) {
120 if(d1 <= d3 && d2 > d3) {
121 occ.t2 = di + (i+.5) * dx;
122 occ.e2 = o1.act.el;
124 if(d2 > d4) {
125 if(d1 <= d4) {
126 occ.t1 = di + (i+.5) * dx;
127 occ.e1 = o1.act.el;
129 break;
132 x -= 1./120.;
136 void
137 setpt(Occ *o, double x)
139 double y;
141 y = x * (x-1);
142 o->act.ra = o->del0.ra +
143 x*o->del1.ra + y*o->del2.ra;
144 o->act.decl2 = o->del0.decl2 +
145 x*o->del1.decl2 + y*o->del2.decl2;
146 o->act.semi2 = o->del0.semi2 +
147 x*o->del1.semi2 + y*o->del2.semi2;
148 o->act.el = o->del0.el +
149 x*o->del1.el + y*o->del2.el;
153 double
154 pinorm(double a)
157 while(a < -pi)
158 a += pipi;
159 while(a > pi)
160 a -= pipi;
161 return a;
164 void
165 set3pt(Obj2 *p, int i, Occ *o)
167 Obj1 *p1, *p2, *p3;
168 double a;
170 p1 = p->point+i;
171 p2 = p1+1;
172 p3 = p2+1;
174 o->del0.ra = p1->ra;
175 o->del0.decl2 = p1->decl2;
176 o->del0.semi2 = p1->semi2;
177 o->del0.el = p1->el;
179 a = p2->ra - p1->ra;
180 o->del1.ra = pinorm(a);
181 a = p2->decl2 - p1->decl2;
182 o->del1.decl2 = pinorm(a);
183 o->del1.semi2 = p2->semi2 - p1->semi2;
184 o->del1.el = p2->el - p1->el;
186 a = p1->ra + p3->ra - 2*p2->ra;
187 o->del2.ra = pinorm(a)/2;
188 a = p1->decl2 + p3->decl2 - 2*p2->decl2;
189 o->del2.decl2 = pinorm(a)/2;
190 o->del2.semi2 = (p1->semi2 + p3->semi2 - 2*p2->semi2) / 2;
191 o->del2.el = (p1->el + p3->el - 2*p2->el) / 2;