diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/astro/occ.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/astro/occ.c')
-rwxr-xr-x | sys/src/cmd/astro/occ.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/sys/src/cmd/astro/occ.c b/sys/src/cmd/astro/occ.c new file mode 100755 index 000000000..c0c8bc841 --- /dev/null +++ b/sys/src/cmd/astro/occ.c @@ -0,0 +1,190 @@ +#include "astro.h" + +Occ o1, o2; +Obj2 xo1, xo2; + +void +occult(Obj2 *p1, Obj2 *p2, double) +{ + int i, i1, N; + double d1, d2, d3, d4; + double x, di, dx, x1; + + 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; +} |