Program w jezyku c sluzacy do zamiany wspolrzednych pomiedzy 2 dowolnymi ukladami wspolrzednych z:
- horyzontalny(z azymutem od S w kierunku W)
- horyzontalny(z azymutem od N w kierunku W)
- rownikowy I
- rownikowy II
- ekliptyczny
- galaktyczny

Program sklada sie z 2 czesci: Zamien_wsp.cc, ktory stanowi program glowny oraz convert.h, ktory sluzy do zamiany wartosci podanych w stylu stopnie, minuty, sekundy lub godzinny, minuty, sekundy na liczbe.


Zamien_wsp.cc:
//  Program Zamien_wsp%BR%
//  Autor: Bogna Pazderska%BR%
// "Zamiana wspolrzednych miedzy 2 dowolnymi ukladami sferycznymi:
//  horyzontalnym, rownikowym I i II, ekliptycznym, galaktycznym"

#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "convert.h"


void
pobierz (int i, double *a, const double P)
{
  char tmp[30];
  switch (i)
    {
    case 1:
    case 2:
      cout << "\tStare wspolrzedne: - wysokosc(_d_m...s):" << flush;
      cin >> tmp;
      a[1] = convert (tmp);
      if ((a[1] > 90) || (a[1] < -90))
   {
     cout << "Wysokosc musi byc miedzy -90d, a 90d (degree)" << endl;
     exit (1);
   }
      a[1] = (a[1] / 360) * 2 * P;
      cout << "\t                   - azymut(_d_m...s): " << flush;
      cin >> tmp;
      a[2] = convert (tmp);
      if ((a[2] < -180) || (a[2] > 180))
   {
     cout << "Azymut musi byc miedzy -180d, a 180d (degree)" << endl;
     exit (1);
   }
      a[2] = (a[2] / 360) * 2 * P;
      break;

    case 3:
      cout << "\tStare wspolrzedne: - deklinacja(_d_m...s):" << flush;
      cin >> tmp;
      a[1] = convert (tmp);
      if ((a[1] > 90) || (a[1] < -90))
   {
     cout << "Deklinacja musi byc miedzy -90d, a 90d (degree)" << endl;
     exit (1);
   }
      a[1] = (a[1] / 360) * 2 * P;
      cout << "\t                   - kat godzinny(_h_m...s): " << flush;
      cin >> tmp;
      a[2] = convert (tmp);
      if ((a[2] < 0) || (a[2] > 360))
   {
     cout << "Kat godzinny musi byc miedzy 0h, a 24h " << endl;
     exit (1);
   }
      a[2] = (a[2] / 360) * 2 * P;
      break;

    case 4:
      cout << "\tStare wspolrzedne: - deklinacja(_d_m...s):" << flush;
      cin >> tmp;
      a[1] = convert (tmp);
      if ((a[1] > 90) || (a[1] < -90))
   {
     cout << "Deklinacja musi byc miedzy -90d, a 90d (degree)" << endl;
     exit (1);
   }
      a[1] = (a[1] / 360) * 2 * P;

      cout << "\t                   - rektascencja(_h_m...s):" << flush;
      cin >> tmp;
      a[2] = convert (tmp);
      if ((a[2] < 0) || (a[2] > 360))
   {
     cout << "Rektascencja musi byc miedzy 0h, a 24h " << endl;
     exit (1);
   }
      a[2] = (a[2] / 360) * 2 * P;
      break;

    case 5:
      cout << "\tStare wspolrzedne: - szerokosc ekliptyczna(_d_m...s):" <<
   flush;
      cin >> tmp;
      a[1] = convert (tmp);
      if ((a[1] > 90) || (a[1] < -90))
   {
     cout <<
       "Szerokosc ekliptyczna musi byc miedzy -90d, a 90d (degree)" <<
       endl;
     exit (1);
   }
      a[1] = (a[1] / 360) * 2 * P;

      cout << "\t                   - dlugosc ekliptyczna(_d_m...s):" <<
   flush;
      cin >> tmp;
      a[2] = convert (tmp);
      if ((a[2] < 0) || (a[2] > 360))
   {
     cout << "Dlugosc ekliptyczna musi byc miedzy 0d, a 360d " << endl;
     exit (1);
   }
      a[2] = (a[2] / 360) * 2 * P;
      break;

    case 6:
      cout << "\tStare wspolrzedne: - szerokosc galaktyczna(d_m...s):" <<
   flush;
      cin >> tmp;
      a[1] = convert (tmp);
      if ((a[1] > 90) || (a[1] < -90))
   {
     cout <<
       "Szerokosc galaktyczna musi byc miedzy -90d, a 90d (degree)" <<
       endl;
     exit (1);
   }
      a[1] = (a[1] / 360) * 2 * P;

      cout << "\t                   - dlugosc galaktyczna(_d_m...s):" <<
   flush;
      cin >> tmp;
      a[2] = convert (tmp);
      if ((a[2] < 0) || (a[2] > 360))
   {
     cout << "Dlugosc galaktyczna musi byc miedzy 0d, a 360d " << endl;
     exit (1);
   }
      a[2] = (a[2] / 360) * 2 * P;

      break;
    default:
      cout << "Nie ma takiej opcji " << endl;
      exit (2);
      break;

    }
}



void
wypisz (int j, double *a, const double P)
{
  double x, y;
  char de[20];
  char re[20];
  cout << "\n\tNowe wspolrzedne:" << flush;
  switch (j)
    {
    case 1:
    case 2:
      cout << " - wysokosc(_d_m...s):  " << flush;
      break;
    case 3:
    case 4:
      cout << " - deklinacja(_d_m...s):  " << flush;
      break;
    case 5:
      cout << " - szerokosc ekliptyczna(_d_m...s):  " << flush;
      break;
    case 6:
      cout << " - szerokosc galaktyczna(_d_m...s):  " << flush;
      break;
    }
  x = (60.0 * (180.0 * fabs (a[1]) / P - (int) (180.0 * fabs (a[1]) / P)));
  y = ((x - (int) x) * 60);
  if ((a[1] < 0) && ((int) (180.0 * a[1] / P) == 0))
    sprintf (de, "-%1dd%02im%.6fs", (int) (180.0 * a[1] / P), (int) x, y);
  else
    sprintf (de, "%4dd%02im%.6fs", (int) (180.0 * a[1] / P), (int) x, y);
  cout << de << endl;




  switch (j)
    {
    case 1:
      cout << "\t                  - azymut_od S w kierunku W(_d_m...s): " <<
   flush;
      break;
    case 2:
      cout << "\t                  - azymut_od N w kierunku W(_d_m...s): " <<
   flush;
      break;
    case 3:
      cout << "\t                  - kat godzinny(_h_m...s): " << flush;
      break;
    case 4:
      cout << "\t                  - rektascencja(_h_m...s): " << flush;
      break;
    case 5:
      cout << "\t                  - dlugosc ekliptyczna(_d_m...s): " <<
   flush;
      break;
    case 6:
      cout << "\t                  - dlugosc galaktyczna(_d_m...s): " <<
   flush;
      break;
    }
  if ((j == 3) || (j == 4))
    {
      x = (60.0 * (12.0 * fabs (a[2]) / P - (int) (12.0 * fabs (a[2]) / P)));
      y = ((x - (int) x) * 60);
      if ((a[2] < 0) && ((int) (12.0 * a[2] / P) == 0))
   sprintf (re, "-%1ih%02im%.6fs ", (int) (12.0 * a[2] / P), (int) x, y);
      else
   sprintf (re, "%4ih%02im%.6fs ", (int) (12.0 * a[2] / P), (int) x, y);
    }
  else
    {
      x =
   (60.0 * (180.0 * fabs (a[2]) / P - (int) (180.0 * fabs (a[2]) / P)));
      y = ((x - (int) x) * 60);
      if ((a[2] < 0) && ((int) (180.0 * a[2] / P) == 0))
   sprintf (re, "-%1id%02im%.6fs", (int) (180.0 * a[2] / P), (int) x, y);
      else
   sprintf (re, "%5id%02im%.6fs", (int) (180.0 * a[2] / P), (int) x, y);

    }
  cout << re << endl;
}

//Glowna funkcja
main ()
{

  const double E = 23.5;   //w stopniach
  const double AG = 192.25;   //w stopniach
  const double DG = 27.0667;   //w stopniach
  const double q = 123;      //w stopniach
  const double P = 3.141592654;
  double e, Ag, Dg, Q;
  double x, y, z;
  double a[10], s, t;
  int i, j, KK;
  char tm[20];

  KK = 0;
  cout << "\tUklady wspolrzednych:" << endl;
  cout << "1 - horyzontalny(z azymutem od S w kierunku W)" << endl;
  cout << "2 - horyzontalny(z azymutem od N w kierunku W)" << endl;
  cout << "3 - rownikowy I\n4 - rownikowy II" << endl;
  cout << "5 - ekliptyczny\n6 - galaktyczny\n" << endl;
  cout << "Przejscie z ukladu: " << flush;
  cin >> i;
  cout << "Przejcie do ukladu: " << flush;
  cin >> j;
  if (i == j)
    {
      cout << "Tu nie ma co zamieniac!" << endl;
      exit (3);
    }

  //Pobranie
  pobierz (i, a, P);


  //Zamiana do 3 lub 4
  if (((i == 1) && (j == 2)) || ((j == 1) && (i == 2)))
    {
      if (a[2] >= 0)
   a[2] = P - a[2];
      else
   a[2] = -(P + a[2]);   //azymut
      KK = 1;
    }
  else
    switch (i)
      {
      case 1:
      case 2:
   cout << "\tPodaj szerokosc geograficzna(_d_m...s): " << flush;
   cin >> tm;
   s = convert (tm);
   if (s > 90)
     {
       cout <<
         "Szerokosc geograficzna musi byc miedzy 0d, a 90d(degree) " <<
         endl;
       exit (4);
     }
   s = (s / 360) * 2 * P;
   if (i == 2)
     if (a[2] >= 0)
       a[2] = P - a[2];
     else
       a[2] = -(P + a[2]);
   x = sin (a[1]) * sin (s) - cos (a[1]) * cos (s) * cos (a[2]);
   y = cos (a[1]) * sin (a[2]);
   z = sin (a[1]) * cos (s) + cos (a[1]) * sin (s) * cos (a[2]);
   a[1] = asin (x);   //deklinacja
   y = y / (cos (a[1]));
   z = z / (cos (a[1]));
   if (y >= 0)
     a[2] = acos (z);
   else
     a[2] = 2 * P - acos (z);   //kat godzinny
   if (j == 3)
     KK = 1;
   else
     {
       cout << "\tPodaj czas gwiazdowy(_h_m...s): " << flush;
       cin >> tm;
       t = convert (tm);
       if ((t < 0) || (t > 360))
         {
      cout << "Czas gwiazdowy musi byc miedzy 0h, a 24h" << endl;
      exit (3);
         }
       t = (t / 360) * 2 * P;
       a[2] = t - a[2];   //rektascencja
       if (a[2] < 0)
         a[2] = 2 * P + a[2];
     }
   if (j == 4)
     KK = 1;
   break;
      case 3:
   if ((j == 4) || (j == 5) || (j == 6))
     {
       cout << "\tPodaj czas gwiazdowy(_h_m...s): " << flush;
       cin >> tm;
       t = convert (tm);
       if ((t < 0) || (t > 360))
         {
      cout << "Czas gwiazdowy musi byc miedzy 0h, a 24h" << endl;
      exit (3);
         }
       t = (t / 360) * 2 * P;
       a[2] = t - a[2];   //rektascencja
       if (a[2] < 0)
         a[2] = 2 * P + a[2];
       if (j == 4)
         KK = 1;
     }

   break;
      case 5:
   e = (E / 360) * 2 * P;
   x = sin (a[1]) * cos (e) + cos (a[1]) * sin (e) * sin (a[2]);
   y = -sin (a[1]) * sin (e) + cos (a[1]) * cos (e) * sin (a[2]);
   z = cos (a[1]) * cos (a[2]);
   a[1] = asin (x);   //deklinacja
   y = y / (cos (a[1]));
   z = z / (cos (a[1]));
   if (y >= 0)
     a[2] = acos (z);
   else
     a[2] = 2 * P - acos (z);   //rektascencja
   if (j == 4)
     KK = 1;
   break;
      case 6:
   Q = (q / 360) * 2 * P;
   Ag = (AG / 360) * 2 * P;
   Dg = (DG / 360) * 2 * P;
   x = sin (Dg) * sin (a[1]) + cos (Dg) * cos (a[1]) * cos (Q - a[2]);
   y = cos (a[1]) * sin (Q - a[2]);
   z = cos (Dg) * sin (a[1]) - sin (Dg) * cos (a[1]) * cos (Q - a[2]);
   a[1] = asin (x);   //deklinacja
   y = y / (cos (a[1]));
   z = z / (cos (a[1]));
   if (y >= 0)
     a[2] = acos (z) + Ag;
   else
     a[2] = 2 * P - acos (z) + Ag;   //rektascencja
   if (a[2] < 0)
     a[2] = 2 * P + a[2];
   if (j == 4)
     KK = 1;
   break;
      }

  //Zamiana z 3 lub 4 na reszte
  if (KK == 0)
    {
      if ((i != 3) && ((j == 1) || (j == 2) || (j == 3)))
   {
     cout << "\tPodaj czas gwiazdowy(_h_m...s): " << flush;
     cin >> tm;
     t = convert (tm);
     if ((t < 0) || (t > 360))
       {
         cout << "Czas gwiazdowy musi byc miedzy 0h, a 24h" << endl;
         exit (3);
       }
     t = (t / 360) * 2 * P;
     a[2] = t - a[2];   //rektascencja
     if (a[2] < 0)
       a[2] = 2 * P + a[2];
     if (j == 3)
       KK = 1;
   }
      if ((j == 1) || (j == 2))

   {
     cout << "\tPodaj szerokosc geograficzna(_d_m...s): " << flush;
     cin >> tm;
     s = convert (tm);
     if (s > 90)
       {
         cout <<
      "Szerokosc geograficzna musi byc miedzy 0d, a 90d(degree) "
      << endl;
         exit (4);
       }
     s = (s / 360) * 2 * P;
     x = sin (a[1]) * sin (s) + cos (a[1]) * cos (s) * cos (a[2]);
     y = cos (a[1]) * sin (a[2]);
     z = cos (a[1]) * sin (s) * cos (a[2]) - sin (a[1]) * cos (s);
     a[1] = asin (x);   //wysokosc
     y = y / (cos (a[1]));
     z = z / (cos (a[1]));
     if (y >= 0)
       a[2] = acos (z);
     else
       a[2] = -acos (z);   //azymut
     if (j == 1)
       KK = 1;
     else
       {
         if (a[2] >= 0)
      a[2] = P - a[2];
         else
      a[2] = -(P + a[2]);   //azymut
         KK = 1;
       }
   }
    }
  if (KK == 0)
    {
      if (j == 5)
   {
     e = (E / 360) * 2 * P;
     x = sin (a[1]) * cos (e) - cos (a[1]) * sin (e) * sin (a[2]);
     y = sin (a[1]) * sin (e) + cos (a[1]) * cos (e) * sin (a[2]);
     z = cos (a[1]) * cos (a[2]);
     a[1] = asin (x);   //szerokosc ekliptyczna
     y = y / (cos (a[1]));
     z = z / (cos (a[1]));
     if (y >= 0)
       a[2] = acos (z);
     else
       a[2] = 2 * P - acos (z);   // dlugosc ekliptyczna
     KK = 1;
   }
      if (j == 6)
   {
     Q = (q / 360) * 2 * P;
     Ag = (AG / 360) * 2 * P;
     Dg = (DG / 360) * 2 * P;
     x = sin (Dg) * sin (a[1]) + cos (Dg) * cos (a[1]) * cos (a[2] - Ag);
     y = cos (a[1]) * sin (a[2] - Ag);
     z = cos (Dg) * sin (a[1]) - sin (Dg) * cos (a[1]) * cos (a[2] - Ag);

     a[1] = asin (x);   //szerokosc galaktyczna
     y = y / (cos (a[1]));
     z = z / (cos (a[1]));
     if (y >= 0)
       a[2] = Q - acos (z);
     else
       a[2] = Q - (2 * P - acos (z));   // dlugosc galaktyczna
     if (a[2] < 0)
       a[2] = 2 * P + a[2];
     KK = 1;
   }
    }


//Wypisanie
  wypisz (j, a, P);

  return 0;
}


convert.h:

#include <string.h>
#include <ctype.h>

double convert (char *s)
{
  char c;
  char lili[20];
  int i = 0, k;
  int j = strlen (s);
  for (k=0;k<j;k++)
  {
   c=toupper(s[k]);
        s[k]=c;
  }

  char typ = 'N';
  double x;
  int sign = 1;
  while (i < j)
    {
      if ((s[i] == 'H') || (s[i] == ':'))

   {
     typ = 'H';
     break;
   }

      else if (s[i] == 'D')

   {
     typ = 'D';
     break;
   }
      i++;
    }
  i = 0;
  while (i < j)

    {
      if (isdigit (s[i]))
   break;

      else if (s[i] == '-')

   {
     sign = -1;
     i++;
     break;
   }

      else
   i++;
    }
  switch (typ)

    {
    case 'N':
      x = atof (s);
      break;
    case 'H':
    case 'D':
      k = 0;
      while (((s[i] == '.') || isdigit (s[i])) && (i < j))
   lili[k++] = s[i++];
      lili[k] = 0;
      x = atof (lili);
      k = 0;
      i++;
      while (((s[i] == '.') || isdigit (s[i])) && (i < j))
   lili[k++] = s[i++];
      lili[k] = 0;
      x += atof (lili) / 60.0;
      k = 0;
      i++;
      while (((s[i] == '.') || isdigit (s[i])) && (i < j))
   lili[k++] = s[i++];
      lili[k] = 0;
      x += atof (lili) / 3600.0;
      x *= sign;
      break;
    }
  if (typ == 'H')
    x *= 15.0;
  return x;
}

-- BognA - 28 Apr 2004
Topic revision: r1 - 28 Apr 2004, BognA
 
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