Program liczy współrzędne w układzie równikowym II na zadaną epokę ( dokładną datę ) uwzględniając wpływ precesji. Nutacja została pominięta ( tzn. otrzymane współrzędne są współrzędnymi średnimi ). Program zapyta o datę (dzień, miesiąc,rok) oraz o współrzędne obiektu w epoce standardowej. Epoka standardowa dla programu to epoka J2000.0 .
#include<stdio.h>
#include<math.h>
#define K1 0.01118086019
#define K2 0.000001464331242
#define K3 0.0000000872664626
#define Z1 0.01118086019
#define Z2 0.000005307546255
#define Z3 0.00000000872664626
#define T1 0.00971717297
#define T2 -0.0000002059488517
#define T3 -0.00000001919862177
#define EPOKA0 2000.0
/*program obliczajacy wspolrzedne rownikowe II na zadana epoke*/
main()
{
double ksi,z,teta,t,epoka,a,b,c;
double p[3][3];
double r0[3],r[3];
double rec0[3],dec0[3],rec[3],dec[3];
double rect0,decl0,rect,decl;
int i,j,dni;
int data[3];
int miesiace[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
printf("podaj date (dzien, miesiac, rok) ");
scanf("%d",&data[0]);
scanf("%d",&data[1]);
scanf("%d",&data[2]);
dni=0;
for (i=1; i<data[1]; ++i) {
if (data[2]%4==0)
dni=dni+miesiace[1][i];
else
dni=dni+miesiace[0][i];
}
dni=dni+data[0];
epoka=data[2]+dni/365.25;
t=(data[2]-EPOKA0)/100+dni/36525;
/*katy precesji*/
ksi=K1*t+K2*t*t+K3*t*t*t;
z=Z1*t+Z2*t*t+Z3*t*t*t;
teta=T1*t+T2*t*t+T3*t*t*t;
/*macierz precesji*/
p[0][0]=cos(z)*cos(teta)*cos(ksi)-sin(z)*sin(ksi);
p[0][1]=-cos(z)*cos(teta)*sin(ksi)-sin(z)*cos(ksi);
p[0][2]=-cos(z)*sin(teta);
p[1][0]=sin(z)*cos(teta)*cos(ksi)+cos(z)*sin(ksi);
p[1][1]=-sin(z)*cos(teta)*sin(ksi)+cos(z)*cos(ksi);
p[1][2]=-sin(z)*sin(teta);
p[2][0]=sin(teta)*cos(ksi);
p[2][1]=-sin(teta)*sin(ksi);
p[2][2]=cos(teta);
printf("macierz precesji:\n");
for (i=0; i<=2; ++i) {
for (j=0; j<=2; ++j)
printf("%18.13f",p[i][j]);
printf("\n");
}
/*wspolrzedne na epoke 0*/
printf("podaj wspolrzedne w epoce 0 (rektascencje i deklinacje)\n");
printf("rektascencja: h, m, s \n");
for (i=0; i<=2; ++i)
scanf("%lf",&rec0[i]);
printf("deklinacja: st ' \" \n");
for (i=0; i<=2; ++i)
scanf("%lf",&dec0[i]);
rect0=rec0[0]+rec0[1]/60+rec0[2]/3600;
rect0=rect0*15;
rect0=rect0*M_PI/180;
decl0=dec0[0]+dec0[1]/60+dec0[2]/3600;
decl0=decl0*M_PI/180;
/*wektor kierunku na epoke 0*/
r0[0]=cos(decl0)*cos(rect0);
r0[1]=cos(decl0)*sin(rect0);
r0[2]=sin(decl0);
/*wektor kierunku na zadana epoke*/
r[0]=p[0][0]*r0[0]+p[0][1]*r0[1]+p[0][2]*r0[2];
r[1]=p[1][0]*r0[0]+p[1][1]*r0[1]+p[1][2]*r0[2];
r[2]=p[2][0]*r0[0]+p[2][1]*r0[1]+p[2][2]*r0[2];
/*wspolrzedne na zadana epoke*/
decl=asin(r[2]);
if ((decl==(M_PI/2)) || (decl==(-M_PI/2)))
rect=0.0;
else {
rect=acos(r[0]/cos(decl));
if ((r[1]/cos(decl))<0)
rect=2*M_PI-rect;
}
decl=decl*180/M_PI;
rect=rect*180/M_PI/15;
while (rect>24)
rect=rect-24;
while (rect<0)
rect=rect+24;
dec[0]=floor(decl);
dec[1]=60*(decl-dec[0]);
dec[2]=60*(dec[1]-floor(dec[1]));
dec[1]=floor(dec[1]);
rec[0]=floor(rect);
rec[1]=60*(rect-rec[0]);
rec[2]=60*(rec[1]-floor(rec[1]));
rec[1]=floor(rec[1]);
printf("wspolrzedne na epoke %6.1f wynosza:\n",epoka);
printf("rektascencja :\n");
printf("%5.0f h %5.0f m %7.2f s\n",rec[0],rec[1],rec[2]);
printf("deklinacja : \n");
printf("%5.0f st %5.0f ' %7.2f \"\n",dec[0],dec[1],dec[2]);
return 0;
}
--
CezaryMigaszewski - 11 May 2004