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 . --------------- <verbatim> #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; } </verbatim> -- Main.CezaryMigaszewski - 11 May 2004
Attachments
1
Attachments
1
Topic attachments
I
Attachment
Action
Size
Date
Who
Comment
out
precesja.out
manage
16.5 K
14 May 2004 - 15:11
CezaryMigaszewski
Plik wykonywalny programu precesja
This topic: Main
>
TWikiUsers
>
CezaryMigaszewski
>
ProgramPrecesja
Topic revision:
14 May 2004,
CezaryMigaszewski
(raw view)
Copyright © CC-BY-SA by the contributing authors. All material on this collaboration platform is copyrighted under CC-BY-SA by the contributing authors unless otherwise noted.
Ideas, requests, problems regarding Foswiki?
Send feedback