| #include "astro.h" |
| |
| Occ o1, o2; |
| Obj2 xo1, xo2; |
| |
| void |
| occult(Obj2 *p1, Obj2 *p2, double d) |
| { |
| int i, i1, N; |
| double d1, d2, d3, d4; |
| double x, di, dx, x1; |
| |
| USED(d); |
| |
| d3 = 0; |
| d2 = 0; |
| occ.t1 = -100; |
| occ.t2 = -100; |
| occ.t3 = -100; |
| occ.t4 = -100; |
| occ.t5 = -100; |
| for(i=0; i<=NPTS+1; i++) { |
| d1 = d2; |
| d2 = d3; |
| d3 = dist(&p1->point[i], &p2->point[i]); |
| if(i >= 2 && d2 <= d1 && d2 <= d3) |
| goto found; |
| } |
| return; |
| |
| found: |
| N = 2880*PER/NPTS; /* 1 min steps */ |
| i -= 2; |
| set3pt(p1, i, &o1); |
| set3pt(p2, i, &o2); |
| |
| di = i; |
| x = 0; |
| dx = 2./N; |
| for(i=0; i<=N; i++) { |
| setpt(&o1, x); |
| setpt(&o2, x); |
| d1 = d2; |
| d2 = d3; |
| d3 = dist(&o1.act, &o2.act); |
| if(i >= 2 && d2 <= d1 && d2 <= d3) |
| goto found1; |
| x += dx; |
| } |
| fprint(2, "bad 1 \n"); |
| return; |
| |
| found1: |
| if(d2 > o1.act.semi2+o2.act.semi2+50) |
| return; |
| di += x - 3*dx; |
| x = 0; |
| for(i=0; i<3; i++) { |
| setime(day + deld*(di + x)); |
| (*p1->obj)(); |
| setobj(&xo1.point[i]); |
| (*p2->obj)(); |
| setobj(&xo2.point[i]); |
| x += 2*dx; |
| } |
| dx /= 60; |
| x = 0; |
| set3pt(&xo1, 0, &o1); |
| set3pt(&xo2, 0, &o2); |
| for(i=0; i<=240; i++) { |
| setpt(&o1, x); |
| setpt(&o2, x); |
| d1 = d2; |
| d2 = d3; |
| d3 = dist(&o1.act, &o2.act); |
| if(i >= 2 && d2 <= d1 && d2 <= d3) |
| goto found2; |
| x += 1./120.; |
| } |
| fprint(2, "bad 2 \n"); |
| return; |
| |
| found2: |
| if(d2 > o1.act.semi2 + o2.act.semi2) |
| return; |
| i1 = i-1; |
| x1 = x - 1./120.; |
| occ.t3 = di + i1 * dx; |
| occ.e3 = o1.act.el; |
| d3 = o1.act.semi2 - o2.act.semi2; |
| if(d3 < 0) |
| d3 = -d3; |
| d4 = o1.act.semi2 + o2.act.semi2; |
| for(i=i1,x=x1;; i++) { |
| setpt(&o1, x); |
| setpt(&o2, x); |
| d1 = d2; |
| d2 = dist(&o1.act, &o2.act); |
| if(i != i1) { |
| if(d1 <= d3 && d2 > d3) { |
| occ.t4 = di + (i-.5) * dx; |
| occ.e4 = o1.act.el; |
| } |
| if(d2 > d4) { |
| if(d1 <= d4) { |
| occ.t5 = di + (i-.5) * dx; |
| occ.e5 = o1.act.el; |
| } |
| break; |
| } |
| } |
| x += 1./120.; |
| } |
| for(i=i1,x=x1;; i--) { |
| setpt(&o1, x); |
| setpt(&o2, x); |
| d1 = d2; |
| d2 = dist(&o1.act, &o2.act); |
| if(i != i1) { |
| if(d1 <= d3 && d2 > d3) { |
| occ.t2 = di + (i+.5) * dx; |
| occ.e2 = o1.act.el; |
| } |
| if(d2 > d4) { |
| if(d1 <= d4) { |
| occ.t1 = di + (i+.5) * dx; |
| occ.e1 = o1.act.el; |
| } |
| break; |
| } |
| } |
| x -= 1./120.; |
| } |
| } |
| |
| void |
| setpt(Occ *o, double x) |
| { |
| double y; |
| |
| y = x * (x-1); |
| o->act.ra = o->del0.ra + |
| x*o->del1.ra + y*o->del2.ra; |
| o->act.decl2 = o->del0.decl2 + |
| x*o->del1.decl2 + y*o->del2.decl2; |
| o->act.semi2 = o->del0.semi2 + |
| x*o->del1.semi2 + y*o->del2.semi2; |
| o->act.el = o->del0.el + |
| x*o->del1.el + y*o->del2.el; |
| } |
| |
| |
| double |
| pinorm(double a) |
| { |
| |
| while(a < -pi) |
| a += pipi; |
| while(a > pi) |
| a -= pipi; |
| return a; |
| } |
| |
| void |
| set3pt(Obj2 *p, int i, Occ *o) |
| { |
| Obj1 *p1, *p2, *p3; |
| double a; |
| |
| p1 = p->point+i; |
| p2 = p1+1; |
| p3 = p2+1; |
| |
| o->del0.ra = p1->ra; |
| o->del0.decl2 = p1->decl2; |
| o->del0.semi2 = p1->semi2; |
| o->del0.el = p1->el; |
| |
| a = p2->ra - p1->ra; |
| o->del1.ra = pinorm(a); |
| a = p2->decl2 - p1->decl2; |
| o->del1.decl2 = pinorm(a); |
| o->del1.semi2 = p2->semi2 - p1->semi2; |
| o->del1.el = p2->el - p1->el; |
| |
| a = p1->ra + p3->ra - 2*p2->ra; |
| o->del2.ra = pinorm(a)/2; |
| a = p1->decl2 + p3->decl2 - 2*p2->decl2; |
| o->del2.decl2 = pinorm(a)/2; |
| o->del2.semi2 = (p1->semi2 + p3->semi2 - 2*p2->semi2) / 2; |
| o->del2.el = (p1->el + p3->el - 2*p2->el) / 2; |
| } |