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