xref: /plan9-contrib/sys/src/cmd/astro/init.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include "astro.h"
2 
3 Obj2*	objlst[] =
4 {
5 	&osun,
6 	&omoon,
7 	&oshad,
8 	&omerc,
9 	&ovenus,
10 	&omars,
11 	&ojup,
12 	&osat,
13 	&ocomet,
14 	0,
15 };
16 
17 struct	idata
18 {
19 	char*	name;
20 	void	(*obj)(void);
21 } idata[] =
22 {
23 	"The sun",	fsun,
24 	"The moon",	moon,
25 	"The shadow",	shad,
26 	"Mercury",	merc,
27 	"Venus",	venus,
28 	"Mars",		mars,
29 	"Jupiter",	jup,
30 	"Saturn",	sat,
31 	"Comet",	comet,
32 };
33 
34 void
35 init(void)
36 {
37 	Obj2 *q;
38 	int i;
39 
40 	glat = nlat - (692.74*radsec)*sin(2.*nlat)
41 		 + (1.16*radsec)*sin(4.*nlat);
42 	erad = .99832707e0 + .00167644e0*cos(2.*nlat)
43 		 - 0.352e-5*cos(4.*nlat)
44 		 + 0.001e-5*cos(6.*nlat)
45 		 + 0.1568e-6*elev;
46 
47 	for(i=0; q=objlst[i]; i++) {
48 		q->name = idata[i].name;
49 		q->obj = idata[i].obj;
50 	}
51 	ostar.obj = fstar;
52 	ostar.name = "star";
53 }
54 
55 void
56 setime(double d)
57 {
58 	double x, xm, ym, zm;
59 
60 	eday = d + deltat/86400.;
61 	wlong = awlong + 15.*deltat*radsec;
62 
63 	capt = eday/36525.e0;
64 	capt2 = capt*capt;
65 	capt3 = capt*capt2;
66 	nutate();
67 	eday += .1;
68 	sun();
69 	srad = rad;
70 	xm = rad*cos(beta)*cos(lambda);
71 	ym = rad*cos(beta)*sin(lambda);
72 	zm = rad*sin(beta);
73 	eday -= .1;
74 	sun();
75 	xms = rad*cos(beta)*cos(lambda);
76 	yms = rad*cos(beta)*sin(lambda);
77 	zms = rad*sin(beta);
78 	x = .057756;
79 	xdot = x*(xm-xms);
80 	ydot = x*(ym-yms);
81 	zdot = x*(zm-zms);
82 }
83 
84 void
85 setobj(Obj1 *op)
86 {
87 	Obj1 *p;
88 
89 	p = op;
90 	p->ra = ra;
91 	p->decl2 = decl2;
92 	p->semi2 = semi2;
93 	p->az = az;
94 	p->el = el;
95 	p->mag = mag;
96 }
97 
98 long	starsao = 0;
99 
100 void
101 fstar(void)
102 {
103 
104 	ra = ostar.point[0].ra;
105 	decl2 = ostar.point[0].decl2;
106 	semi2 = ostar.point[0].semi2;
107 	az = ostar.point[0].az;
108 	el = ostar.point[0].el;
109 	mag = ostar.point[0].mag;
110 }
111 
112 void
113 fsun(void)
114 {
115 
116 	beta = 0;
117 	rad = 0;
118 	lambda = 0;
119 	motion = 0;
120 	helio();
121 	geo();
122 	seday = eday;
123 	salph = alpha;
124 	sdelt = delta;
125 	mag = lmb2;
126 }
127 
128 void
129 shad(void)
130 {
131 
132 	if(seday != eday)
133 		fsun();
134 	if(meday != eday)
135 		moon();
136 	alpha = fmod(salph+pi, pipi);
137 	delta = -sdelt;
138 	hp = mhp;
139 	semi = 1.0183*mhp/radsec - 969.85/srad;
140 	geo();
141 }
142