40 lines
1.3 KiB
Text
40 lines
1.3 KiB
Text
/*REXX pgm calculates distance between Nashville & Los Angles airports. */
|
|
say " Nashville: north 36° 7.2', west 86° 40.2' = 36.12°, -86.67°"
|
|
say "Los Angles: north 33° 56.4', west 118° 24.0' = 33.94°, -118.40°"
|
|
say
|
|
dist=surfaceDistance(36.12, -86.67, 33.94, -118.4)
|
|
say dist
|
|
|
|
bef = Length(dist/1)
|
|
kdist=format(dist/1,bef,2)
|
|
mdist=format(dist/1.609344,bef,2)
|
|
ndist=format(mdist*5280/6076.1,bef,2)
|
|
say ' distance between= ' kdist " kilometers,"
|
|
say ' or ' mdist " statute miles,"
|
|
say ' or ' ndist " nautical or air miles."
|
|
exit /*stick a fork in it, we're done.*/
|
|
/*----------------------------------SURFACEDISTANCE subroutine----------*/
|
|
|
|
method radians(x) static
|
|
return x * Math.PI / 180
|
|
|
|
method surfaceDistance(lat1,lon1,lat2,lon2) public static /*use haversine formula for dist.*/
|
|
radius = 6372.8 /*earth's mean radius in km */
|
|
dLat = radians(lat2 - lat1)
|
|
dLon = radians(lon2 - lon1)
|
|
lat1 = radians(lat1)
|
|
lat2 = radians(lat2)
|
|
|
|
a = sin(dLat / 2)**2 + cos(lat1) * cos(lat2) * sin(dLon / 2) ** 2
|
|
c = 2 * asin(sqrt(a))
|
|
|
|
return radius * c
|
|
|
|
method cos(x) static
|
|
return Rexx Math.cos(x)
|
|
method sin(x) static
|
|
return Rexx Math.sin(x)
|
|
method asin(x) static
|
|
return Rexx Math.asin(x)
|
|
method sqrt(x) static
|
|
return Rexx Math.sqrt(x)
|