diff options
author | wkj <devnull@localhost> | 2004-04-21 02:16:43 +0000 |
---|---|---|
committer | wkj <devnull@localhost> | 2004-04-21 02:16:43 +0000 |
commit | cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1 (patch) | |
tree | 336db54785d2b77113a6e570574be715c7eb7d1d /src/cmd/astro/dist.c | |
parent | 95f57b01e21feb457e79eaf52d593422c318024f (diff) | |
download | plan9port-cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1.tar.gz plan9port-cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1.tar.bz2 plan9port-cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1.zip |
Astro with some minor changes to placate Unix.
Diffstat (limited to 'src/cmd/astro/dist.c')
-rw-r--r-- | src/cmd/astro/dist.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/cmd/astro/dist.c b/src/cmd/astro/dist.c new file mode 100644 index 00000000..3aec8752 --- /dev/null +++ b/src/cmd/astro/dist.c @@ -0,0 +1,263 @@ +#include "astro.h" + +double +dist(Obj1 *p, Obj1 *q) +{ + double a; + + a = sin(p->decl2)*sin(q->decl2) + + cos(p->decl2)*cos(q->decl2)*cos(p->ra-q->ra); + a = fabs(atan2(pyth(a), a)) / radsec; + return a; +} + +int +rline(int f) +{ + char *p; + int c; + static char buf[1024]; + static int bc, bn, bf; + + if(bf != f) { + bf = f; + bn = 0; + } + p = line; + do { + if(bn <= 0) { + bn = read(bf, buf, sizeof(buf)); + if(bn <= 0) + return 1; + bc = 0; + } + c = buf[bc]; + bn--; bc++; + *p++ = c; + } while(c != '\n'); + return 0; +} + +double +sunel(double t) +{ + int i; + + i = floor(t); + if(i < 0 || i > NPTS+1) + return -90; + t = osun.point[i].el + + (t-i)*(osun.point[i+1].el - osun.point[i].el); + return t; +} + +double +rise(Obj2 *op, double el) +{ + Obj2 *p; + int i; + double e1, e2; + + e2 = 0; + p = op; + for(i=0; i<=NPTS; i++) { + e1 = e2; + e2 = p->point[i].el; + if(i >= 1 && e1 <= el && e2 > el) + goto found; + } + return -1; + +found: + return i - 1 + (el-e1)/(e2-e1); +} + +double +set(Obj2 *op, double el) +{ + Obj2 *p; + int i; + double e1, e2; + + e2 = 0; + p = op; + for(i=0; i<=NPTS; i++) { + e1 = e2; + e2 = p->point[i].el; + if(i >= 1 && e1 > el && e2 <= el) + goto found; + } + return -1; + +found: + return i - 1 + (el-e1)/(e2-e1); +} + +double +solstice(int n) +{ + int i; + double d1, d2, d3; + + d3 = (n*pi)/2 - pi; + if(n == 0) + d3 += pi; + d2 = 0.; + for(i=0; i<=NPTS; i++) { + d1 = d2; + d2 = osun.point[i].ra; + if(n == 0) { + d2 -= pi; + if(d2 < -pi) + d2 += pipi; + } + if(i >= 1 && d3 >= d1 && d3 < d2) + goto found; + } + return -1; + +found: + return i - (d3-d2)/(d1-d2); +} + +double +betcross(double b) +{ + int i; + double d1, d2; + + d2 = 0; + for(i=0; i<=NPTS; i++) { + d1 = d2; + d2 = osun.point[i].mag; + if(i >= 1 && b >= d1 && b < d2) + goto found; + } + return -1; + +found: + return i - (b-d2)/(d1-d2); +} + +double +melong(Obj2 *op) +{ + Obj2 *p; + int i; + double d1, d2, d3; + + d2 = 0; + d3 = 0; + p = op; + for(i=0; i<=NPTS; i++) { + d1 = d2; + d2 = d3; + d3 = dist(&p->point[i], &osun.point[i]); + if(i >= 2 && d2 >= d1 && d2 >= d3) + goto found; + } + return -1; + +found: + return i - 2; +} + +#define NEVENT 100 +Event events[NEVENT]; +Event* eventp = 0; + +void +event(char *format, char *arg1, char *arg2, double tim, int flag) +{ + Event *p; + + if(flag & DARK) + if(sunel(tim) > -12) + return; + if(flag & LIGHT) + if(sunel(tim) < 0) + return; + if(eventp == 0) + eventp = events; + p = eventp; + if(p >= events+NEVENT) { + fprint(2, "too many events\n"); + return; + } + eventp++; + p->format = format; + p->arg1 = arg1; + p->arg2 = arg2; + p->tim = tim; + p->flag = flag; +} + +int evcomp(); + +void +evflush(void) +{ + Event *p; + + if(eventp == 0) + return; + qsort(events, eventp-events, sizeof *p, evcomp); + for(p = events; p<eventp; p++) { + if((p->flag&SIGNIF) && flags['s']) + print("ding ding ding "); + print(p->format, p->arg1, p->arg2); + if(p->flag & PTIME) + ptime(day + p->tim*deld); + print("\n"); + } + eventp = 0; +} + +int +evcomp(void *a1, void *a2) +{ + double t1, t2; + Event *p1, *p2; + + p1 = a1; + p2 = a2; + t1 = p1->tim; + t2 = p2->tim; + if(p1->flag & SIGNIF) + t1 -= 1000.; + if(p2->flag & SIGNIF) + t2 -= 1000.; + if(t1 > t2) + return 1; + if(t2 > t1) + return -1; + return 0; +} + +double +pyth(double x) +{ + + x *= x; + if(x > 1) + x = 1; + return sqrt(1-x); +} + +char* +skip(int n) +{ + int i; + char *cp; + + cp = line; + for(i=0; i<n; i++) { + while(*cp == ' ' || *cp == '\t') + cp++; + while(*cp != '\n' && *cp != ' ' && *cp != '\t') + cp++; + } + while(*cp == ' ' || *cp == '\t') + cp++; + return cp; +} |