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.

Attention: exécuter 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
%autoreload 2

ERREUR: numéro d’étudiant non spécifié!!!

Login étudiant Marc BUFFAT uid=137764122

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

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 Triangle.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)

Fonctions à valider

nbre de fonctions=  10
['exo510', 'exo511', 'exo512', 'exo513', 'exo514', 'exo515', 'exo516', 'exo517', 'exo518', 'exo519']
fonctions/methodes à écrire
['_eq_', 'barycentre', 'perimetre', 'coordbary', 'inside', 'translation', 'rotation', 'rayon', 'intersection', 'surface']
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])

Fonctions à valider

Exercise exo510 fonction à écrire: _eq_

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle et qui surcharge l'operateur égalité ==  (methode __eq__) pour tester si deux triangles sont confondus (à 1.e-05 près).
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo511 fonction à écrire: barycentre

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode barycentre qui renvoie le point barycentre du traingle.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo512 fonction à écrire: perimetre

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode perimetre qui renvoie le perimetre du triangle.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo513 fonction à écrire: coordbary

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode coordbary qui renvoie les coordonnes barycentriques d'un point P par rapport au triangle.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo514 fonction à écrire: inside

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode inside qui détermine si un point P est a l'intérieur ou non du triangle.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo515 fonction à écrire: translation

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode translation qui translate le triangle de dx et dy.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo516 fonction à écrire: rotation

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode rotation qui effectue une rotation par rapport a un point avec une angle en degré.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo517 fonction à écrire: rayon

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode rayon qui calcule le rayon du plus petit cercle contenant le triangle et centré au barycentre de celui-ci. (attention ce n'est pas le cercle circonscrit). 
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo518 fonction à écrire: intersection

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode intersection qui détermine si le triangle a une intersection non nulle avec un autre triangle.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    
Exercise exo519 fonction à écrire: surface

Ecrire une classe pour manipuler des triangles en 2D, à qui on fournit 3 points pour créer un triangle avec une methode surface qui renvoie la surface du triangle.
On passe le nom de la classe ainsi que le nom de la classe Point (comme définie dans la serie 500) pour la validation
    

8.5.3. classe Triangle#

%%bash
cat Triangle.py
import numpy as np
from Point import *
# classe Triangle
class Triangle(object):
    """creation d'un triangle dans l'espace cartesien"""
    def __init__(self,P1,P2,P3):
        ''' initialisation '''
        # attention on fait une copie des points !!!
        self.Pts = [P1.copy(),P2.copy(),P3.copy()]
        return
    def __str__(self):
        '''conversion chaine pour affichage'''
        return "Triangle:(%s,%s,%s)"%(self.Pts[0],self.Pts[1],self.Pts[2]) 
    def __eq__(self,T):
        '''test si le triangle est confondu avec T'''
        return
    def barycentre(self):
        '''calcul le point barycentre du triangle'''
        return
    def perimetre(self):
        '''calcul perimetre du triangle'''
        return
    def surface(self):
        '''calcul la surface du triangle'''
        return
    def coordbary(self,P):
        return
    def inside(self,P):
        '''test si le point P est à l intérieur du triangle'''
        return
    def translation(self,dx,dy):
        '''translation du triangle de dx,dy'''
        return
    def rotation(self,O,alpha):
        """rotation du triangle de alpha autour de O"""
        return
    def rayon(self):
        '''calcul le rayon du cercle contenant le triangle et centré au barycentre'''
        return
    def intersection(self,T):
        '''détermine si il y a une intersection non nulle avec le traingle T'''
        return 
    def plot(self,col='g'):
        '''tracer du triangle avec remplissage'''
        return
%autoreload 2
# test classe
from Point import Point
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)
Triangle:(Point:(0,0),Point:(1,0),Point:(0,1))

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

8.5.4.1. vérification#

8.5.4.2. test de validation#

8.5.5. calcul du barycentre (methode barycentre)#

8.5.5.1. vérification#

8.5.5.2. test de validation#

8.5.6. calcul du perimetre (methode perimetre)#

8.5.6.1. vérification#

8.5.6.2. Test de validation#

8.5.7. calcul de la surface (methode surface)#

8.5.7.1. vérification#

8.5.7.2. test de validation#

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

8.5.8.1. vérification#

8.5.8.2. test de validation#

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

8.5.9.1. vérification#

8.5.9.2. test de validation#

8.5.10. translation d’un triangle (translation)#

8.5.10.1. vérification#

%autoreload 2
from Triangle import *
## BEGIN SOLUTION
## END SOLUTION

8.5.10.2. test de validation#

8.5.11. rotation d’un triangle (rotation)#

8.5.11.1. vérification#

8.5.11.2. test de validation#

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#

8.5.12.2. test de validation#

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#

8.5.13.2. test de validation#

8.5.14. tracer de triangle#

tracer 2 triangles sur une figure

8.5.15. FIN#