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