8.5. TP Manipulation de triangles en 2D#

nécessite la validation du notebook ClassPoint (classe Point)

vous devez écrire les fonctions dont le nom est fixé, mais dont vous devez spécifier les arguments en fonction de la question posée.

Chaque fonction validée rapporte 1 point

Attention: executer toutes les cellules depuis le début en utilisant le bouton run

%matplotlib inline
import os,sys
import numpy as np
import matplotlib.pyplot as plt
from validation.validation import check_function,liste_functions, info_function, info_etudiant
from IPython.display import Markdown, display
def printmd(string):
    display(Markdown(string))
# test si numero étudiant spécifier
# test si numero étudiant spécifier
try: NUMERO_ETUDIANT
except NameError: NUMERO_ETUDIANT = None 
if type(NUMERO_ETUDIANT) is not int :
    printmd("**ERREUR:** numéro d'étudiant non spécifié!!!")
    NOM,PRENOM,NUMERO_ETUDIANT = info_etudiant()
    #raise AssertionError("NUMERO_ETUDIANT non défini")
# parametres spécifiques
_uid_    = NUMERO_ETUDIANT 
_precis_ = 1.0e-5
printmd("**Login étudiant {} {} uid={}**".format(NOM,PRENOM,_uid_))
# recharge les modules
%load_ext autoreload

8.5.1. Objectif#

On se propose d’écrire une classe Python pour manipuler des triangles en 2D, en utilisant la classe Point précédente.

Nous allons utiliser l’éditeur de texte et l’interpréteur IPython de JupyterLab

Pour accéder à l’interface jupyerlab, entrée l’URL suivante dans le navigateur (ou cliquer sur le lien suivant)

  https://jupyter-exam.mecanique.univ-lyon1.fr/user/pxxxx/lab

où pxxxxx est votre numéro d’étudiant avec le premier chiffre remplacé par p (i.e. votre compte étudiant).

8.5.2. Classe Triangle en 2D#

8.5.2.1. Canvas de la classe Triangle#

Compléter la classe Triangle qui dans l’espace cartésien en 2D permet de définir un triangle à partir de 3 points.

Vous devez implémenter les méthodes définies dans cette classe et les valider soit dans le notebook soit en utilisant la commande test_exo pour valider la fonction func (correspondant au text exok)

     test_exo Traingle.py exok func 
S=['exo510', 'exo511', 'exo512', 'exo513', 'exo514','exo515','exo516', 'exo517', 'exo518','exo519']
Func=['']
Exos=liste_functions(S,_uid_)
Meth=['_eq_','barycentre','perimetre','coordbary','inside','translation','rotation','rayon','intersection','surface']
printmd("**Fonctions à valider**")
print("nbre de fonctions= ",len(Exos))
print(Exos)
print("fonctions/methodes à écrire")
print(Meth)
printmd("**Fonctions à valider**")
# definition des fonctions
for k in range(len(Exos)):
    print("Exercise {} fonction à écrire: {}".format(Exos[k],Meth[k]))
    info_function(Exos[k])

8.5.3. classe Triangle#

cat Triangle.py
# test classe
from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
P4=Point(1,1)
T1=Triangle(P1,P2,P3)
print(T1)

8.5.4. test égalité de 2 triangles (méthode eq )#

8.5.4.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
P4=Point(1,1)
T1=Triangle(P1,P2,P3)
T2=Triangle(P1,P4,P3)
print("T1==T1 ? ",T1==T1)
print("T1==T2 ? ",T1==T2)

8.5.4.2. test de validation#

exo = "exo510"
assert(check_function(Triangle,exo,Point))

8.5.5. calcul du barycentre (methode barycentre)#

8.5.5.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P2,P3)
print("barycentre T1:",T1.barycentre())

8.5.5.2. test de validation#

exo = "exo511"
assert(check_function(Triangle,exo,Point))

8.5.6. calcul du perimetre (methode perimetre)#

8.5.6.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P2,P3)
print("perimetre T1:",T1.perimetre())

8.5.6.2. Test de validation#

exo = "exo512"
assert(check_function(Triangle,exo,Point))

8.5.7. calcul de la surface (methode surface)#

8.5.7.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P2,P3)
print("surface T1:",T1.surface())

8.5.7.2. test de validation#

exo = "exo519"
assert(check_function(Triangle,exo,Point))

8.5.8. calcul des coordonnees barycentre d’un point P (methode coordbary)#

8.5.8.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P3,P2)
print(T1.coordbary(T1.barycentre()))

8.5.8.2. test de validation#

exo = "exo513"
assert(check_function(Triangle,exo,Point))

8.5.9. test si un point est dans le triangle (inside)#

8.5.9.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P3,P2)
P = T1.barycentre()
print(T1.inside(P))

8.5.9.2. test de validation#

exo = "exo514"
assert(check_function(Triangle,exo,Point))

8.5.10. translation d’un triangle (translation)#

8.5.10.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P3,P2)
print(T1)
T1.translation(1,1)
print(T1)

8.5.10.2. test de validation#

exo = "exo515"
assert(check_function(Triangle,exo,Point))

8.5.11. rotation d’un triangle (rotation)#

8.5.11.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P3,P2)
print(T1)
O = Point(0,0)
T1.rotation(O,90)
print(T1)

8.5.11.2. test de validation#

exo = "exo516"
assert(check_function(Triangle,exo,Point))

8.5.12. rayon du triangle (methode rayon)#

calculer le rayon du plus petit cercle contenant le triangle et centré au barycentre de celui-ci. (attention ce n’est pas le cercle circonscrit)

8.5.12.1. vérification#

from Triangle import *
P1=Point(1,2)
P2=Point(-1,2)
P3=Point(2,-1)
T1=Triangle(P1,P3,P2)
print(T1)
print("rayon:",T1.rayon())

8.5.12.2. test de validation#

exo = "exo517"
assert(check_function(Triangle,exo,Point))

8.5.13. test intersection avec un triangle (methode intersection)#

dificile: test si le triangle a une intersction non nulle avec un autre triangle. On utilisera en particulier la méthode rayon (pour éliminer des cas) et la méthode coordbary.

8.5.13.1. vérification#

from Triangle import *
P1=Point(0,0)
P2=Point(1,0)
P3=Point(0,1)
T1=Triangle(P1,P3,P2)
for i in range(10):
    dx = np.random.random()*2.0
    T2 = Triangle(P1,P3,P2)
    T2.translation(dx,0.0)
    print(dx,T1.intersection(T2))

8.5.13.2. test de validation#

exo = "exo518"
assert(check_function(Triangle,exo,Point))

8.5.14. tracer de triangle#

tracer 2 triangles sur une figure

from Triangle import *
## BEGIN SOLUTION
## END SOLUTION

8.5.15. FIN#