Ce site utilise Google Analytics, Google AdSense et le service de chat Crisp pour mesurer l'audience, afficher des annonces et proposer une assistance en ligne. Acceptez-vous le dépôt de cookies ?
Une question ? Je suis là pour vous aider !
site2wouf.fr : Dénombrer des triangles
Ce qui est affirmé sans preuve peut être nié sans preuve.
Combien comptez-vous de vrais triangles dans cette figure ?
C'est une activité ancienne et toujours à la mode. Parfois proposée par le prof de Mathématiques, ou en guise d'énigme sur internet, le dénombrement de triangles (ou quadrilatères,...) n'est pas aussi facile que l'on pense ! Sans technique ni méthode, c'est peine perdue !
Pour vous aider à résoudre ce type d'énigme, j'ai créé deux outils complémentaires :
🌐 Application web interactive : utilisable immédiatement dans votre navigateur, sans installation
🐍 Script Python open source : téléchargeable pour une utilisation en local, avec analyse détaillée
Les deux outils utilisent le même algorithme optimisé avec le module itertools.combinations pour garantir des résultats identiques et performants.
Mais avant de les utiliser, commençons par un exemple simple pour comprendre le principe...
🔺 Dénombrement de Triangles
Application interactive pour compter les triangles dans une figure géométrique
📚 Comment ça fonctionne ?
Cette application compte automatiquement le nombre de vrais triangles
(non plats) dans une figure géométrique. Vous devez fournir deux informations :
Le graphe : liste des segments tracés
Les alignements (optionnel) : liste des points alignés
Exemple : Quadrilatère avec diagonales
Figure : Quadrilatère ABCD avec ses diagonales [AC] et [BD] sécantes en E
Fichier graphe.txt :
ABCDE
BACDE
CABDE
DABCE
EABCD
Chaque ligne : le 1er point est relié à tous les suivants
Ex: "ABCDE" → segments [AB], [AC], [AD], [AE]
Fichier alignement.txt :
AEC
BED
Points alignés (triangles plats à exclure)
A, E et C sont sur la même droite (diagonale AC)
B, E et D sont sur la même droite (diagonale BD)
✓ Résultat attendu : 8 triangles
4 petits : AEB, BEC, CED, DEA
4 grands : ABC, BCD, CDA, DAB
🚀 Application Interactive
Format : chaque ligne contient un point suivi de tous les points auxquels il est relié.
Exemple : "ABCD" signifie que A est relié à B, C et D.
Format : chaque ligne contient les points alignés.
Exemple : "AEC" signifie que A, E et C sont sur la même droite.
Python ! AU SECOURS !
Comme souvent plutôt que de passer un certain temps à compter, avec concentration et méthode, je préfère coder quelques lignes ! Ceci a au moins l'avantage d'être réutilisable
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Application de dénombrement de triangles dans une figure géométriqueAuteur : Laurent Petitprez (Wouf) - site2wouf.frDate : 2025Cette application compte le nombre de "vrais" triangles (non plats)tracés dans une figure géométrique donnée.Elle utilise deux fichiers d'entrée :- graphe.txt : définit les segments tracés- alignement.txt : définit les points alignés (triangles plats à exclure)"""importsysfromitertoolsimportcombinationsdeflire_graphe():""" Lit le fichier graphe.txt et renvoie les lignes non vides. Format attendu : chaque ligne contient un point suivi de tous les points auxquels il est relié. Par exemple, "ABCD" signifie que le point A est relié aux points B, C et D (segments [AB], [AC] et [AD]). Returns: list: Liste des lignes du fichier graphe.txt Raises: SystemExit: Si le fichier est introuvable """try:withopen("graphe.txt")asfichier:lignes=fichier.read().split()returnlignesexceptFileNotFoundError:print("❌ Erreur : Le fichier graphe.txt est introuvable")sys.exit(1)deflire_alignements():""" Lit le fichier alignement.txt et renvoie les lignes non vides. Format attendu : chaque ligne contient des points alignés. Par exemple, "AEC" signifie que A, E et C sont sur la même droite. Returns: list: Liste des lignes du fichier alignement.txt, ou liste vide si absent """try:withopen("alignement.txt")asfichier:lignes=fichier.read().split()returnlignesexceptFileNotFoundError:# Le fichier alignement.txt est optionnelreturn[]defextraire_segments(lignes_graphe):""" Extrait tous les segments à partir des lignes du graphe. Chaque segment est représenté par un set de 2 points (pour éviter les doublons comme {A,B} et {B,A} qui représentent le même segment). Args: lignes_graphe (list): Lignes du fichier graphe.txt Returns: list: Liste de sets représentant les segments (ex: [{A,B}, {A,C}, ...]) Raises: SystemExit: Si une ligne du graphe est invalide (moins de 2 caractères) """segments=[]# Filtrer les lignes videslignes_valides=[ligneforligneinlignes_grapheiflen(ligne)>0]forligneinlignes_valides:iflen(ligne)<2:print(f"❌ Erreur : Ligne invalide dans graphe.txt : '{ligne}'")print(" Chaque ligne doit contenir au moins 2 points")sys.exit(1)# Le premier caractère est le point de départpoint_depart=ligne[0]# Chaque caractère suivant représente une connexionforpoint_arriveeinligne[1:]:segment=set([point_depart,point_arrivee])# Éviter les doublons (un segment {A,B} = {B,A})ifsegmentnotinsegments:segments.append(segment)returnsegmentsdefextraire_points(segments):""" Extrait tous les points uniques à partir de la liste des segments. Args: segments (list): Liste des segments (sets de 2 points) Returns: list: Liste triée des points uniques (ex: ['A', 'B', 'C', 'D', 'E']) """points=set()forsegmentinsegments:forpointinsegment:points.add(point)returnsorted(points)defidentifier_triangles_plats(lignes_alignements):""" Identifie tous les triangles plats (3 points alignés). À partir des lignes d'alignement, génère tous les triplets possibles de points alignés. Ces triplets forment des "triangles plats" qui doivent être exclus du décompte final. Args: lignes_alignements (list): Lignes du fichier alignement.txt Returns: set: Ensemble de frozensets représentant les triangles plats (ex: {frozenset({'A','E','C'}), frozenset({'B','E','D'})}) """triangles_plats=set()forligneinlignes_alignements:# Extraire les points uniques de la lignepoints_alignes=list(set(ligne))# Ignorer les lignes avec moins de 3 pointsiflen(points_alignes)<3:continue# Générer tous les triplets possibles de ces points alignés# Utilisation de frozenset pour permettre l'ajout dans un setfortripletincombinations(points_alignes,3):triangles_plats.add(frozenset(triplet))returntriangles_platsdefcompter_triangles(points,segments,triangles_plats):""" Compte le nombre de vrais triangles (non plats) dans la figure. Algorithme : 1. Générer tous les triplets possibles de 3 points (combinaisons) 2. Pour chaque triplet, vérifier que les 3 côtés existent 3. Exclure les triangles plats (points alignés) Args: points (list): Liste de tous les points segments (list): Liste de tous les segments triangles_plats (set): Ensemble des triangles plats à exclure Returns: list: Liste des triangles valides (chaque triangle est un tuple de 3 points) """triangles_valides=[]# Générer tous les triplets de 3 points parmi tous les points# Utilisation de combinations pour éviter les doublons et optimiserfortripletincombinations(points,3):p1,p2,p3=triplet# Créer les 3 côtés potentiels du trianglecote1=set([p1,p2])cote2=set([p1,p3])cote3=set([p2,p3])# Vérifier que les 3 côtés existent dans la liste des segmentsifcote1insegmentsandcote2insegmentsandcote3insegments:# Vérifier que ce n'est pas un triangle platiffrozenset(triplet)notintriangles_plats:triangles_valides.append(triplet)returntriangles_validesdefafficher_resultats(points,segments,alignements,triangles):""" Affiche les résultats de l'analyse de manière lisible. Args: points (list): Liste des points segments (list): Liste des segments alignements (list): Liste des lignes d'alignement triangles (list): Liste des triangles trouvés """print("\n"+"="*60)print("📊 RÉSULTATS DE L'ANALYSE")print("="*60)# Afficher les pointsprint(f"\n📍 Points : {len(points)}")print(f" {', '.join(points)}")# Afficher les segmentssegments_str=[f"[{''.join(sorted(seg))}]"forseginsorted(segments)]print(f"\n📏 Segments : {len(segments)}")print(f" {', '.join(segments_str)}")# Afficher les alignements si présentsifalignements:print(f"\n⚠️ Alignements déclarés : {len(alignements)}")foralignementinalignements:print(f" {alignement}")# Afficher le nombre de trianglesprint(f"\n🔺 Nombre de vrais triangles : {len(triangles)}")# Afficher la liste des trianglesiftriangles:print("\n📋 Liste des triangles :")triangles_tries=sorted([''.join(sorted(t))fortintriangles])print(f" {' '.join(triangles_tries)}")else:print(" Aucun triangle trouvé")print("\n"+"="*60+"\n")defmain():""" Fonction principale de l'application. """print("\n🔍 Dénombrement de triangles - Version moderne")print(" Application par Laurent Petitprez (site2wouf.fr)")print()# Étape 1 : Lire les fichiers d'entréelignes_graphe=lire_graphe()lignes_alignements=lire_alignements()# Étape 2 : Extraire les segments et les pointssegments=extraire_segments(lignes_graphe)points=extraire_points(segments)# Étape 3 : Identifier les triangles platstriangles_plats=identifier_triangles_plats(lignes_alignements)# Étape 4 : Compter les triangles validestriangles=compter_triangles(points,segments,triangles_plats)# Étape 5 : Afficher les résultatsafficher_resultats(points,segments,lignes_alignements,triangles)if__name__=="__main__":main()
Mode d'emploi
Cette application compte le nombres de (vrais) triangles tracés dans une figure donnée.
Elle prend en compte le fichier graphe.txt qui contient des lignes de la forme ABCD pour signifier que les segment [AB] [AC] et [AD] sont tracés et éventuellement alignement.txt qui contient des lignes de la forme ABCD pour signifier que A,B,C et D sont alignés.
Revenons aux exemples.
1. Le quadrilatère et ses diagonales
Figure : Quadrilatère ABCD avec ses diagonales [AC] et [BD] sécantes en E
Après avoir construit les fichiers graphe.txt et alignements.txt qui vont bien, Python nous livre son résultat :
🔍 Dénombrement de triangles - Version moderne
Application par Laurent Petitprez (site2wouf.fr)
2. La figure complexe du départ.
Figure : la figure qui est à l'origine de cette page.
Et un extrait de l'analyse de notre ami Python qui vous donne enfin la réponse !
🔺 Nombre de vrais triangles : 37
📋 Liste des triangles :
AEG AEM AGM AGO AGU AMO AMU EGI EGM EGO EGS EGT EGU EIM EIO EIR EMO EMR EMS EMU EOR EOS EOT EST GIM GIO GIR GMO GMR GMS GMT GOR GOU MOSMOT MOU MST
Je vous laisse vous convaincre qu'on a les mêmes résultats en utilisant l'application interactive! 😉
Pensez à copier le contenu des fichiers .txt.
📦 Autres ressources : Python apprendre par l'exemple
Partager :