1
0
Fork 0
sattools/src/angular.c

165 lines
4.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <wcslib/cel.h>
#define LIM 80
void dec2s(double,char *,int,int);
double s2dec(char *);
void reverse(double,double,double,double,double *,double *);
void forward(double,double,double,double,double *,double *);
int main(int argc,char *argv[])
{
int i;
double ra1,de1,ra2,de2;
double rx,ry;
char sra[15],sde[15];
if (argc==1) {
printf("Usage: %s <ra1> <de1> <ra2> <de2>\n",argv[0]);
printf(" Computes angular offset\n");
printf("Usage: %s -d <ra1> <de1> <dra> <dde>\n",argv[0]);
printf(" Applies angular offset\n");
printf("Usage: %s -x <ra1> <de1> <ra2> <de2>\n",argv[0]);
printf(" Computes x-offset only\n");
printf("Usage: %s -y <ra1> <de1> <ra2> <de2>\n",argv[0]);
printf(" Computes y-offset only\n");
return -1;
}
if (strcmp(argv[1],"-d")==0) {
if (strchr(argv[2],':')!=NULL)
ra1=15.*s2dec(argv[2]);
else
ra1=atof(argv[2]);
if (strchr(argv[3],':')!=NULL)
de1=s2dec(argv[3]);
else
de1=atof(argv[3]);
rx=(double) atof(argv[4]);
ry=(double) atof(argv[5]);
reverse(ra1,de1,rx,ry,&ra2,&de2);
dec2s(ra2/15.0,sra,0,7);
dec2s(de2,sde,0,6);
printf("%s %s\n",sra,sde);
} else if (strcmp(argv[1],"-x")==0) {
if (strchr(argv[2],':')!=NULL)
ra1=15.*s2dec(argv[2]);
else
ra1=atof(argv[2]);
if (strchr(argv[3],':')!=NULL)
de1=s2dec(argv[3]);
else
de1=atof(argv[3]);
if (strchr(argv[4],':')!=NULL)
ra2=15.*s2dec(argv[4]);
else
ra2=atof(argv[4]);
if (strchr(argv[5],':')!=NULL)
de2=s2dec(argv[5]);
else
de2=atof(argv[5]);
forward(ra1,de1,ra2,de2,&rx,&ry);
printf("%8.3f\n",rx);
} else if (strcmp(argv[1],"-y")==0) {
if (strchr(argv[2],':')!=NULL)
ra1=15.*s2dec(argv[2]);
else
ra1=atof(argv[2]);
if (strchr(argv[3],':')!=NULL)
de1=s2dec(argv[3]);
else
de1=atof(argv[3]);
if (strchr(argv[4],':')!=NULL)
ra2=15.*s2dec(argv[4]);
else
ra2=atof(argv[4]);
if (strchr(argv[5],':')!=NULL)
de2=s2dec(argv[5]);
else
de2=atof(argv[5]);
forward(ra1,de1,ra2,de2,&rx,&ry);
printf("%8.3f\n",ry);
} else {
if (strchr(argv[1],':')!=NULL)
ra1=15.*s2dec(argv[1]);
else
ra1=atof(argv[1]);
if (strchr(argv[2],':')!=NULL)
de1=s2dec(argv[2]);
else
de1=atof(argv[2]);
if (strchr(argv[3],':')!=NULL)
ra2=15.*s2dec(argv[3]);
else
ra2=atof(argv[3]);
if (strchr(argv[4],':')!=NULL)
de2=s2dec(argv[4]);
else
de2=atof(argv[4]);
forward(ra1,de1,ra2,de2,&rx,&ry);
printf("%8.3f %8.3f %8.3f\n",rx,ry,sqrt(rx*rx+ry*ry));
}
return 0;
}
// Convert Decimal into Sexagesimal
void dec2s(double x,char *s,int f,int len)
{
int i;
double sec,deg,min;
char sign;
char *form[]={":: ",",, ","hms"," "};
sign=(x<0 ? '-' : ' ');
x=3600.*fabs(x);
sec=fmod(x,60.);
x=(x-sec)/60.;
min=fmod(x,60.);
x=(x-min)/60.;
// deg=fmod(x,60.);
deg=x;
if (len==7) sprintf(s,"%c%02i%c%02i%c%07.4f%c",sign,(int) deg,form[f][0],(int) min,form[f][1],sec,form[f][2]);
if (len==6) sprintf(s,"%c%02i%c%02i%c%06.3f%c",sign,(int) deg,form[f][0],(int) min,form[f][1],sec,form[f][2]);
if (len==5) sprintf(s,"%c%02i%c%02i%c%05.2f%c",sign,(int) deg,form[f][0],(int) min,form[f][1],sec,form[f][2]);
if (len==4) sprintf(s,"%c%02i%c%02i%c%04.1f%c",sign,(int) deg,form[f][0],(int) min,form[f][1],sec,form[f][2]);
if (len==2) sprintf(s,"%c%02i%c%02i%c%02i%c",sign,(int) deg,form[f][0],(int) min,form[f][1],(int) floor(sec),form[f][2]);
return;
}
// Convert Sexagesimal into Decimal
double s2dec(char *s)
{
double x;
float deg,min,sec;
char t[LIM];
strcpy(t,s);
deg=fabs(atof(strtok(t," :")));
min=fabs(atof(strtok(NULL," :")));
sec=fabs(atof(strtok(NULL," :")));
x=(double) deg+(double) min/60.+(double) sec/3600.;
if (s[0]=='-') x= -x;
return x;
}