De kortste afstand tussen twee punten is een rechte lijn. Dit wiskundig feit is zelfs een vaste uitdrukking geworden in de omgangstaal. Technisch gezien wordt de afstand waarvan hier sprake is de Euclidische afstand genoemd. Om in een driedimensionale ruimte de afstand $$d$$ te berekenen tussen een punt $$(x_1, y_1, z_1)$$ en een punt $$(x_2,y_2,z_2)$$, kan je de volgende formule gebruiken: \[d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}\]
Op de bolvormige Aarde moet men zich bij routebepaling echter beperken tot reiswegen die het aardoppervlak volgen. Daarbij blijft de kortste afstand tussen twee punten een rechte lijn. Alleen is een rechte lijn hier net iets anders gedefinieerd. Op een bol volgt een rechte lijn immers een grote cirkel. Zo'n grote cirkel is de snijlijn van de bol met een vlak dat door het middelpunt van de bol gaat.
Er bestaan verschillende formules om de korste afstand tussen twee punten op een bol te bepalen. De haversine formule is echter vanuit numeriek oogpunt de meest stabiele. Het woord haversine is een samentrekking van halfed versed sine, waarbij de versed sine van de hoek $$\theta$$ gelijk is aan $$1-\cos(\theta)$$. De helft hiervan is dan gelijk aan \[\frac{1-\cos(\theta)}{2} = \left(\sin\left(\frac{\theta}{2}\right)\right)^2\] Als $$r$$ de aardstraal voorstelt, dan wordt de haversine formule om de afstand $$d$$ te bepalen tussen een punt met coördinaten $$(b_1,l_1)$$ en een punt met coördinaten $$(b_2,l_2)$$ gegeven door \[\begin{aligned}[c] a & = \left(\sin\left(\frac{b_2-b_1}{2}\right)\right)^2 + \cos(b_1)\cos(b_2)\left(\sin\left(\frac{l_2-l_1}{2}\right)\right)^2 \\ c & = \arctan\left(\sqrt{\frac{a}{1-a}}\right) \\ d & = 2rc \end{aligned}\]
Als je de Euclidische afstand tussen twee punten op het aardoppervlak wil weten, dan moet je eerst hun coördinaten omzetten naar $$x$$-, $$y$$- en $$z$$-coördinaten. De formules hiervoor zijn echter zeer eenvoudig. Als een punt breedte- en lengteligging $$(b,l)$$ heeft, dan kan je dat omrekenen naar $$x$$-, $$y$$- en $$z$$-coördinaten met de volgende formules \[ \left\{ \begin{aligned}[c] x & = r\cos(b)\cos(l) \\ y & = r\cos(b)\sin(l) \\ z & = r\sin(b) \end{aligned} \right.\] Hierbij stelt $$r$$ de aardstraal voor.
Schrijf een functie latLng2Cartesisch die een breedte- en lengteligging in decimale graden als argument neemt en die de $$x$$-, $$y$$- en $$z$$-coördinaat van die positie in km teruggeeft. Let op: de goniometrische functies in de math module nemen hoeken in radialen als argument. Er is echter ook een methode beschikbaar die voor jou de omzetting naar radialen doet. Gebruik 6371 km als benadering voor de aardstraal.
Gebruik de functie latLng2Cartesisch om een functie euclidischeAfstand te schrijven, die twee breedte- en lengteliggingen in decimale graden als argument neemt en de Euclidische afstand tussen die twee punten teruggeeft (in km).
Schrijf een functie haversineAfstand die twee breedte- en lengteliggingen in decimale graden als argument neemt en de afstand teruggeeft tussen die twee punten over het boloppervlak (in km). Maak gebruik van de haversine formule om deze afstand te berekenen.
>>> latLng2Cartesisch(0.0, 0.0)
(6371.0, 0.0, 0.0)
>>> euclidischeAfstand(0.0, 0.0, 0.0, 0.0)
0.0
>>> euclidischeAfstand(0.0, 0.0, 0.0, 180.0)
12742.0
>>> haversineAfstand(0.0, 0.0, 0.0, 0.0)
0.0
>>> haversineAfstand(0.0, 0.0, 0.0, 180.0)
20015.086796