diff --git "a/percolaci\303\263/simulacio_quadrat.py" "b/percolaci\303\263/simulacio_quadrat.py" index 09ea535c..9462e773 100644 --- "a/percolaci\303\263/simulacio_quadrat.py" +++ "b/percolaci\303\263/simulacio_quadrat.py" @@ -14,34 +14,49 @@ ########################################################################################################################## ########################################################################################################################## class ClusterWidget(Widget): - #Mètode constructor de la classe + # Mètode constructor de la classe def __init__(self, simulation=None, **kwargs): super().__init__(**kwargs) self.simulation = simulation - self.bind(size=self.update_canvas,pos=self.update_canvas) + #Amb aquesta funció identificarem el cluster que ha percolat i el pintarem de blanc + self.percolated_cluster = None + self.bind(size=self.update_canvas, pos=self.update_canvas) -########################################################################################################################## + ########################################################################################################################## - def update_canvas(self,*args): + def update_canvas(self, *args): self.canvas.clear() if self.simulation: with self.canvas: vertex_actius = self.simulation.busca_clusters() matriu_pintada = self.simulation.pintar_clusters(vertex_actius) n = len(matriu_pintada) - cell_size = self.width/n + # Así te aseguras de que los cuadrados de color no se salgan de la pantalla + cell_size = min(self.width/n, self.height/n) + + # Offset per centrar els quadrats. + x_offset = (self.width - n*cell_size)/2 + y_offset = (self.height - n*cell_size)/2 + for i in range(n): for j in range(n): - color = (0, 0, 0) if matriu_pintada[i, j] == 0 else (matriu_pintada[i, j] / len(vertex_actius), 0, 1) + #comprovem que tenim un índex de cluster de percolació inicialitzat (això ja implica que hi ha percolació al sistema) + if self.percolated_cluster is not None and matriu_pintada[i, j] == self.percolated_cluster: + color = (1, 1, 1) #pintem de color blanc el cluster que ha percolat. Això es veu amb la segona condició del if + + #aquí simplement estem pintant la matriu de negre si no es supera el llindar p i de colors si es supera + #(vèrtex no actiu i actiu respectivament) + else: + color = (0, 0, 0) if matriu_pintada[i, j] == 0 else (matriu_pintada[i, j] / len(vertex_actius), 0,1) Color(*color) - Rectangle(pos=(j * cell_size, self.height - (i + 1) * cell_size), size=(cell_size, cell_size)) - + Rectangle(pos=(x_offset + j*cell_size, y_offset + self.height - (i + 1)*cell_size), + size=(cell_size, cell_size)) ########################################################################################################################## ########################################################################################################################## -#part visual. Comença preguntant quina dimensió n volem i quina probabilitat p volem. -#Genera la matriu i la mostra +# part visual. Comença preguntant quina dimensió n volem i quina probabilitat p volem. +# Genera la matriu i la mostra class ClusterApp(App): def build(self): layout = BoxLayout(orientation='vertical') @@ -59,7 +74,7 @@ def build(self): generate_button = Button(text='Generate') generate_button.bind(on_press=self.generate_clusters) - #Botó per veure si hi ha percolació o no + # Botó per veure si hi ha percolació o no check_button = Button(text='Check Percolation') check_button.bind(on_press=self.check_percolation) @@ -68,37 +83,52 @@ def build(self): controls.add_widget(Label(text='Probability:')) controls.add_widget(self.p_input) controls.add_widget(generate_button) - #per verifica si hi ha percolació o no - controls.add_widget(check_button) # Agregar botón de verificación + # per verifica si hi ha percolació o no + controls.add_widget(check_button) layout.add_widget(controls) return layout -########################################################################################################################## + ########################################################################################################################## def generate_clusters(self, instance): n = int(self.n_input.text) p = float(self.p_input.text) self.simulation = ClassPercolacioQuadrat(n, p) self.cluster_widget.simulation = self.simulation + #inicialitzem l'index del cluster percolat a None (si no hem comprovat la percolació + #no podem saber si ha percolat o no) + self.cluster_widget.percolated_cluster = None self.cluster_widget.update_canvas() -########################################################################################################################## + ########################################################################################################################## def check_percolation(self, instance): if self.simulation: perc_n = self.simulation.percola() + if perc_n != -1: message = 'Ha percolat :)' + #Actualitzem el canvas per pintar de blanc el clsuter percolat + self.cluster_widget.percolated_cluster = perc_n + self.cluster_widget.update_canvas() + #Mostrem el missatge per pantalla + popup = Popup(title='Percolació', content=Label(text=message), size_hint=(None, None), size=(400, 200)) + popup.open() + else: message = 'No ha percolat :(' - popup = Popup(title='Percolació', content=Label(text=message), size_hint=(None, None), size=(400, 200)) - popup.open() + popup = Popup(title='Percolació', content=Label(text=message), size_hint=(None, None), size=(400, 200)) + popup.open() else: - popup = Popup(title='Error', content=Label(text='Has de generar una matriu abans!'), size_hint=(None, None), size=(400, 200)) + popup = Popup(title='Error', content=Label(text='Has de generar una matriu abans!'), size_hint=(None, None), + size=(400, 200)) popup.open() + print(perc_n) + + ########################################################################################################################## ##########################################################################################################################