def initialisation_affichage(self): """ Affiche les paramètres de la simulation --- """ x = 1 for clee in self.clees: pygame.draw.line(self.ecran, self.color_dict[clee], (1700, 175 + self.DELTA * x), (1800, 175 + self.DELTA * x), 2) centrer_texte(self.ecran, self.police, " ".join(clee.split("_")), FG, 300, 50, 130 + self.DELTA * x, 1600) x += 1
def mettre_a_jour_monde(self): """ Met à jour les informations mondiales --- """ # On change la barre d'information creer_masque(0, 1550, 400, 120, BG, self.ecran) afficher_texte(self.ecran, "Monde", (1600, 30), 60, 300, 80) self.mettre_a_jour_information_monde() # On change le titre du grahique creer_masque(650, self.GAUCHE - 5, self.LARGEUR, 30, BG, self.ecran) centrer_texte(self.ecran, self.police, f"Evolution mondiale", FG, self.LARGEUR, 30, 650, self.GAUCHE - 5)
def mettre_a_jour_information_monde(self): """ Affiche les valeurs mondiales --- """ # On change la barre d'information creer_masque_information(self.nb_param, self.ecran) centrer_texte(self.ecran, self.police_donnee, f"{self.N}", FG, 300, 50, 160, 1600) x = 1 for clee in self.param_dict_monde: if clee not in self.liste_noire: centrer_texte(self.ecran, self.police_donnee, f"{int(self.param_dict_monde[clee][-1])}", FG, 300, 40, 175 + self.DELTA * x, 1600) x += 1
def run(self): """ Lance la simulation et l'affichage du graphique --- """ # Affiche les pays for c in self.gbdd.liste_pays: c.afficher(self.ecran) # Affiche mes textes centrer_texte(self.ecran, self.police, "Population de départ", FG, 300, 50, 130, 1600) self.ecran.blit(self.police.render("Épidémie de COVID-19", True, FG), (20, 0)) # Récupère les modèles et initialise la simulation self.models = self.gbdd.liste_modeles # On charge les pays self.initialisation_modeles() # On charge les donées du monde self.mettre_a_jour_monde() # On affiche les éléments qui ne bougeront jamais self.initialisation_affichage() x = 1 # On récupère les données du premier jour self.generer_donnee(x) while x < self.nb_iterations[self.pays_pour_date]: # On ajoute un jour à l'abcsisse self.y.append(len(self.y)) # On récupère les données du jour self.generer_donnee(x) # Met à jour les données associée à la position de la souris sur le graphique si elle y est self.valeur_sur_graphique() # Affiche soit les donnée du pays soit celles du monde if self.sur_pays: self.mettre_a_jour_information_pays() else: self.mettre_a_jour_information_monde() # Si on peut construire un graphique, on le fait if len(self.param_dict[self.num_model][self.clees[0]]) >= 2: # Si on est sur un pays if self.sur_pays: self.afficher_pays() # Sinon on affiche le monde else: self.afficher_monde() pygame.display.update() # On passe au jour suivant x += 1 # On se déconnecte de la base de données, puisque tout a été chargé self.gbdd.fermer()
def mettre_a_jour_information_pays(self): """ Affiche les valeurs du pays sélétionnné --- """ # On change la barre d'information creer_masque_information(self.nb_param, self.ecran) model = self.models[self.num_model] # On affiche la population du monde centrer_texte(self.ecran, self.police_donnee, f"{model.N}", FG, 300, 50, 160, 1600) x = 1 for clee in model.param_dict: if not clee in self.liste_noire: # On affiche la valeur du monde associée à la clée centrer_texte(self.ecran, self.police_donnee, f"{int(model.param_dict[clee]['value'])}", FG, 300, 40, 175 + self.DELTA * x, 1600) x += 1 return model
def valeur_sur_graphique(self): """ Affiche les valeurs du graphique à la position de la souris --- résultat : - int, int """ # Si un masque doit être créé pour réécrire les valeur au point de la souris if self.mettre_masque: creer_masque(600, 10, 200, 70, BG, self.ecran) self.mettre_masque = False # la position de la souris sur l'écran x, y = pygame.mouse.get_pos() if self.sur_pays: # Si la souris est sur le graphique pays if dans_rect(self.BORD_GRAPHIQUE, x, y) and len( self.param_dict_monde): # On convertit l'abcsisse en un entier qui sera le numéro associé à la date numero_date = int( (x - self.BORD_GRAPHIQUE[0]) * self.COEF_LARGEUR * len(self.param_dict_monde[self.clees[0]])) # Si le numéro est plus grand que les dates existantes if numero_date >= len(self.models[self.num_model].date): numero_date = -1 # On affiche la date centrer_texte( self.ecran, self.police_donnee, f"Date : {self.models[self.num_model].date[numero_date]}", FG, 150, 50, 600, 15) # On affiche la valeur centrer_texte( self.ecran, self.police_donnee, "Valeur : {:.2e}".format( int((self.BORD_GRAPHIQUE[1] - y) * self.COEF_HAUTEUR * max([ max(self.param_dict[self.num_model][x]) for x in self.param_dict[self.num_model] ]))), FG, 150, 50, 630, 15) self.mettre_masque = True else: # Si la souris est sur le graphique mondial if dans_rect(self.BORD_GRAPHIQUE, x, y) and len( self.param_dict_monde): # On convertit l'abcsisse en un entier qui sera le numéro associé à la date numero_date = int( (x - self.BORD_GRAPHIQUE[0]) * self.COEF_LARGEUR * len(self.param_dict_monde[self.clees[0]])) # Si le numéro est plus grand que les dates existantes if numero_date >= len(self.liste_date): numero_date = -1 # On affiche la date centrer_texte(self.ecran, self.police_donnee, f"Date : {self.liste_date[numero_date]}", FG, 150, 50, 600, 15) # On affiche la valeur centrer_texte( self.ecran, self.police_donnee, "Valeur : {:.2e}".format( int((self.BORD_GRAPHIQUE[1] - y) * self.COEF_HAUTEUR * max([ max(self.param_dict_monde[x]) for x in self.clees ]))), FG, 150, 50, 630, 15) self.mettre_masque = True return x, y
def changer_pays(self, numero_pays): """ Change le graphique du pays donnés --- paramètres : - numero_pays (int) le numéro du pays donné """ # Si le pays est dans la base de données if numero_pays < len(self.liste_tag): # On récupère le tag et le pays correspondant tag = self.liste_tag[numero_pays] a = [ n for n in range(len(self.models)) if self.models[n].pays.tag == tag ] # L'affichage doit désormais afficher les données de ce pays self.pays_selectione = numero_pays # Si le pays a été trouvé if len(a) > 0: self.num_model = a[0] # On met à jour l'intitulé du graphique creer_masque(650, self.GAUCHE - 5, self.LARGEUR, 30, BG, self.ecran) centrer_texte( self.ecran, self.police, f"Evolution locale ({self.models[self.num_model].pays.nom})", FG, self.LARGEUR, 30, 650, self.GAUCHE - 5) # On met à jour la barre d'informations self.mettre_a_jour_information_pays() # Si on a au moins deux points, on peut afficher les données if len(self.param_dict[self.num_model][self.clees[0]]) >= 2: self.afficher_pays() # On "efface" la barre d'information creer_masque(self.DIST_HAUT + 10, self.GAUCHE - 80, 100, self.HAUTEUR - self.MARGE, BG, self.ecran) creer_masque(self.DIST_HAUT - 10, self.GAUCHE + 25, 5, self.HAUTEUR - self.MARGE, BG, self.ecran) # Cherche la valeur maximale pour avoir la hauteur maximale du graphique mx = max([ max(self.param_dict[self.num_model][x]) for x in self.param_dict[self.num_model] ]) # On affiche les traits sur le graphique et on ajoute le nombre à côté if mx > 0: x_coord = echelloner_valeur(0, mx, 10) dx = self.H / mx for x in x_coord: form = "{:.2e}".format(int(x)) w = self.police_donnee.size(form)[0] Y = self.HAUT - int(x * dx) pygame.draw.line( self.ecran, FG, (self.MARGE + self.GAUCHE, Y + self.DIST_HAUT), (self.MARGE - 5 + self.GAUCHE, Y + self.DIST_HAUT), 2) self.ecran.blit( self.police_donnee.render(form, True, FG), ((self.MARGE - w) + self.GAUCHE - 10, Y - 10 + self.DIST_HAUT)) # Par défaut on affiche le monde else: if not self.sur_pays: self.retour_monde()