ATLAS Ouvrir dans l'atlas →

ExerciceSeconde, chapitre 5 — Géométrie cartésienne · Applications Python

Exercice 21

Algorithmique

On donne la fonction suivante, qui teste si un triangle est isocèle :

from math import sqrt

def distance(xA, yA, xB, yB):
    return sqrt((xB - xA)**2 + (yB - yA)**2)

def est_isocele(xA, yA, xB, yB, xC, yC):
    AB = distance(xA, yA, xB, yB)
    AC = distance(xA, yA, xC, yC)
    BC = distance(xB, yB, xC, yC)
    if AB == AC or AB == BC or AC == BC:
        return True
    else:
        return False

1. Que renvoie l'appel est_isocele(0, 0, 6, 0, 3, 5) ?

2. Tester la fonction sur les quatre triangles de l'exercice 16.

3. Le test AB == AC porte sur des valeurs approchées. Expliquer pourquoi ce programme peut parfois répondre False alors que le triangle est bel et bien isocèle.

4. Écrire une fonction est_rectangle qui teste si un triangle est rectangle. On travaillera sur les carrés des longueurs, afin d'éviter toute racine carrée : pourquoi est-ce plus fiable ?

Corrigé

1. Le triangle a pour côtés 66, 34\sqrt{34} et 34\sqrt{34} : il est isocèle, donc est_isocele(0, 0, 6, 0, 3, 5) renvoie True\boxed{\texttt{est\_isocele(0, 0, 6, 0, 3, 5)} \text{ renvoie } \texttt{True}}

2. En reprenant les quatre triangles de l'exercice 16 : TrueFalseTrueFalse\boxed{\texttt{True} \qquad \texttt{False} \qquad \texttt{True} \qquad \texttt{False}} Seuls les triangles 1 et 3 sont isocèles.

3. La fonction sqrt ne renvoie qu'une valeur approchée. Deux longueurs théoriquement égales, comme 34\sqrt{34} et 34\sqrt{34}, peuvent être calculées par deux chemins différents et différer de très peu dans la mémoire de la machine — par exemple 5,8309518948453015{,}830951894845301 et 5,8309518948453005{,}830951894845300. Le test AB == AC renvoie alors False alors que le triangle est bel et bien isocèle.

4. On compare les carrés des longueurs, qui sont des entiers lorsque les coordonnées le sont :

def carre_distance(xA, yA, xB, yB):
    return (xB - xA)**2 + (yB - yA)**2

def est_rectangle(xA, yA, xB, yB, xC, yC):
    AB = carre_distance(xA, yA, xB, yB)
    AC = carre_distance(xA, yA, xC, yC)
    BC = carre_distance(xB, yB, xC, yC)
    if AB + AC == BC or AB + BC == AC or AC + BC == AB:
        return True
    else:
        return False

Pourquoi est-ce plus fiable ? Aucune racine carrée n'apparaît : tous les calculs se font sur des entiers, que la machine manipule de façon exacte. Le test d'égalité est alors parfaitement sûr.

Dans l'édifice

Thèmes

distance, quadrilatères

Notions

norme

Ouvrir dans l'atlas interactif →