### Constuire une classe Carre qui prend en paramètre de son constructeur une valeur cote
### Définir les deux méthodes aire() et perimetre() qui retourne respectivement l'aire et le perimètre du carre

# Nom de la classe. Les parenthèses sont utilisés pour l'héritage (hors programme)
class Carre(): 
    
    # __init__ défini un constructeur de la classe, c'est une méthode qui est 
    # automatiquement appelée à la création (instanciation) d'un objet.
    def __init__(self, cote): 	
        # Le paramètre cote est local à la fonction, il n'existe pas en dehors. Tout autre variable créée dans la fonction sera aussi local. 
        # Pour concerver une variable dans un contexte plus large que la fonction, on utilise le mot clé self. 
        # Une variable créée avec le mot clé self sera sauvegardé dans l'instance de notre classe.
        self.cote = cote		
    
    # aire est une fonction défni dans notre classe, on parle de méthode de classe. 
    # On les reconnait au mot clé self en premier paramètre.
    def aire(self):				
        # On accède à la variable cote que nous avons créée dans le constructeur avec self.cote.
        return self.cote**2
       
    # Une deuxième méthode de classe.
    def perimetre(self):
        return 4*self.cote
    
c = Carre(5)					# Instanciation d'une classe Carre, notre instance a sont cote = 5
print(c.cote) # 5
print(c.perimetre()) # 20
print(c.aire()) # 25

### Constuire une classe Cercle qui prend en paramètre de son constructeur une valeur rayon
### Définir les deux méthodes aire() et perimetre() qui retourne respectivement l'aire du disque et le perimètre du cercle
###

import math

class Cercle():
    ...
    
c = Cercle(5)
print(c.rayon) # 5
print(c.perimetre()) # 31.41592653589793
print(c.aire()) # 78.53981633974483

### Constuire une classe Rectangle qui prend en paramètre de son constructeur deux valeurs, longueur et largeur. 
### Définir les deux méthodes aire() et perimetre() qui retourne respectivement l'aire et le perimètre du rectange
###

class Rectangle():
    ...
      
r = Rectangle(5,6)
print(r.longueur) # 5
print(r.largeur) # 6
print(r.aire()) # 30
print(r.perimetre()) # 22

### Constuire une classe TriangleRectangle qui prend en paramètre de son constructeur deux valeurs, cote1 et cote2, qui son les deux longeurs des côtés adjacents
### Définir les deux méthodes aire() et hypotenuse() qui retourne respectivement l'aire du triangle et le longueur de l'hypotenuse (théorème de Pythagore)
### Définir ensuite la méthode perimetre() qui retourne le périmètre du triangle.

import math

class TriangleRectangle():
    ...
    
    
t = TriangleRectangle(5,12)
print(t.cote1) # 5
print(t.cote2) # 12
print(t.aire()) # 30.0
print(t.hypotenuse()) # 13.0
print(t.perimetre()) # 30.0


### Créer une classe Point qui prend en paramètre de son constructeur ses deux coordonnées x et y.
### Définir la méthode distance() qui prend en paramètre un autre point et qui calcule la distance entre ces deux points 
### Rappel : la distance entre 2 points p1 et p2 est racine_carré( (p1.x - p2.x)^2 + (p1.y - p2.y)^2 )

import math

class Point():
    ...

p1 = Point(1,1)
p2 = Point(4,1)
p3 = Point(1,5)
p4 = Point(1,4)
print(p1.distance(p2)) # 3.0
print(p1.distance(p3)) # 4.0
print(p2.distance(p3)) # 5.0
print(p1.distance(p4)) # 3.0
print(p2.distance(p4)) # 4.242640687119285

### Créer une classe Triangle qui prend en paramètre de son constructeur trois Point p1, p2, p3 que vous avez défini a l'exercice précédent.
### Définir la méthode est_rectangle() qui retourne Vrai si le triangle est rectange et faux sinon
### Conseil : Calculer les carrés des 3 distances entre les points et regarder si la somme de 2 des carrés est égale au carré du troisième

class Triangle():
    ...
        

t1 = Triangle(p1, p2, p3)
t2 = Triangle(p1, p2, p4)
print(t1.est_rectangle()) #True
print(t2.est_rectangle()) #False
        

