Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
Wyznaczona odległość między tymi miastami to 7706 mil morskich.
Listing 10.8: Obliczanie odległości geograficznej.
1
# include < iostream >
2
# include < cmath >
142
10. Metody geometrii obliczeniowej
3
4
inline double rad_to_deg( double rad ) { return ( rad * 360.0) / (2.0 *
3.1415926);}
5
inline double deg_to_rad( double deg ) { return deg * 2.0 * 3.1415926 /
360.0;}
6
const double EARTH_RADIUS = 3440.065;
7
8
int main ()
9
{
10
double lat1 , lon1 , lat2 , lon2 ;
11
double droga , alpha , ile;
12
double p1_x , p1_y , p1_z , p2_x , p2_y , p2_z ;
13
/
/
p
(
r
,
v
a
r
p
h
i
,
p
h
i
)
14
/
/
P
a
r
y
z
15
lat1 = 49.010;
16
lon1 = -2.548;
17
/
/
P
e
r
t
h
18
lat2 = -32.940;
19
lon2 = -115.967;
20
21
if ( lat1 < -90.0 || lat1 > 90.0 || lat2 < -90.0 || lat2 > 90.0)
22
std :: cout << " blad danych " << std :: endl ;
23
if ( lon1 < -180.0 || lon1 > 180.0 || lon2 < -180.0 || lon2 > 180.0)
24
std :: cout << " blad danych " << std :: endl ;
25
26
double p1_r = EARTH_RADIUS;
27
double p1_phi = -1.0 * deg_to_rad( lon1 );
28
double p1_varphi = ( deg_to_rad( -1.0 * lat1 )) + deg_to_rad(90.0) ;
29
30
std :: cout << " koordynaty 1 punktu , sferyczne :" << std :: endl ;
31
std :: cout << p1_r << std :: endl ;
32
std :: cout << rad_to_deg( p1_phi ) << std :: endl ;
33
std :: cout << rad_to_deg( p1_varphi ) << std :: endl;
34
35
double p2_r = EARTH_RADIUS;
36
double p2_phi = -1.0 * deg_to_rad( lon2 );;
37
double p2_varphi = ( deg_to_rad( -1.0 * lat2 )) + deg_to_rad(90.0) ;
38
39
std :: cout << " koordynaty 2 punktu , sferyczne :" << std :: endl ;
40
std :: cout << p2_r << std :: endl ;
41
std :: cout << rad_to_deg( p2_phi ) << std :: endl ;
42
std :: cout << rad_to_deg( p2_varphi ) << std :: endl;
43
44
p1_x = p1_r * std :: sin( p1_varphi ) * std :: cos( p1_phi );
45
p1_y = p1_r * std :: sin( p1_varphi ) * std :: sin( p1_phi );
46
p1_z = p1_r * std :: cos( p1_varphi );
47
48
p2_x = p2_r * std :: sin( p2_varphi ) * std :: cos( p2_phi );
49
p2_y = p2_r * std :: sin( p2_varphi ) * std :: sin( p2_phi );
50
p2_z = p2_r * std :: cos( p2_varphi );
51
52
alpha = std :: acos ((( p1_x * p2_x ) + ( p1_y * p2_y) + ( p1_z * p2_z )) /
std :: pow( p1_r , 2.0) );
53
std :: cout << "\ nodleglosc Paryz - Pert = " << alpha * p1_r <<" mil
morskich " << std :: endl ;
54
return 0;
55
}
10.7. Długość łuku na kuli
143
Po uruchomieniu tego program mamy następujący wynik:
1
koordynaty 1 punktu , sferyczne :
2
3440.07
3
2.548
4
40.99
5
koordynaty 2 punktu , sferyczne :
6
3440.07
7
115.967
8
122.94
9
10
odleglosc Paryz - Pert = 7744.83 mil morskich
Bibliografia
[1] L. Banachowski, K. Diks, W. Rytter. Algorytmy i struktury danych. Wydaw-
nictwo Naukowo-Techniczne, Warszawa, 1996.
[2] B. Baron, Ł. Piątek. Metody numeryczne w C++ Builder. Helion, Gliwice,
2004.
[3] A. Bjorck, G. Dahlquist. Metody numeryczne. Państwowe Wydawnictwo Na-
ukowe, Warszawa, 1987.
[4] K. Borsuk. Geometria analityczna w n wymiarach. Wydawnictwo Czytelnik,
1950.
[5] I. Parberry F. Dunn. 3D Math primer for graphics and game development.
Jones & Bartlett Publishers, 2002.
[6] G. Forsythe, M. Malcom, C. Moler. Computer methods for mathematical com-
putations. Prentice-Hall, Inc., New York, 1977.
[7] R. Graham, D. Knuth, O. Patashnik. Matematyka konkretna. Wydawnictwo
Naukowe PWN, Warszawa, 1996.
[8] R. Hornbeck. Numerical Methods. Quantum Publishers, Inc., New York, 1975.
[9] S. Jermakow. Metoda Monte Carlo i zagadnienia pokrewne. Państwowe Wy-
dawnictwo Naukowe, Warszawa, 1976.
[10] R. Johnston. Numerical methods. John Wiley & Sons, New York, 1982.