Aller au contenu

Différentes distances⚓︎

Il existe en mathématiques et en informatique de nombreuses façons de calculer la distance entre deux points.

Points A et B

On étudie ici les trois distances suivantes :

C'est la distance parcourue « en suivant les rues » dans le quartier de Manhattan. Elle vaut \(12\) dans la figure ci-dessous, quel que soit le chemin suivi :

Distance de Manhattan

On la définit comme la somme des « écarts » entre chaque paires de coordonnées des points :

\(\mathrm{manhattan}(x_A, y_A, x_B, y_B) = \lvert x_B - x_A \rvert + \lvert y_B - y_A \rvert\)

Aide

Avec Python, on calcule la valeur absolue de \(a\) en faisant abs(a).

C'est la distance classique du cours de mathématiques (dans le cas où les axes sont perpendiculaires et de même échelle).

Distance euclidienne

On la calcule à l'aide du théorème de Pythagore :

\(\mathrm{euclidienne}(x_A, y_A, x_B, y_B) = \sqrt{(x_B - x_A)^2+(y_B - y_A)^2}\)

Afin de simplifier les calculs, on utilisera ici le carré de la distance euclidienne :

\(\mathrm{euclidienne\_carrée}(x_A, y_A, x_B, y_B) = (x_B - x_A)^2+(y_B - y_A)^2\)

Aide

Avec Python, on calcule le carré de \(a\) en faisant a**2.

Aux échecs, le roi peut se déplacer d'une case à la fois dans toutes les directions.

Combien de coups lui faut-il pour atteindre une case donnée ? La réponse est donnée par la distance de Tchebytchev.

Sur la figure ci-dessous, les cases marquées sont toutes accessibles en \(2\) coups.

Distance de Tchebytchev

Cette distance est égale à l'« écart » maximal entre les coordonnées de chaque point :

\(\mathrm{tchebytchev}(x_A, y_A, x_B, y_B) = \max (\lvert x_B - x_A \rvert , \lvert y_B - y_A \rvert)\)

Aide

Avec Python, on calcule le maximum de deux nombres a et b en faisant max(a, b).

Exemples

En prenant \(A(2\,;\,-5)\) et \(B(-3\,;\,1)\) :

🐍 Console Python
>>> xA, yA = 2, -5
>>> xB, yB = -3, 1
>>> manhattan(xA, yA, xB, yB) 
11
>>> euclidienne_carre(xA, yA, xB, yB) 
61
>>> tchebychev(xA, yA, xB, yB)
6

En prenant \(A(2\,;\,2)\) et \(B(2\,;\,2)\) :

🐍 Console Python
>>> xA, yA = 2, 2
>>> xB, yB = 2, 2
>>> manhattan(xA, yA, xB, yB)
0
>>> euclidienne_carre(xA, yA, xB, yB)
0
>>> tchebychev(xA, yA, xB, yB)
0

Compléter les fonctions ci-dessous :

###
# Testsbksl-nlxA, yA = 2, -5bksl-nlxB, yB = -3, 1bksl-nlassert manhattan(xA, yA, xB, yB) == 11bksl-nlassert euclidiennepy-undcarre(xA, yA, xB, yB) == 61bksl-nlassert tchebychev(xA, yA, xB, yB) == 6bksl-nlbksl-nlxA, yA = 2, 2bksl-nlxB, yB = 2, 2bksl-nlassert manhattan(xA, yA, xB, yB) == 0bksl-nlassert euclidiennepy-undcarre(xA, yA, xB, yB) == 0bksl-nlassert tchebychev(xA, yA, xB, yB) == 0bksl-nlbksl-nl# Tests supplémentairesbksl-nlpoints = [bksl-nl (2, 3),bksl-nl (10, -3),bksl-nl (0, -5),bksl-nl (3, -6),bksl-nl (-1, -10),bksl-nl (-10, -1),bksl-nl (-10, -3),bksl-nl (5, 1),bksl-nl (0, 0),bksl-nl (-5, 3),bksl-nl]bksl-nlfor i in range(len(points) - 1):bksl-nl xA, yA = points[i]bksl-nl xB, yB = points[i + 1]bksl-nl attendu = abs(xB - xA) + abs(yB - yA)bksl-nl assert (bksl-nl manhattan(xA, yA, xB, yB) == attendubksl-nl ), f"Erreur sur le calcul de manhattan{xA, yA, xB, yB}"bksl-nl attendu = (xB - xA) py-strpy-str 2 + (yB - yA) py-strpy-str 2bksl-nl assert (bksl-nl euclidiennepy-undcarre(xA, yA, xB, yB) == attendubksl-nl ), f"Erreur sur le calcul de euclidiennepy-undcarre{xA, yA, xB, yB}"bksl-nl attendu = max(abs(xB - xA), abs(yB - yA))bksl-nl assert (bksl-nl tchebychev(xA, yA, xB, yB) == attendubksl-nl ), f"Erreur sur le calcul de tchebychev{xA, yA, xB, yB}"bksl-nl xA, yA = points[i + 1]bksl-nl xB, yB = points[i]bksl-nl attendu = abs(xB - xA) + abs(yB - yA)bksl-nl assert (bksl-nl manhattan(xA, yA, xB, yB) == attendubksl-nl ), f"Erreur sur le calcul de manhattan{xA, yA, xB, yB}"bksl-nl attendu = (xB - xA) py-strpy-str 2 + (yB - yA) py-strpy-str 2bksl-nl assert (bksl-nl euclidiennepy-undcarre(xA, yA, xB, yB) == attendubksl-nl ), f"Erreur sur le calcul de euclidiennepy-undcarre{xA, yA, xB, yB}"bksl-nl attendu = max(abs(xB - xA), abs(yB - yA))bksl-nl assert (bksl-nl tchebychev(xA, yA, xB, yB) == attendubksl-nl ), f"Erreur sur le calcul de tchebychev{xA, yA, xB, yB}"bksl-nlbksl-nl 5/5

def manhattan(..., ..., ..., ...):bksl-nl return ...bksl-nlbksl-nlbksl-nldef euclidiennepy-undcarre(..., ..., ..., ...):bksl-nl ...bksl-nlbksl-nlbksl-nldef ...:bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlxA, yA = 2, -5bksl-nlxB, yB = -3, 1bksl-nlassert manhattan(xA, yA, xB, yB) == 11bksl-nlassert euclidiennepy-undcarre(xA, yA, xB, yB) == 61bksl-nlassert tchebychev(xA, yA, xB, yB) == 6bksl-nlbksl-nlxA, yA = 2, 2bksl-nlxB, yB = 2, 2bksl-nlassert manhattan(xA, yA, xB, yB) == 0bksl-nlassert euclidiennepy-undcarre(xA, yA, xB, yB) == 0bksl-nlassert tchebychev(xA, yA, xB, yB) == 0bksl-nlbksl-nldef manhattan(xA, yA, xB, yB):bksl-nl return abs(xB - xA) + abs(yB - yA)bksl-nlbksl-nlbksl-nldef euclidiennepy-undcarre(xA, yA, xB, yB):bksl-nl return (xB - xA) py-strpy-str 2 + (yB - yA) py-strpy-str 2bksl-nlbksl-nlbksl-nldef tchebychev(xA, yA, xB, yB):bksl-nl return max(abs(xB - xA), abs(yB - yA))bksl-nlbksl-nl

A

Z