Dans cet exercice nous allons représenter des objets et calculs géométriques simples en coordonnées entières. Utilisez des annotations de types : int, -> None, -> int et : Tuples[int ...] dès que possible. Testez régulièrement la consistance de ces types avec mypy fichier.py.
Implémenter une classe Cercle avec comme attributs un rayon rayon et les coordonnées x et y de son centre. Par exemple on pourra instancier un cercle avec mon_cercle = Cercle(5, (3,1))
Dans la classe Cercle, implémenter une propriété aire dépendante du rayon qu’on peut appeler avec mon_cercle.aire.
Implémenter une classe Cylindre, fille de Cercle, qui est caractérisée par un rayon rayon, une hauteur hauteur et des coordonnées x, y et z. On écrira le constructeur de Cylindre en appelant le constructeur de Cercle.
Dans la classe Cercle, implémenter une méthode intersect qui retourne True ou False suivant si deux cercles se touchent. Exemple d’utilisation : c1.intersect(c2)
Surcharger la méthode intersect pour la classe Cylindre, en se basant sur le résultat de la méthode de la classe mère.
from typing import Tuple
from math import sqrt
class Cercle:
def __init__(self, rayon: int, coord_centre: Tuple[int, int]=(0,0) ) -> None:
self.centre: Tuple[int, ...] = coord_centre
self.r: int = rayon
@property
def aire(self) -> float:
return 3.1415 * self.r * self.r
def intersect(self, second_cercle) -> bool:
somme_des_rayons: int = self.r + second_cercle.r
distance_des_centres: float = sqrt(
(self.centre[0] - second_cercle.centre[0])**2
+ (self.centre[1] - second_cercle.centre[1])**2
)
return somme_des_rayons >= distance_des_centres
class Cylindre(Cercle):
def __init__(self, rayon: int, hauteur: int, coord_centre: Tuple[int, int, int]=(0, 0, 0) ) -> None:
super().__init__(rayon)
self.centre: Tuple[int, ...] = coord_centre
self.hauteur: int = hauteur
def intersect(self, second_cylindre) -> bool:
cercles_intersects: bool = super().intersect(second_cylindre)
somme_des_hauteurs: int = self.hauteur + second_cylindre.hauteur
distance_z_des_centres: int = abs(self.centre[2] - second_cylindre.centre[2])
hauteur_intersects: bool = somme_des_hauteurs / 2 >= distance_z_des_centres
return cercles_intersects and hauteur_intersects
mon_cercle = Cercle(5, (3,1))
mon_cylindre = Cylindre(10,8,(-2,-6,-1))
mon_cercle2 = Cercle(5, (10,20))
mon_cylindre2 = Cylindre(5,10,(1,-2,4))
print(mon_cercle.centre)
print(mon_cercle.aire)
print(mon_cylindre.centre)
print(mon_cylindre.aire)
print(mon_cercle.intersect(mon_cercle2))
print(mon_cylindre.intersect(mon_cylindre2))