From 8a3b2ceb0ff632c47e1516d3ffef8572dc8eb974 Mon Sep 17 00:00:00 2001 From: rsc Date: Sat, 24 Apr 2004 17:05:43 +0000 Subject: Add scat. Temporary fix to rc r.e. note groups. --- src/cmd/scat/patch.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/cmd/scat/patch.c (limited to 'src/cmd/scat/patch.c') diff --git a/src/cmd/scat/patch.c b/src/cmd/scat/patch.c new file mode 100644 index 00000000..27d04edb --- /dev/null +++ b/src/cmd/scat/patch.c @@ -0,0 +1,101 @@ +#include +#include +#include +#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)); +} + +#define round scatround + +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; +} -- cgit v1.2.3