plan9port

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

patch.c (2604B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include	<bio.h>
      4 #include "sky.h"
      5 
      6 /*
      7  * dec varies from -89 to 89, inclusive.
      8  * ra varies depending on dec; each patch is about 1 square degree.
      9  *
     10  * Northern hemisphere (0<=dec<=89):
     11  *	from  0<=dec<=59, ra is every 4m,  360 values
     12  *	from 60<=dec<=69, ra is every 8m,  180 values
     13  *	from 70<=dec<=79, ra is every 12m, 120 values
     14  *	from 80<=dec<=84, ra is every 24m,  60 values
     15  *	at dec=85 and 86, ra is every 48m,  30 values
     16  *	at dec=87,        ra is every 60m,  24 values
     17  *	at dec=88,        ra is every 120m, 12 values
     18  *	at dec=89,        ra is 12h,	     1 value
     19  *
     20  * Total number of patches in northern hemisphere is therefore:
     21  * 	360*60+180*10+120*10+60*5+30*2+24*1+12*1+1 = 24997
     22  * Total number of patches is therefore
     23  *	2*24997-360 = 49634	(dec=0 has been counted twice)
     24  * (cf. 41253 square degrees in the sky)
     25  */
     26 
     27 void
     28 radec(int p, int *rah, int *ram, int *deg)
     29 {
     30 	*deg = (p&255)-90;
     31 	p >>= 8;
     32 	*rah = p/15;
     33 	*ram = (p%15)*4;
     34 	if(*deg<0)
     35 		(*deg)++;
     36 }
     37 
     38 int32
     39 patcha(Angle ra, Angle dec)
     40 {
     41 	ra = DEG(ra);
     42 	dec = DEG(dec);
     43 	if(dec >= 0)
     44 		return patch(floor(ra/15), ((int)floor(ra*4))%60, floor(dec));
     45 	dec = -dec;
     46 	return patch(floor(ra/15), ((int)floor(ra*4))%60, -floor(dec));
     47 }
     48 
     49 #define round scatround
     50 
     51 char round[91]={	/* extra 0 is to offset the array */
     52 	/*  0 */    0,	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     53 	/* 10 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     54 	/* 20 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     55 	/* 30 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     56 	/* 40 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     57 	/* 50 */	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     58 	/* 60 */	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     59 	/* 70 */	 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
     60 	/* 80 */	 6,  6,  6,  6,  6, 12, 12, 15, 30, -1,
     61 	/* 90 */
     62 };
     63 
     64 int32
     65 patch(int rah, int ram, int deg)
     66 {
     67 	int ra, dec;
     68 
     69 	/*
     70 	 * patches go from lower limit <= position < upper limit.
     71 	 * therefore dec ' " can be ignored; always inc. dec degrees.
     72 	 * the computed angle is then the upper limit (ignoring sign).
     73 	 * when done, +ve values are shifted down so 90 (0 degrees) is a value;
     74 	 */
     75 	if(rah<0 || rah>=24 || ram<0 || abs(deg)>=90){
     76 		fprint(2, "scat: patch: bad ra or dec %dh%dm %d\n", rah, ram, deg);
     77 		abort();
     78 	}
     79 	if(deg < 0)
     80 		deg--;
     81 	else if(deg < 90)
     82 		deg++;
     83 	dec = deg+90;
     84 	deg = abs(deg);
     85 	if(deg<1 || deg>90){
     86 		fprint(2, "scat: patch: panic %dh%dm %d\n", rah, ram, deg);
     87 		abort();
     88 	}
     89 	if(deg == 90)
     90 		ra = 180;
     91 	else{
     92 		ra = 15*rah+ram/4;
     93 		ra -= ra%round[deg];
     94 	}
     95 	/* close the hole at 0 */
     96 	if(dec > 90)
     97 		--dec;
     98 	if(ra >= 360)
     99 		ra -= 360;
    100 	return (ra<<8)|dec;
    101 }