plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dist.c (3488B)


      1 #include "astro.h"
      2 
      3 double
      4 dist(Obj1 *p, Obj1 *q)
      5 {
      6 	double a;
      7 
      8 	a = sin(p->decl2)*sin(q->decl2) +
      9 		cos(p->decl2)*cos(q->decl2)*cos(p->ra-q->ra);
     10 	a = fabs(atan2(pyth(a), a)) / radsec;
     11 	return a;
     12 }
     13 
     14 int
     15 rline(int f)
     16 {
     17 	char *p;
     18 	int c;
     19 	static char buf[1024];
     20 	static int bc, bn, bf;
     21 
     22 	if(bf != f) {
     23 		bf = f;
     24 		bn = 0;
     25 	}
     26 	p = line;
     27 	do {
     28 		if(bn <= 0) {
     29 			bn = read(bf, buf, sizeof(buf));
     30 			if(bn <= 0)
     31 				return 1;
     32 			bc = 0;
     33 		}
     34 		c = buf[bc];
     35 		bn--; bc++;
     36 		*p++ = c;
     37 	} while(c != '\n');
     38 	return 0;
     39 }
     40 
     41 double
     42 sunel(double t)
     43 {
     44 	int i;
     45 
     46 	i = floor(t);
     47 	if(i < 0 || i > NPTS+1)
     48 		return -90;
     49 	t = osun.point[i].el +
     50 		(t-i)*(osun.point[i+1].el - osun.point[i].el);
     51 	return t;
     52 }
     53 
     54 double
     55 rise(Obj2 *op, double el)
     56 {
     57 	Obj2 *p;
     58 	int i;
     59 	double e1, e2;
     60 
     61 	e2 = 0;
     62 	p = op;
     63 	for(i=0; i<=NPTS; i++) {
     64 		e1 = e2;
     65 		e2 = p->point[i].el;
     66 		if(i >= 1 && e1 <= el && e2 > el)
     67 			goto found;
     68 	}
     69 	return -1;
     70 
     71 found:
     72 	return i - 1 + (el-e1)/(e2-e1);
     73 }
     74 
     75 double
     76 set(Obj2 *op, double el)
     77 {
     78 	Obj2 *p;
     79 	int i;
     80 	double e1, e2;
     81 
     82 	e2 = 0;
     83 	p = op;
     84 	for(i=0; i<=NPTS; i++) {
     85 		e1 = e2;
     86 		e2 = p->point[i].el;
     87 		if(i >= 1 && e1 > el && e2 <= el)
     88 			goto found;
     89 	}
     90 	return -1;
     91 
     92 found:
     93 	return i - 1 + (el-e1)/(e2-e1);
     94 }
     95 
     96 double
     97 solstice(int n)
     98 {
     99 	int i;
    100 	double d1, d2, d3;
    101 
    102 	d3 = (n*pi)/2 - pi;
    103 	if(n == 0)
    104 		d3 += pi;
    105 	d2 = 0.;
    106 	for(i=0; i<=NPTS; i++) {
    107 		d1 = d2;
    108 		d2 = osun.point[i].ra;
    109 		if(n == 0) {
    110 			d2 -= pi;
    111 			if(d2 < -pi)
    112 				d2 += pipi;
    113 		}
    114 		if(i >= 1 && d3 >= d1 && d3 < d2)
    115 			goto found;
    116 	}
    117 	return -1;
    118 
    119 found:
    120 	return i - (d3-d2)/(d1-d2);
    121 }
    122 
    123 double
    124 betcross(double b)
    125 {
    126 	int i;
    127 	double d1, d2;
    128 
    129 	d2 = 0;
    130 	for(i=0; i<=NPTS; i++) {
    131 		d1 = d2;
    132 		d2 = osun.point[i].mag;
    133 		if(i >= 1 && b >= d1 && b < d2)
    134 			goto found;
    135 	}
    136 	return -1;
    137 
    138 found:
    139 	return i - (b-d2)/(d1-d2);
    140 }
    141 
    142 double
    143 melong(Obj2 *op)
    144 {
    145 	Obj2 *p;
    146 	int i;
    147 	double d1, d2, d3;
    148 
    149 	d2 = 0;
    150 	d3 = 0;
    151 	p = op;
    152 	for(i=0; i<=NPTS; i++) {
    153 		d1 = d2;
    154 		d2 = d3;
    155 		d3 = dist(&p->point[i], &osun.point[i]);
    156 		if(i >= 2 && d2 >= d1 && d2 >= d3)
    157 			goto found;
    158 	}
    159 	return -1;
    160 
    161 found:
    162 	return i - 2;
    163 }
    164 
    165 #define	NEVENT	100
    166 Event	events[NEVENT];
    167 Event*	eventp = 0;
    168 
    169 void
    170 event(char *format, char *arg1, char *arg2, double tim, int flag)
    171 {
    172 	Event *p;
    173 
    174 	if(flag & DARK)
    175 		if(sunel(tim) > -12)
    176 			return;
    177 	if(flag & LIGHT)
    178 		if(sunel(tim) < 0)
    179 			return;
    180 	if(eventp == 0)
    181 		eventp = events;
    182 	p = eventp;
    183 	if(p >= events+NEVENT) {
    184 		fprint(2, "too many events\n");
    185 		return;
    186 	}
    187 	eventp++;
    188 	p->format = format;
    189 	p->arg1 = arg1;
    190 	p->arg2 = arg2;
    191 	p->tim = tim;
    192 	p->flag = flag;
    193 }
    194 
    195 int	evcomp(const void*, const void*);
    196 
    197 void
    198 evflush(void)
    199 {
    200 	Event *p;
    201 
    202 	if(eventp == 0)
    203 		return;
    204 	qsort(events, eventp-events, sizeof *p, evcomp);
    205 	for(p = events; p<eventp; p++) {
    206 		if((p->flag&SIGNIF) && flags['s'])
    207 			print("ding ding ding ");
    208 		print(p->format, p->arg1, p->arg2);
    209 		if(p->flag & PTIME)
    210 			ptime(day + p->tim*deld);
    211 		print("\n");
    212 	}
    213 	eventp = 0;
    214 }
    215 
    216 int
    217 evcomp(const void *a1, const void *a2)
    218 {
    219 	double t1, t2;
    220 	Event *p1, *p2;
    221 
    222 	p1 = (Event*)a1;
    223 	p2 = (Event*)a2;
    224 	t1 = p1->tim;
    225 	t2 = p2->tim;
    226 	if(p1->flag & SIGNIF)
    227 		t1 -= 1000.;
    228 	if(p2->flag & SIGNIF)
    229 		t2 -= 1000.;
    230 	if(t1 > t2)
    231 		return 1;
    232 	if(t2 > t1)
    233 		return -1;
    234 	return 0;
    235 }
    236 
    237 double
    238 pyth(double x)
    239 {
    240 
    241 	x *= x;
    242 	if(x > 1)
    243 		x = 1;
    244 	return sqrt(1-x);
    245 }
    246 
    247 char*
    248 skip(int n)
    249 {
    250 	int i;
    251 	char *cp;
    252 
    253 	cp = line;
    254 	for(i=0; i<n; i++) {
    255 		while(*cp == ' ' || *cp == '\t')
    256 			cp++;
    257 		while(*cp != '\n' && *cp != ' ' && *cp != '\t')
    258 			cp++;
    259 	}
    260 	while(*cp == ' ' || *cp == '\t')
    261 		cp++;
    262 	return cp;
    263 }