Aller au contenu

Nous souhaitons programmer une fonction qui, étant donné une liste de points du plan à coordonnées entières, donne celui qui est le plus proche d'un point de départ.

Les points sont donnés sous la forme d'un tuple de deux entiers. La liste des points à traiter est donc un tableau de tuples.

La distance utilisée est la distance euclidienne, dont on rappelle la définition. La distance euclidienne entre deux points du plan de coordonnées \((x_1;y_1)\) et \((x_2;y_2)\) est donnée par la formule :

\[d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\]

Indication

Si la variable point référence notre couple de coordonnées, alors le décompactage permet de donner un nom simple aux composantes point[0] et point[1] :

🐍 Script Python
x, y = point

Vous pouvez utiliser cette astuce dans votre solution.

Nous disposons d'une fonction distance et d'une fonction plus_proche dans l'IDE suivant. Compléter comme il se doit et tester.

Exemples

🐍 Console Python
>>> plus_proche([(7, 9), (2, 5), (5, 2)], (0, 0))
(2, 5)
>>> plus_proche([(7, 9), (2, 5), (5, 2)], (7, 9))
(7, 9)
bksl-nl# testsbksl-nlbksl-nlassert pluspy-undproche([(7, 9), (2, 5), (5, 2)], (0, 0)) == (2, 5)bksl-nlassert pluspy-undproche([(7, 9), (2, 5), (5, 2)], (7, 9)) == (7, 9)bksl-nlbksl-nlbksl-nl# Autres testsbksl-nlbksl-nltableaupy-und1 = [(10, -8), (-3, -3), (0, 3), (8, -6), (-1, -6), (5, -3), (-4, -7), (6, -9), (7, 3), (2, 5)]bksl-nldepartpy-und1 = (-8, -7)bksl-nldepartpy-und2 = (-2, -1)bksl-nlbksl-nlassert pluspy-undproche(tableaupy-und1, departpy-und1) == (-4, -7)bksl-nlassert pluspy-undproche(tableaupy-und1, departpy-und2) == (-3, -3)bksl-nlbksl-nlgros = [(36, -11), (84, 75), (18, 17), (88, 54), (100, 83), (15, 60), (52, 33), (61, -19), (9, 99), (-12, 6), (7, 28), (45, -43), (-87, -71), (66, 53), (-5, 75), (26, -57), (-71, 93), (-57, 9), (-87, -32), (45, -59), (-73, 31), (74, -5), (-66, 45), (-16, -61), (3, 1), (87, -76), (-57, 50), (7, -66), (34, -73), (55, 56), (62, 7), (10, 97), (54, -98), (54, 21), (-95, 41), (74, -56), (3, 85), (-73, -8), (-82, -11), (70, -26), (-82, 7), (-71, -81), (8, -72), (29, 24), (26, 98), (95, -22), (-57, 100), (16, -59), (62, 57), (-35, 51), (-47, 40), (-55, -83), (-23, 34), (17, -67), (15, 27), (45, 34), (42, -93), (-41, 9), (-77, 83), (-3, 75), (-20, -39), (66, 40), (-57, -40), (53, 24), (-36, 1), (5, -99), (56, 38), (-24, 57), (0, 42), (-25, -67), (70, 3), (-99, 75), (-45, -64), (52, 61), (-7, -71), (62, -17), (35, -81), (88, 50), (13, 56), (-47, 78), (-37, 46), (69, -92), (58, -83), (15, 65), (-31, 77), (-50, -46), (-64, -36), (-4, -40), (-59, 24), (-31, 40), (-67, 84), (-75, -73), (-86, 61), (-14, 22), (41, -97), (-97, 15), (60, -20), (15, 12), (-93, -79), (-19, -11)]bksl-nldepartpy-und3 = (10, 38)bksl-nlbksl-nlassert pluspy-undproche(gros, departpy-und3) == (7, 28)bksl-nlbksl-nl ∞/∞

from math import sqrtbksl-nlbksl-nldef distance(pointpy-und1, pointpy-und2):bksl-nl """ Calcule et renvoie la distance euclidiennebksl-nl entre deux points. """bksl-nl # vous pouvez ajouter des lignes de code ici si besoinbksl-nl return sqrt(((...)py-strpy-str2 + (...)py-strpy-str2))bksl-nlbksl-nldef pluspy-undproche(points, depart):bksl-nl """ Renvoie le point du tableau points se trouvant à la plus bksl-nl courte distance du point depart."""bksl-nl pointpy-undproche = points[0]bksl-nl distpy-undminimale = ...bksl-nl for i in range(1, ...):bksl-nl point = ...bksl-nl distpy-undcourante = ...bksl-nl if distpy-undcourante ...:bksl-nl pointpy-undproche = ...bksl-nl distpy-undminimale = ...bksl-nl return pointpy-undprochebksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert pluspy-undproche([(7, 9), (2, 5), (5, 2)], (0, 0)) == (2, 5)bksl-nlassert pluspy-undproche([(7, 9), (2, 5), (5, 2)], (7, 9)) == (7, 9)bksl-nlbksl-nlfrom math import sqrtbksl-nlbksl-nldef distance(pointpy-und1, pointpy-und2):bksl-nl """ Calcule et renvoie la distance euclidiennebksl-nl entre deux points. """bksl-nl # vous pouvez ajouter des lignes de code ici si besoinbksl-nl x1, y1 = pointpy-und1bksl-nl x2, y2 = pointpy-und2bksl-nl return sqrt(((x1 - x2)py-strpy-str2 + (y1 - y2)py-strpy-str2))bksl-nlbksl-nldef pluspy-undproche(points, depart):bksl-nl """ Renvoie le point du tableau points se trouvant à la plus bksl-nl courte distance du point depart."""bksl-nl pointpy-undproche = points[0]bksl-nl distpy-undminimale = distance(pointpy-undproche, depart)bksl-nl for i in range(1, len(points)):bksl-nl point = points[i]bksl-nl distpy-undcourante = distance(point, depart)bksl-nl if distpy-undcourante < distpy-undminimale:bksl-nl pointpy-undproche = pointbksl-nl distpy-undminimale = distpy-undcourantebksl-nl return pointpy-undprochebksl-nlbksl-nl

A

Commentaires⚓︎

Première version⚓︎

{{ IDE('exo_corr') }}

Variante⚓︎

Une autre possibilité en initialisant la distance minimale à \(+\infty\) et en faisant une boucle sur les éléments du tableau et non sur les indices.

D'autre part, comme ce qui nous intéresse ici est de comparer les distances, nous pouvons nous contenter de calculer le carré de la distance euclidienne. Nous éviterons ainsi la manipulation des nombres flottants.

🐍 Script Python
def distance_carree(point_1, point_2):
    """ Calcule et renvoie le carré de la distance euclidienne
    entre deux points. """
    # vous pouvez ajouter des lignes de code ici si besoin
    x1, y1 = point_1
    x2, y2 = point_2
    return ((x1 - x2)**2 + (y1 - y2)**2)

def plus_proche(points, depart):
    """ Renvoie le point du tableau points se trouvant à la plus 
    courte distance du point depart."""
    point_proche = None
    dist_minimale = float('inf')
    for point in points:
        dist_courante = distance_carree(point, depart)
        if dist_courante < dist_minimale:
            point_proche = point
            dist_minimale = dist_courante
    return point_proche

Z

Retour en haut de la page