xref: /plan9/sys/src/cmd/scat/patch.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier #include "sky.h"
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier /*
73e12c5d1SDavid du Colombier  * dec varies from -89 to 89, inclusive.
83e12c5d1SDavid du Colombier  * ra varies depending on dec; each patch is about 1 square degree.
93e12c5d1SDavid du Colombier  *
103e12c5d1SDavid du Colombier  * Northern hemisphere (0<=dec<=89):
113e12c5d1SDavid du Colombier  *	from  0<=dec<=59, ra is every 4m,  360 values
123e12c5d1SDavid du Colombier  *	from 60<=dec<=69, ra is every 8m,  180 values
133e12c5d1SDavid du Colombier  *	from 70<=dec<=79, ra is every 12m, 120 values
143e12c5d1SDavid du Colombier  *	from 80<=dec<=84, ra is every 24m,  60 values
153e12c5d1SDavid du Colombier  *	at dec=85 and 86, ra is every 48m,  30 values
163e12c5d1SDavid du Colombier  *	at dec=87,        ra is every 60m,  24 values
173e12c5d1SDavid du Colombier  *	at dec=88,        ra is every 120m, 12 values
183e12c5d1SDavid du Colombier  *	at dec=89,        ra is 12h,	     1 value
193e12c5d1SDavid du Colombier  *
203e12c5d1SDavid du Colombier  * Total number of patches in northern hemisphere is therefore:
213e12c5d1SDavid du Colombier  * 	360*60+180*10+120*10+60*5+30*2+24*1+12*1+1 = 24997
223e12c5d1SDavid du Colombier  * Total number of patches is therefore
233e12c5d1SDavid du Colombier  *	2*24997-360 = 49634	(dec=0 has been counted twice)
243e12c5d1SDavid du Colombier  * (cf. 41253 square degrees in the sky)
253e12c5d1SDavid du Colombier  */
263e12c5d1SDavid du Colombier 
273e12c5d1SDavid du Colombier void
radec(int p,int * rah,int * ram,int * deg)283e12c5d1SDavid du Colombier radec(int p, int *rah, int *ram, int *deg)
293e12c5d1SDavid du Colombier {
303e12c5d1SDavid du Colombier 	*deg = (p&255)-90;
313e12c5d1SDavid du Colombier 	p >>= 8;
323e12c5d1SDavid du Colombier 	*rah = p/15;
333e12c5d1SDavid du Colombier 	*ram = (p%15)*4;
343e12c5d1SDavid du Colombier 	if(*deg<0)
353e12c5d1SDavid du Colombier 		(*deg)++;
363e12c5d1SDavid du Colombier }
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier long
patcha(Angle ra,Angle dec)393e12c5d1SDavid du Colombier patcha(Angle ra, Angle dec)
403e12c5d1SDavid du Colombier {
413e12c5d1SDavid du Colombier 	ra = DEG(ra);
423e12c5d1SDavid du Colombier 	dec = DEG(dec);
433e12c5d1SDavid du Colombier 	if(dec >= 0)
443e12c5d1SDavid du Colombier 		return patch(floor(ra/15), ((int)floor(ra*4))%60, floor(dec));
453e12c5d1SDavid du Colombier 	dec = -dec;
463e12c5d1SDavid du Colombier 	return patch(floor(ra/15), ((int)floor(ra*4))%60, -floor(dec));
473e12c5d1SDavid du Colombier }
483e12c5d1SDavid du Colombier 
493e12c5d1SDavid du Colombier char round[91]={	/* extra 0 is to offset the array */
503e12c5d1SDavid du Colombier 	/*  0 */    0,	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
513e12c5d1SDavid du Colombier 	/* 10 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
523e12c5d1SDavid du Colombier 	/* 20 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
533e12c5d1SDavid du Colombier 	/* 30 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
543e12c5d1SDavid du Colombier 	/* 40 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
553e12c5d1SDavid du Colombier 	/* 50 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
563e12c5d1SDavid du Colombier 	/* 60 */	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
573e12c5d1SDavid du Colombier 	/* 70 */	 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
583e12c5d1SDavid du Colombier 	/* 80 */	 6,  6,  6,  6,  6, 12, 12, 15, 30, -1,
593e12c5d1SDavid du Colombier 	/* 90 */
603e12c5d1SDavid du Colombier };
613e12c5d1SDavid du Colombier 
623e12c5d1SDavid du Colombier long
patch(int rah,int ram,int deg)633e12c5d1SDavid du Colombier patch(int rah, int ram, int deg)
643e12c5d1SDavid du Colombier {
653e12c5d1SDavid du Colombier 	int ra, dec;
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier 	/*
683e12c5d1SDavid du Colombier 	 * patches go from lower limit <= position < upper limit.
693e12c5d1SDavid du Colombier 	 * therefore dec ' " can be ignored; always inc. dec degrees.
703e12c5d1SDavid du Colombier 	 * the computed angle is then the upper limit (ignoring sign).
713e12c5d1SDavid du Colombier 	 * when done, +ve values are shifted down so 90 (0 degrees) is a value;
723e12c5d1SDavid du Colombier 	 */
733e12c5d1SDavid du Colombier 	if(rah<0 || rah>=24 || ram<0 || abs(deg)>=90){
743e12c5d1SDavid du Colombier 		fprint(2, "scat: patch: bad ra or dec %dh%dm %d\n", rah, ram, deg);
753e12c5d1SDavid du Colombier 		abort();
763e12c5d1SDavid du Colombier 	}
773e12c5d1SDavid du Colombier 	if(deg < 0)
783e12c5d1SDavid du Colombier 		deg--;
793e12c5d1SDavid du Colombier 	else if(deg < 90)
803e12c5d1SDavid du Colombier 		deg++;
813e12c5d1SDavid du Colombier 	dec = deg+90;
823e12c5d1SDavid du Colombier 	deg = abs(deg);
833e12c5d1SDavid du Colombier 	if(deg<1 || deg>90){
843e12c5d1SDavid du Colombier 		fprint(2, "scat: patch: panic %dh%dm %d\n", rah, ram, deg);
853e12c5d1SDavid du Colombier 		abort();
863e12c5d1SDavid du Colombier 	}
873e12c5d1SDavid du Colombier 	if(deg == 90)
883e12c5d1SDavid du Colombier 		ra = 180;
893e12c5d1SDavid du Colombier 	else{
903e12c5d1SDavid du Colombier 		ra = 15*rah+ram/4;
913e12c5d1SDavid du Colombier 		ra -= ra%round[deg];
923e12c5d1SDavid du Colombier 	}
933e12c5d1SDavid du Colombier 	/* close the hole at 0 */
943e12c5d1SDavid du Colombier 	if(dec > 90)
953e12c5d1SDavid du Colombier 		--dec;
963e12c5d1SDavid du Colombier 	if(ra >= 360)
973e12c5d1SDavid du Colombier 		ra -= 360;
983e12c5d1SDavid du Colombier 	return (ra<<8)|dec;
993e12c5d1SDavid du Colombier }
100