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