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

Topic attachments
I AttachmentSorted ascending Action Size Date Who Comment
precesja.outout precesja.out manage 16.5 K 14 May 2004 - 15:11 CezaryMigaszewski Plik wykonywalny programu precesja
Topic revision: r2 - 14 May 2004, CezaryMigaszewski
 
This site is powered by FoswikiCopyright © 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