Subversion Repositories planix.SVN

Rev

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

#include <u.h>
#include <libc.h>
#include        <bio.h>
#include "sky.h"

/*
 * dec varies from -89 to 89, inclusive.
 * ra varies depending on dec; each patch is about 1 square degree.
 *
 * Northern hemisphere (0<=dec<=89):
 *      from  0<=dec<=59, ra is every 4m,  360 values
 *      from 60<=dec<=69, ra is every 8m,  180 values
 *      from 70<=dec<=79, ra is every 12m, 120 values
 *      from 80<=dec<=84, ra is every 24m,  60 values
 *      at dec=85 and 86, ra is every 48m,  30 values
 *      at dec=87,        ra is every 60m,  24 values
 *      at dec=88,        ra is every 120m, 12 values
 *      at dec=89,        ra is 12h,         1 value
 *
 * Total number of patches in northern hemisphere is therefore:
 *      360*60+180*10+120*10+60*5+30*2+24*1+12*1+1 = 24997
 * Total number of patches is therefore
 *      2*24997-360 = 49634     (dec=0 has been counted twice)
 * (cf. 41253 square degrees in the sky)
 */

void
radec(int p, int *rah, int *ram, int *deg)
{
        *deg = (p&255)-90;
        p >>= 8;
        *rah = p/15;
        *ram = (p%15)*4;
        if(*deg<0)
                (*deg)++;
}

long
patcha(Angle ra, Angle dec)
{
        ra = DEG(ra);
        dec = DEG(dec);
        if(dec >= 0)
                return patch(floor(ra/15), ((int)floor(ra*4))%60, floor(dec));
        dec = -dec;
        return patch(floor(ra/15), ((int)floor(ra*4))%60, -floor(dec));
}

char round[91]={        /* extra 0 is to offset the array */
        /*  0 */    0,   1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        /* 10 */         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        /* 20 */         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        /* 30 */         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        /* 40 */         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        /* 50 */         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        /* 60 */         2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
        /* 70 */         3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
        /* 80 */         6,  6,  6,  6,  6, 12, 12, 15, 30, -1,
        /* 90 */
};

long
patch(int rah, int ram, int deg)
{
        int ra, dec;

        /*
         * patches go from lower limit <= position < upper limit.
         * therefore dec ' " can be ignored; always inc. dec degrees.
         * the computed angle is then the upper limit (ignoring sign).
         * when done, +ve values are shifted down so 90 (0 degrees) is a value;
         */
        if(rah<0 || rah>=24 || ram<0 || abs(deg)>=90){
                fprint(2, "scat: patch: bad ra or dec %dh%dm %d\n", rah, ram, deg);
                abort();
        }
        if(deg < 0)
                deg--;
        else if(deg < 90)
                deg++;
        dec = deg+90;
        deg = abs(deg);
        if(deg<1 || deg>90){
                fprint(2, "scat: patch: panic %dh%dm %d\n", rah, ram, deg);
                abort();
        }
        if(deg == 90)
                ra = 180;
        else{
                ra = 15*rah+ram/4;
                ra -= ra%round[deg];
        }
        /* close the hole at 0 */
        if(dec > 90)
                --dec;
        if(ra >= 360)
                ra -= 360;
        return (ra<<8)|dec;
}