mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
101 lines
2.5 KiB
C
101 lines
2.5 KiB
C
#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));
|
|
}
|
|
|
|
#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;
|
|
}
|