diff --git a/TD1/correction/code/formes.py b/TD1/correction/code/formes.py
new file mode 100755
index 0000000000000000000000000000000000000000..b010707d7ad2a5847c630babc695437e8419f47d
--- /dev/null
+++ b/TD1/correction/code/formes.py
@@ -0,0 +1,85 @@
+class Forme:
+    def __init__(self, x, y):
+        self.__x = x
+        self.__y = y
+    
+    def get_pos(self):
+        return self.__x, self.__y
+    
+    def set_pos(self, x, y):
+        self.__x = x
+        self.__y = y
+    
+    def translation(self, dx, dy):
+        self.__x += dx
+        self.__y += dy
+
+class Rectangle(Forme):
+    def __init__(self, x, y, l, h):
+        Forme.__init__(self, x, y)
+        self.__l = l
+        self.__h = h
+    
+    def __str__(self):
+        return f"Rectangle d'origine {self.get_pos()} et de dimensions {self.__l}x{self.__h}"
+    
+    def get_dim(self):
+        return self.__l, self.__h
+    
+    def set_dim(self, l, h):
+        self.__l = l
+        self.__h = h
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return X <= x <= X + self.__l and \
+               Y <= y <= Y + self.__h
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos(min(x0, x1), min(y0, y1))
+        self.__l = abs(x0 - x1)
+        self.__h = abs(y0 - y1)
+
+class Ellipse(Forme):
+    def __init__(self, x, y, rx, ry):
+        Forme.__init__(self, x, y)
+        self.__rx = rx
+        self.__ry = ry
+    
+    def __str__(self):
+        return f"Ellipse de centre {self.get_pos()} et de rayons {self.__rx}x{self.__ry}"
+    
+    def get_dim(self):
+        return self.__rx, self.__ry
+    
+    def set_dim(self, rx, ry):
+        self.__rx = rx
+        self.__ry = ry
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return ((x - X) / self.__rx) ** 2 + ((y - Y) / self.__ry) ** 2 <= 1
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos((x0 + x1) // 2, (y0 + y1) // 2)
+        self.__rx = abs(x0 - x1) / 2
+        self.__ry = abs(y0 - y1) / 2
+
+class Cercle(Ellipse):
+    def __init__(self, x, y, r):
+        Ellipse.__init__(self, x, y, r, r)
+    
+    def __str__(self):
+        return f"Cercle de centre {self.get_pos()} et de rayon {self.get_dim()}"
+    
+    def get_dim(self):
+        return Ellipse.get_dim(self)[0]
+    
+    def set_dim(self, r):
+        Ellipse.set_dim(self, r, r)
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        r = min(abs(x0 - x1), abs(y0 - y1)) / 2
+        self.set_dim(r)
+        self.set_pos(round(x0 + r if x1 > x0 else x0 - r),
+                     round(y0 + r if y1 > y0 else y0 - r))
diff --git a/TD1/correction/code/formes_avec_dessin.py b/TD1/correction/code/formes_avec_dessin.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9717a60503a24884b4750dff75ba6d07c413c90
--- /dev/null
+++ b/TD1/correction/code/formes_avec_dessin.py
@@ -0,0 +1,125 @@
+class Forme:
+    def __init__(self, x, y):
+        self.__x = x
+        self.__y = y
+        
+        self.__dessins = []
+    
+    def get_pos(self):
+        return self.__x, self.__y
+    
+    def set_pos(self, x, y):
+        self.__x = x
+        self.__y = y
+    
+    def translation(self, dx, dy):
+        self.__x += dx
+        self.__y += dy
+        
+    def add_dessin(self,d):
+        self.__dessins.append(d)
+    
+    def del_dessin(self,d):
+        self.__dessins.remove(d)
+
+    def print_dessins(self):
+        print("Liste des dessins de la forme : ")
+        for d in self.__dessins:
+            print(d.get_nom())
+
+class Rectangle(Forme):
+    def __init__(self, x, y, l, h):
+        Forme.__init__(self, x, y)
+        self.__l = l
+        self.__h = h
+    
+    def __str__(self):
+        return f"Rectangle d'origine {self.get_pos()} et de dimensions {self.__l}x{self.__h}"
+    
+    def get_dim(self):
+        return self.__l, self.__h
+    
+    def set_dim(self, l, h):
+        self.__l = l
+        self.__h = h
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return X <= x <= X + self.__l and \
+               Y <= y <= Y + self.__h
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos(min(x0, x1), min(y0, y1))
+        self.__l = abs(x0 - x1)
+        self.__h = abs(y0 - y1)
+
+class Ellipse(Forme):
+    def __init__(self, x, y, rx, ry):
+        Forme.__init__(self, x, y)
+        self.__rx = rx
+        self.__ry = ry
+    
+    def __str__(self):
+        return f"Ellipse de centre {self.get_pos()} et de rayons {self.__rx}x{self.__ry}"
+    
+    def get_dim(self):
+        return self.__rx, self.__ry
+    
+    def set_dim(self, rx, ry):
+        self.__rx = rx
+        self.__ry = ry
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return ((x - X) / self.__rx) ** 2 + ((y - Y) / self.__ry) ** 2 <= 1
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos((x0 + x1) // 2, (y0 + y1) // 2)
+        self.__rx = abs(x0 - x1) / 2
+        self.__ry = abs(y0 - y1) / 2
+
+class Cercle(Ellipse):
+    def __init__(self, x, y, r):
+        Ellipse.__init__(self, x, y, r, r)
+    
+    def __str__(self):
+        return f"Cercle de centre {self.get_pos()} et de rayon {self.get_dim()}"
+    
+    def get_dim(self):
+        return Ellipse.get_dim(self)[0]
+    
+    def set_dim(self, r):
+        Ellipse.set_dim(self, r, r)
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        r = min(abs(x0 - x1), abs(y0 - y1)) / 2
+        self.set_dim(r)
+        self.set_pos(round(x0 + r if x1 > x0 else x0 - r),
+                     round(y0 + r if y1 > y0 else y0 - r))
+
+class Dessin:
+    def __init__(self,n):
+        self.__nom = n
+        self.__formes = []
+
+    def get_nom(self):
+        return self.__nom
+
+    def add_forme(self,f):
+        self.__formes.append(f)
+        f.add_dessin(self)
+        
+    def del_forme(self,position):
+        f = self.__formes.pop(position)
+        f.del_dessin(self)
+
+    def print_formes(self):
+        print('--- Dessin ---')
+        for f in self.__formes:
+            print(f)
+
+    def __str__(self):
+        s = '--- Dessin (avec print) ---'
+        for f in self.__formes:
+            s += '\n' + str(f)
+        return s
\ No newline at end of file
diff --git a/TD1/correction/code/test_formes.py b/TD1/correction/code/test_formes.py
new file mode 100755
index 0000000000000000000000000000000000000000..171840f6290ef94f6a718c39381446c3f96d05e0
--- /dev/null
+++ b/TD1/correction/code/test_formes.py
@@ -0,0 +1,33 @@
+from formes import *
+
+def test_Rectangle():
+    r = Rectangle(10, 20, 100, 50)
+    str(r)
+    assert r.contient_point(50, 50)
+    assert not r.contient_point(0, 0)
+    r.redimension_par_points(100, 200, 1100, 700)
+    assert r.contient_point(500, 500)
+    assert not r.contient_point(50, 50)
+
+def test_Ellipse():
+    e = Ellipse(60, 45, 50, 25)
+    str(e)
+    assert e.contient_point(50, 50)
+    assert not e.contient_point(11, 21)
+    e.redimension_par_points(100, 200, 1100, 700)
+    assert e.contient_point(500, 500)
+    assert not e.contient_point(101, 201)
+
+def test_Cercle():
+    c = Cercle(10, 20, 30)
+    str(c)
+    assert c.contient_point(0, 0)
+    assert not c.contient_point(-19, -9)
+    c.redimension_par_points(100, 200, 1100, 700)
+    assert c.contient_point(500, 500)
+    assert not c.contient_point(599, 500)
+
+if __name__ == '__main__':
+    test_Rectangle()
+    test_Ellipse()
+    test_Cercle()
diff --git a/TD1/correction/code/test_formes_avec_dessin.py b/TD1/correction/code/test_formes_avec_dessin.py
new file mode 100644
index 0000000000000000000000000000000000000000..343b02cffd73bf486a1ea1a6667adb8323885668
--- /dev/null
+++ b/TD1/correction/code/test_formes_avec_dessin.py
@@ -0,0 +1,68 @@
+from formes_avec_dessin import *
+
+def test_Rectangle():
+    r = Rectangle(10, 20, 100, 50)
+    str(r)
+    assert r.contient_point(50, 50)
+    assert not r.contient_point(0, 0)
+    r.redimension_par_points(100, 200, 1100, 700)
+    assert r.contient_point(500, 500)
+    assert not r.contient_point(50, 50)
+
+def test_Ellipse():
+    e = Ellipse(60, 45, 50, 25)
+    str(e)
+    assert e.contient_point(50, 50)
+    assert not e.contient_point(11, 21)
+    e.redimension_par_points(100, 200, 1100, 700)
+    assert e.contient_point(500, 500)
+    assert not e.contient_point(101, 201)
+
+def test_Cercle():
+    c = Cercle(10, 20, 30)
+    str(c)
+    assert c.contient_point(0, 0)
+    assert not c.contient_point(-19, -9)
+    c.redimension_par_points(100, 200, 1100, 700)
+    assert c.contient_point(500, 500)
+    assert not c.contient_point(599, 500)
+    
+def test_Dessin():
+    # Partie pour aller plus loin : Creation et manipulation d'objets Dessin
+    
+    r = Rectangle(10, 20, 100, 50)
+    e = Ellipse(60, 45, 50, 25)
+    c = Cercle(10, 20, 30)
+    
+    print("Création d'un dessin A composé des trois formes")
+    d1 = Dessin("A")
+    d1.add_forme(r)
+    d1.add_forme(e)
+    d1.add_forme(c)
+    d1.print_formes()
+
+    print("Création d'un dessin B composé de l'ellipse et du cercle")
+    d2 = Dessin("B")
+    d2.add_forme(e)
+    d2.add_forme(c)
+    d2.print_formes()
+
+    print("Affichage des dessins auxquels les formes sont associées")
+    r.print_dessins()
+    e.print_dessins()
+    c.print_dessins()
+
+    print("Suppression de l'ellipse dans le dessin A")
+    d1.del_forme(1)
+    print(d1)
+
+    print("Affichage des dessins auxquels les formes sont associées")
+    r.print_dessins()
+    e.print_dessins()
+    c.print_dessins()
+
+if __name__ == '__main__':
+    test_Rectangle()
+    test_Ellipse()
+    test_Cercle()
+    test_Dessin()
diff --git a/TD1/correction/diagramme_classes_formes.png b/TD1/correction/diagramme_classes_formes.png
new file mode 100644
index 0000000000000000000000000000000000000000..0368318a11ea4296a45af7e69fe928c7d5df2f73
Binary files /dev/null and b/TD1/correction/diagramme_classes_formes.png differ
diff --git a/TD1/correction/diagramme_classes_formes_avec_dessin.png b/TD1/correction/diagramme_classes_formes_avec_dessin.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a1993089d4961025a34b24c9e1409f9c7aca18f
Binary files /dev/null and b/TD1/correction/diagramme_classes_formes_avec_dessin.png differ