Astro with some minor changes to placate Unix.
This commit is contained in:
parent
95f57b01e2
commit
cd5bae7871
33 changed files with 4819 additions and 0 deletions
263
src/cmd/astro/dist.c
Normal file
263
src/cmd/astro/dist.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue