tpatch.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tpatch.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 }