PROG0393 - Great-circle navigation
A great circle of a sphere is the intersection of the sphere and a plane which passes through the center point of the sphere. Any diameter of any great circle coincides with a diameter of the sphere, and therefore all great circles have an equal circumference, and have the same center as the sphere. Through any two points on a sphere which are not directly opposite each other, there is a unique great circle. The distance between these points on the surface of the sphere is called the great-circle distance.
A transatlantic ship thus does not travel from Southampton in England to New York in the USA alongside an east-west latitude — which would appear to be the shortest route according to maps of the world (e.g. with Mercator projection) — but alongside the great circle which passes through both locations. This great circle is located relatively high (northward) over the Atlantic Ocean. The following map shows the part of the great circle which constitutes the shortest distance between Southhampton and New York. The ends can be changed as required.
The great-circle distance $d$ between two points on a sphere can be calculated by means of the following formula: $$d = r \cdot \arccos(\sin(x_1) \cdot \sin(x_2) + \cos(x_1)\cdot \cos(x_2) \cdot \cos(y_1 - y_2))$$ The degrees of longitude and latitude of both points are represented by $(x_1, y_1)$ and $(x_2, y_2)$ in decimal degrees, and the radius of the sphere is $r$.
In this assignment we assume that the earth is a sphere with radius $r = 6371\mbox{ km}$. Note: the actual shape of the earth is more like a flattened spheroid than a sphere, so the formula above is only an approximation (up to around $0.5\%$ error).
Preparation
To solve this assignment you need functions from the math module. These functions are not available by default for Python, but can be loaded by placing the following statement above your program code.
import math
To see the available functions in the math module execute the following commands in an interactive Python session.
>>> import math >>> help(math)
It may also be advisable to consult the online documentation of the Standard Python Library. This shows, for example, that the sine of $\frac{\pi}{2}$ can be calculated in the following manner.
>>> import math >>> math.sin(math.pi / 2) 1.0
Note that all trigonometric functions in the math module work with angles expressed in radians. The degrees of longitude and latitude thus need conversion to radians, which is also possible with a function in the math module. It is up to you to find the appropriate function.
Input
The input consists of 4 real numbers $x_1$, $y_1$, $x_2$ and $y_2$, each on a separate line, of which $(x_1, y_1)$ and $(x_2, y_2)$ respectively represent the degrees of longitude and latitude of two points on earth.
Output
A description of the great-circle distance (in kilometers) between both points on earth. The great-circle distance should be rounded off to the closest natural number.
Example
Input:
48.87 -2.33 37.80 122.40
Output:
The great-circle distance is 8948 km.
Een grootcirkel is een cirkel op een boloppervlak waarvan de straal gelijk is aan de straal van de bol. Dit betekent ook dat het middelpunt van alle grootcirkels samenvalt met het middelpunt van de bol. De kortste verbinding tussen twee punten op een bol, gemeten over het boloppervlak, is altijd een deel van een grootcirkel. De afstand over deze kortste verbinding wordt de grootcirkelafstand genoemd.
Zo vaart een transatlantisch schip van Southhampton, Engeland naar New York, USA niet over een oost-west breedtegraad — wat op veel wereldkaarten de kortste route lijkt (o.a. bij een Mercatorprojectie) — maar over de grootcirkel die door beide plaatsen loopt. Deze grootcirkel loopt relatief hoog (noordelijk) over de Atlantische oceaan. Onderstaande kaart toont initieel het deel van de grootcirkel dat de kortste afstand vormt tussen Southhampton en New York. De eindpunten kun je naar willekeur verslepen.
De grootcirkelafstand $d$ tussen twee punten op een bol kan berekend worden met behulp van de volgende formule $$d = r \cdot \arccos(\sin(x_1) \cdot \sin(x_2) + \cos(x_1)\cdot \cos(x_2) \cdot \cos(y_1 - y_2))$$ Hierbij zijn $(x_1, y_1)$ en $(x_2, y_2)$ de lengte- en breedtegraden van beide punten (gegeven in decimale graden), en is $r$ de straal van de bol waarop de afstand berekend moeten worden.
Bij deze opgave nemen we aan dat de Aarde bolvormig is met straal $r = 6371\mbox{ km}$. Ondanks het feit dat de Aarde geen perfecte bol is, geeft de formule voor de grootcirkelafstand op Aarde toch een benadering die correct is tot op $0.5\%$.
Voorbereiding
Om deze opgave op te lossen heb je functies uit de math module nodig. Deze functies zijn niet standaard beschikbaar voor Python, maar ze kunnen ingeladen worden door het volgende statement bovenaan je programmacode te plaatsen.
import math
Welke functies er allemaal voorhanden zijn in de math module kan je bekijken door de volgende commando's uit te voeren in een interactieve Pythonsessie.
>>> import math >>> help(math)
Het is ook altijd een goed idee om de online documentatie van de Standard Python Library te raadplegen. Daaruit leer je bijvoorbeeld dat de sinus van $\frac{\pi}{2}$ op de volgende manier kan berekend worden.
>>> import math >>> math.sin(math.pi / 2) 1.0
Merk op dat alle goniometrische functies in de math module werken met hoeken die uitgedrukt zijn in radialen. De lengte- en breedtegraden moeten dus omgezet worden naar radialen, maar daarvoor bestaat ook een functie in de math module. Aan jou de opdracht om die functie op te zoeken.
Invoer
De invoer bestaat uit 4 reële getallen $x_1$, $y_1$, $x_2$ en $y_2$, elk op een afzonderlijke regel, waarbij $(x_1, y_1)$ en $(x_2, y_2)$ respectievelijk de lengte- en breedtegraden van twee punten op Aarde voorstellen.
Uitvoer
Een omschrijving die de grootcirkelafstand (in kilometer) tussen beide punten op Aarde aangeeft. De grootcirkelafstand moet hierbij afgerond worden naar het dichtste natuurlijk getal.
Voorbeeld
Invoer:
48.87 -2.33 37.80 122.40
Uitvoer:
De grootcirkelafstand bedraagt 8948 km.
Added by: | Peter Dawyndt |
Date: | 2013-06-03 |
Time limit: | 10s |
Source limit: | 50000B |
Memory limit: | 1536MB |
Cluster: | Cube (Intel G860) |
Languages: | PY_NBC |
Resource: | None |