You are here:
Foswiki
>
Main Web
>
TWikiUsers
>
BognA
>
PrograM1
(28 Apr 2004,
BognA
)
(raw view)
E
dit
A
ttach
__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
E
dit
|
A
ttach
|
P
rint version
|
H
istory
: r1
|
B
acklinks
|
V
iew topic
|
Edit
w
iki text
|
M
ore topic actions
Topic revision: r1 - 28 Apr 2004,
BognA
Main
Log In
or
Register
Toolbox
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
Users
Groups
Webs
Cosmo
Main
Sandbox
System
English
Français
Polski
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