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