__Program w jezyku c sluzacy do zamiany wspolrzednych pomiedzy 2 dowolnymi ukladami wspolrzednych z:%BR%__ __- horyzontalny(z azymutem od S w kierunku W)%BR%__ __- horyzontalny(z azymutem od N w kierunku W)%BR%__ __- rownikowy I%BR%__ __- rownikowy II%BR%__ __- ekliptyczny%BR%__ __- galaktyczny%BR%__ _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:* <verbatim> // 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; } </verbatim> ---- *convert.h:* <verbatim> #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; } </verbatim> -- Main.BognA - 28 Apr 2004
This topic: Main
>
TWikiUsers
>
BognA
>
PrograM1
Topic revision:
28 Apr 2004,
BognA
(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