plan9port

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

search.c (3595B)


      1 #include "astro.h"
      2 
      3 char*	solstr[] =
      4 {
      5 	"Fall equinox",
      6 	"Winter solstice",
      7 	"Spring equinox",
      8 	"Summer solstice"
      9 };
     10 
     11 struct
     12 {
     13 	double	beta;
     14 	int	rta;
     15 	int	dec;
     16 	char	*betstr;
     17 } bettab[] =
     18 {
     19 	-1.3572, 231,	50,	"Quadrantid",
     20 	 0.7620, 336,	0,	"Eta aquarid",
     21 	 1.5497, 260,	-20,	"Ophiuchid",
     22 	 2.1324, 315,	-15,	"Capricornid",
     23 	 2.1991, 339,	-17,	"Delta aquarid",
     24 	 2.2158, 340,	-30,	"Pisces australid",
     25 	 2.4331, 46,	58,	"Perseid",
     26 	-2.6578, 95,	15,	"Orionid",
     27 	-1.8678, 15,	-55,	"Phoenicid",
     28 	-1.7260, 113,	32,	"Geminid",
     29 	0
     30 };
     31 
     32 void
     33 search(void)
     34 {
     35 	Obj2 *p, *q;
     36 	int i, j;
     37 	double t;
     38 
     39 	for(i=0; objlst[i]; i++) {
     40 		p = objlst[i];
     41 		if(p == &oshad)
     42 			continue;
     43 		t = rise(p, -.833);
     44 		if(t >= 0.)
     45 			event("%s rises at ", p->name, "", t,
     46 				i==0? PTIME: PTIME|DARK);
     47 		t = set(p, -.833);
     48 		if(t >= 0.)
     49 			event("%s sets at ", p->name, "", t,
     50 				i==0? PTIME: PTIME|DARK);
     51 		if(p == &osun) {
     52 			for(j=0; j<4; j++) {
     53 				t = solstice(j);
     54 				if(t >= 0)
     55 					event("%s at ", solstr[j], "", t,
     56 						SIGNIF|PTIME);
     57 			}
     58 			for(j=0; bettab[j].beta!=0; j++) {
     59 				t = betcross(bettab[j].beta);
     60 				if(t >= 0)
     61 					event("%s  meeteeor shouwer",
     62 					bettab[j].betstr, "", t, SIGNIF);
     63 			}
     64 			t = rise(p, -18);
     65 			if(t >= 0)
     66 				event("Twilight starts at ", "", "", t, PTIME);
     67 			t = set(p, -18);
     68 			if(t >= 0)
     69 				event("Twilight ends at ", "", "", t, PTIME);
     70 		}
     71 		if(p == &omoon)
     72 		for(j=0; j<NPTS; j++) {
     73 			if(p->point[j].mag > .75 && p->point[j+1].mag < .25)
     74 				event("New moon", "", "", 0, 0);
     75 			if(p->point[j].mag <= .25 && p->point[j+1].mag > .25)
     76 				event("First quarter moon", "", "", 0, 0);
     77 			if(p->point[j].mag <= .50 && p->point[j+1].mag > .50)
     78 				event("Full moon", "", "", 0, 0);
     79 			if(p->point[j].mag <= .75 && p->point[j+1].mag > .75)
     80 				event("Last quarter moon", "", "", 0, 0);
     81 		}
     82 		if(p == &omerc || p == &ovenus) {
     83 			t = melong(p);
     84 			if(t >= 0) {
     85 				t = rise(p, 0) - rise(&osun, 0);
     86 				if(t < 0)
     87 					t += NPTS;
     88 				if(t > NPTS)
     89 					t -= NPTS;
     90 				if(t > NPTS/2)
     91 				event("Morning elongation of %s", p->name,
     92 					"", 0, SIGNIF);
     93 				else
     94 				event("Evening elongation of %s", p->name,
     95 					"", 0, SIGNIF);
     96 			}
     97 		}
     98 		for(j=i; objlst[j]; j++) {
     99 			if(i == j)
    100 				continue;
    101 			q = objlst[j];
    102 			if(p == &omoon || q == &omoon) {
    103 				occult(p, q, 0);
    104 				if(occ.t3 < 0)
    105 					continue;
    106 				if(p == &osun || q == &oshad) {
    107 					if(occ.t1 >= 0)
    108 					event("Partial eclipse of %s begins at ", p->name, "",
    109 						occ.t1, SIGNIF|PTIME);
    110 					if(occ.t2 >= 0)
    111 					event("Total eclipse of %s begins at ", p->name, "",
    112 						occ.t2, SIGNIF|PTIME);
    113 					if(occ.t4 >= 0)
    114 					event("Total eclipse of %s ends at ", p->name, "",
    115 						occ.t4, SIGNIF|PTIME);
    116 					if(occ.t5 >= 0)
    117 					event("Partial eclipse of %s ends at ", p->name, "",
    118 						occ.t5, SIGNIF|PTIME);
    119 				} else {
    120 					if(occ.t1 >= 0)
    121 					event("Occultation of %s begins at ", q->name, "",
    122 						occ.t1, SIGNIF|PTIME);
    123 					if(occ.t5 >= 0)
    124 					event("Occultation of %s ends at ", q->name, "",
    125 						occ.t5, SIGNIF|PTIME);
    126 				}
    127 				continue;
    128 			}
    129 			if(p == &osun) {
    130 				if(q != &omerc && q != &ovenus)
    131 					continue;
    132 				occult(p, q, -1);
    133 				if(occ.t3 >= 0.) {
    134 					if(occ.t1 >= 0)
    135 					event("Transit of %s begins at ", q->name, "",
    136 						occ.t1, SIGNIF|LIGHT|PTIME);
    137 					if(occ.t5 >= 0)
    138 					event("Transit of %s ends at ", q->name, "",
    139 						occ.t5, SIGNIF|LIGHT|PTIME);
    140 				}
    141 				continue;
    142 			}
    143 			t = dist(&p->point[0], &q->point[0]);
    144 			if(t > 5000)
    145 				continue;
    146 			event("%s is in the house of %s",
    147 				p->name, q->name, 0, 0);
    148 		}
    149 	}
    150 	if(flags['o'])
    151 		stars();
    152 	if(flags['a'])
    153 		satels();
    154 	evflush();
    155 }