Un peu de trigonométrie

Alors que nous naviguions en flottille de trois bateaux, nous nous amusions à connaître les distances qui séparaient les bateaux les uns des autres. Pour cela, nous pouvions leurs demander leur position GPS par message avec un téléphone satellite. N’ayant pas d’internet au milieu de l’océan pour nous aider dans cet exercice, nous avions pensé à plusieurs méthodes pour trouver la distance entre deux bateaux, connaissant leur position GPS.

La méthode graphique

La première, la plus simple, nous incombait à reproduire un quadrillage sur une feuille les degrés, subdivisés en minutes et de positionner les bateaux sur la feuille. A l’aide d’un compas, on reportait la distance entre les bateaux sur l’axe des Y, les latitudes, pour connaitre la distance. La conversion est simple:

\( 1° = 60\ minutes = 60\ miles ⇒ 60·1,852\ km ≅ 111\ km \)

La méthode trigonométrique

La deuxième méthode faisait appel à la trigonométrie. Connaissant deux points dans un système de coordonnées, on peut tracer un triangle rectangle et calculer l’hypoténuse du triangle qui représente la distance entre les deux points. Dans notre cas, les deux points sont les deux bateaux sur le système de coordonnées GPS.

Sachant encore que:

  • la distance d’une minute d’arc entre 2 latitudes est égale à 1’852 m
  • la distance d’une minute d’arc entre 2 longitudes est égale au cosinus de la latitude multiplié par 1852m. En effet les longitudes n’ont pas la même distance selon la latitude où nous nous trouvons: à l’équateur c’est exactement 1852m, tandis que plus on se rapproche des pôles, plus la distance diminue.

On peut donc calculer la distance entre deux bateaux selon cette formule:

\(
A(x1,y1) = position\ du\ bateau\ 1\\
B(x2,y2) = position\ du\ bateau\ 2\\
d = distance\ entre\ A\ et\ B\\
d = \sqrt{\left | x1-y1 \right |^{2} + (\left | x1-y1 \right | \cdot \cos (\frac{x1+x2}{2}))^{2}}
\)

Du python pour automatiser

Pour m’amuser un peu, j’ai relancé Mate pour écrire un petit script en Python afin d’automatiser le calcul.

#!/usr/bin/env python3

from math import radians, cos, sqrt
import sys, datetime


def convert(s):
    gps = s.split(',')

    return float(gps[0]) + float(gps[1]) / 60 / 100

def distance(p1, p2):
    lat1, long1 = p1
    lat2, long2 = p2
    ratio = cos(radians((lat1+lat2)/2))
    delta1 = (abs(long1-long2) * ratio) * 60
    delta2 = abs(lat1-lat2) * 60
    return sqrt(delta1 * delta1 + delta2 * delta2)


if __name__ == '__main__':
    p1 = (convert(sys.argv[1]), convert(sys.argv[2]))
    p2 = (convert(sys.argv[3]), convert(sys.argv[4]))
    mn = distance(p1, p2)
    km = mn * 1.852
    date = datetime.datetime.now()
    print('%s Distance %0.2f MN, %0.2f km' % (date, mn, km))

A utiliser avec les arguments

#                   lat 1    long 1     lat 2     long 2
#                   x1        y1        x2        y2
python3 distance.py 14,27.005 59,48.563 14,23.843 57,20.711