Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#define DIR	"/lib/sky"
2
/*
3
 *	This code reflects many years of changes.  There remain residues
4
 *		of prior implementations.
5
 *
6
 *	Keys:
7
 *		32 bits long. High 26 bits are encoded as described below.
8
 *		Low 6 bits are types:
9
 *
10
 *		Patch is ~ one square degree of sky.  It points to an otherwise
11
 *			anonymous list of Catalog keys.  The 0th key is special:
12
 *			it contains up to 4 constellation identifiers.
13
 *		Catalogs (SAO,NGC,M,...) are:
14
 *			31.........8|76|543210
15
 *			  catalog # |BB|catalog name
16
 *			BB is two bits of brightness:
17
 *				00	-inf <  m <=  7
18
 *				01	   7 <  m <= 10
19
 *				10	  10 <  m <= 13
20
 *				11	  13 <  m <  inf
21
 *			The BB field is a dreg, and correct only for SAO and NGC.
22
 *			IC(n) is just NGC(n+7840)
23
 *		Others should be self-explanatory.
24
 *	
25
 *	Records:
26
 *
27
 *	Star is an SAOrec
28
 *	Galaxy, PlanetaryN, OpenCl, GlobularCl, DiffuseN, etc., are NGCrecs.
29
 *	Abell is an Abellrec
30
 *	The Namedxxx records hold a name and a catalog entry; they result from
31
 *		name lookups.
32
 */
33
 
34
typedef enum
35
{
36
	Planet,
37
	Patch,
38
	SAO,
39
	NGC,
40
	M,
41
	Constel_deprecated,
42
	Nonstar_deprecated,
43
	NamedSAO,
44
	NamedNGC,
45
	NamedAbell,
46
	Abell,
47
	/* NGC types */
48
	Galaxy,
49
	PlanetaryN,
50
	OpenCl,
51
	GlobularCl,
52
	DiffuseN,
53
	NebularCl,
54
	Asterism,
55
	Knot,
56
	Triple,
57
	Double,
58
	Single,
59
	Uncertain,
60
	Nonexistent,
61
	Unknown,
62
	PlateDefect,
63
	/* internal */
64
	NGCN,
65
	PatchC,
66
	NONGC,
67
}Type;
68
 
69
enum
70
{
71
	/*
72
	 * parameters for plate
73
	 */
74
	Pppo1	= 0,
75
	Pppo2,
76
	Pppo3,
77
	Pppo4,
78
	Pppo5,
79
	Pppo6,
80
	Pamdx1,
81
	Pamdx2,
82
	Pamdx3,
83
	Pamdx4,
84
	Pamdx5,
85
	Pamdx6,
86
	Pamdx7,
87
	Pamdx8,
88
	Pamdx9,
89
	Pamdx10,
90
	Pamdx11,
91
	Pamdx12,
92
	Pamdx13,
93
	Pamdx14,
94
	Pamdx15,
95
	Pamdx16,
96
	Pamdx17,
97
	Pamdx18,
98
	Pamdx19,
99
	Pamdx20,
100
	Pamdy1,
101
	Pamdy2,
102
	Pamdy3,
103
	Pamdy4,
104
	Pamdy5,
105
	Pamdy6,
106
	Pamdy7,
107
	Pamdy8,
108
	Pamdy9,
109
	Pamdy10,
110
	Pamdy11,
111
	Pamdy12,
112
	Pamdy13,
113
	Pamdy14,
114
	Pamdy15,
115
	Pamdy16,
116
	Pamdy17,
117
	Pamdy18,
118
	Pamdy19,
119
	Pamdy20,
120
	Ppltscale,
121
	Pxpixelsz,
122
	Pypixelsz,
123
	Ppltra,
124
	Ppltrah,
125
	Ppltram,
126
	Ppltras,
127
	Ppltdec,
128
	Ppltdecd,
129
	Ppltdecm,
130
	Ppltdecs,
131
	Pnparam,
132
};
133
 
134
#define	UNKNOWNMAG	32767
135
#define	NPlanet			20
136
 
137
typedef float	Angle;	/* in radians */
138
typedef long	DAngle;	/* on disk: in units of milliarcsec */
139
typedef short	Mag;	/* multiplied by 10 */
140
typedef long	Key;	/* known to be 4 bytes, unfortunately */
141
 
142
/*
143
 * All integers are stored in little-endian order.
144
 */
145
typedef struct NGCrec NGCrec;
146
struct NGCrec{
147
	DAngle	ra;
148
	DAngle	dec;
149
	DAngle	dummy1;	/* compatibility with old RNGC version */
150
	DAngle	diam;
151
	Mag	mag;
152
	short	ngc;	/* if >NNGC, IC number is ngc-NNGC */
153
	char	diamlim;
154
	char	type;
155
	char	magtype;
156
	char	dummy2;
157
	char	desc[52];	/* 0-terminated Dreyer description */
158
};
159
 
160
typedef struct Abellrec Abellrec;
161
struct Abellrec{
162
	DAngle	ra;
163
	DAngle	dec;
164
	DAngle	glat;
165
	DAngle	glong;
166
	Mag	mag10;	/* mag of 10th brightest cluster member; in same place as ngc.mag*/
167
	short	abell;
168
	DAngle	rad;
169
	short	pop;
170
	short	dist;
171
	char	distgrp;
172
	char	richgrp;
173
	char	flag;
174
	char	pad;
175
};
176
 
177
typedef struct Planetrec Planetrec;
178
struct Planetrec{
179
	DAngle	ra;
180
	DAngle	dec;
181
	DAngle	az;
182
	DAngle	alt;
183
	DAngle	semidiam;
184
	double	phase;
185
	char		name[16];
186
};
187
 
188
/*
189
 * Star names: 0,0==unused.  Numbers are name[0]=1,..,99.
190
 * Greek letters are alpha=101, etc.
191
 * Constellations are alphabetical order by abbreviation, and=1, etc.
192
 */
193
typedef struct SAOrec SAOrec;
194
struct SAOrec{
195
	DAngle	ra;
196
	DAngle	dec;
197
	DAngle	dra;
198
	DAngle	ddec;
199
	Mag	mag;		/* visual */
200
	Mag	mpg;
201
	char	spec[3];
202
	char	code;
203
	char	compid[2];
204
	char	hdcode;
205
	char	pad1;
206
	long	hd;		/* HD catalog number */
207
	char	name[3];	/* name[0]=alpha name[1]=2 name[3]=ori */
208
	char	nname;		/* number of prose names */
209
	/* 36 bytes to here */
210
};
211
 
212
typedef struct Mindexrec Mindexrec;
213
struct Mindexrec{	/* code knows the bit patterns in here; this is a long */
214
	char	m;		/* M number */
215
	char	dummy;
216
	short	ngc;
217
};
218
 
219
typedef struct Bayerec Bayerec;
220
struct Bayerec{
221
	long	sao;
222
	char	name[3];
223
	char	pad;
224
};
225
 
226
/*
227
 * Internal form
228
 */
229
 
230
typedef struct Namedrec Namedrec;
231
struct Namedrec{
232
	char	name[36];
233
};
234
 
235
typedef struct Namerec Namerec;
236
struct Namerec{
237
	long	sao;
238
	long	ngc;
239
	long	abell;
240
	char	name[36];	/* null terminated */
241
};
242
 
243
typedef struct Patchrec Patchrec;
244
struct Patchrec{
245
	int	nkey;
246
	long	key[60];
247
};
248
 
249
typedef struct Record Record;
250
struct Record{
251
	Type	type;
252
	long	index;
253
	union{
254
		SAOrec	sao;
255
		NGCrec	ngc;
256
		Abellrec	abell;
257
		Namedrec	named;
258
		Patchrec	patch;
259
		Planetrec	planet;
260
		/* PatchCrec is empty */
261
	};
262
};
263
 
264
typedef struct Name Name;
265
struct Name{
266
	char	*name;
267
	int	type;
268
};
269
 
270
typedef	struct	Plate	Plate;
271
struct	Plate
272
{
273
	char	rgn[7];
274
	char	disk;
275
	Angle	ra;
276
	Angle	dec;
277
};
278
 
279
typedef	struct	Header	Header;
280
struct	Header
281
{
282
	float	param[Pnparam];
283
	int	amdflag;
284
 
285
	float	x;
286
	float	y;
287
	float	xi;
288
	float	eta;
289
};
290
typedef	long	Pix;
291
 
292
typedef struct	Img Img;
293
struct	Img
294
{
295
	int	nx;
296
	int	ny;	/* ny is the fast-varying dimension */
297
	Pix	a[1];
298
};
299
 
300
#define	RAD(x)	((x)*PI_180)
301
#define	DEG(x)	((x)/PI_180)
302
#define	ARCSECONDS_PER_RADIAN	(DEG(1)*3600)
303
#define	MILLIARCSEC	(1000*60*60)
304
 
305
int	nplate;
306
Plate	plate[2000];		/* needs to go to 2000 when the north comes */
307
double	PI_180;
308
double	TWOPI;
309
double	LN2;
310
int	debug;
311
struct
312
{
313
	float	min;
314
	float	max;
315
	float	gamma;
316
	float	absgamma;
317
	float	mult1;
318
	float	mult2;
319
	int	neg;
320
} gam;
321
 
322
typedef struct Picture Picture;
323
struct Picture
324
{
325
	int	minx;
326
	int	miny;
327
	int	maxx;
328
	int	maxy;
329
	char	name[16];
330
	uchar	*data;
331
};
332
 
333
typedef struct Image Image;
334
 
335
extern	double	PI_180;
336
extern	double	TWOPI;
337
extern	char	*progname;
338
extern	char	*desctab[][2];
339
extern	Name	names[];
340
extern	Record	*rec;
341
extern	long		nrec;
342
extern	Planetrec	*planet;
343
/* for bbox: */
344
extern	int		folded;
345
extern	DAngle	ramin;
346
extern	DAngle	ramax;
347
extern	DAngle	decmin;
348
extern	DAngle	decmax;
349
extern	Biobuf	bout;
350
 
351
extern void saoopen(void);
352
extern void ngcopen(void);
353
extern void patchopen(void);
354
extern void mopen(void);
355
extern void constelopen(void);
356
extern void lowercase(char*);
357
extern void lookup(char*, int);
358
extern int typetab(int);
359
extern char*ngcstring(int);
360
extern char*skip(int, char*);
361
extern void prrec(Record*);
362
extern int equal(char*, char*);
363
extern int parsename(char*);
364
extern void radec(int, int*, int*, int*);
365
extern int btag(short);
366
extern long patcha(Angle, Angle);
367
extern long patch(int, int, int);
368
extern char*hms(Angle);
369
extern char*dms(Angle);
370
extern char*ms(Angle);
371
extern char*hm(Angle);
372
extern char*dm(Angle);
373
extern char*deg(Angle);
374
extern char*hm5(Angle);
375
extern long dangle(Angle);
376
extern Angle angle(DAngle);
377
extern void prdesc(char*, char*(*)[2], short*);
378
extern double	xsqrt(double);
379
extern Angle	dist(Angle, Angle, Angle, Angle);
380
extern Header*	getheader(char*);
381
extern char*	getword(char*, char*);
382
extern void	amdinv(Header*, Angle, Angle, float, float);
383
extern void	ppoinv(Header*, Angle, Angle);
384
extern void	xypos(Header*, Angle, Angle, float, float);
385
extern void	traneqstd(Header*, Angle, Angle);
386
extern Angle	getra(char*);
387
extern Angle	getdec(char*);
388
extern void	getplates(void);
389
extern Img*	dssread(char*);
390
extern void	hinv(Pix*, int, int);
391
extern int	input_bit(Biobuf*);
392
extern int	input_nbits(Biobuf*, int);
393
extern int	input_huffman(Biobuf*);
394
extern	int	input_nybble(Biobuf*);
395
extern void	qtree_decode(Biobuf*, Pix*, int, int, int, int);
396
extern void	start_inputing_bits(void);
397
extern Picture*	image(Angle, Angle, Angle, Angle);
398
extern char*	dssmount(int);
399
extern int	dogamma(Pix);
400
extern void	displaypic(Picture*);
401
extern void	displayimage(Image*);
402
extern void	plot(char*);
403
extern void	astro(char*, int);
404
extern char*	alpha(char*, char*);
405
extern char*	skipbl(char*);
406
extern void	flatten(void);
407
extern int		bbox(long, long, int);
408
extern int		inbbox(DAngle, DAngle);
409
extern char*	nameof(Record*);
410
 
411
#define	NINDEX	400