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/dist.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/astro/dist.c')
-rwxr-xr-x | sys/src/cmd/astro/dist.c | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/sys/src/cmd/astro/dist.c b/sys/src/cmd/astro/dist.c new file mode 100755 index 000000000..7ff842ec0 --- /dev/null +++ b/sys/src/cmd/astro/dist.c @@ -0,0 +1,261 @@ +#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; +} + +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; +} |