# Effectuer la saisie pour créer la liste abs_bille #Exécuter cette cellule pour mettre la fonction Visualisation_Planche_Galton en mémoire from copy import deepcopy import matplotlib.pyplot as plt from matplotlib import animation, rc from IPython.display import HTML def Visualisation_Planche_Galton(Positions_billes, attente=3, Temps_total=5000, hauteur=8, resolution=80): ''' Fonction permettant la visualisation d'une chute de billes sur la planche de Galton Liste_billes: chaque élément est la liste des abscisses d'une bille (list) attente: attente entre chaque bille lachée: écart des ordonnées entre deux billes successives (int) Temps_total: Durée totale de visionnage en ms (int) hauteur: Hauteur du graphique en pouces (float) resolution: résolution en dpi (int) ''' #Duplication profonde de la liste des listes des abscisses Liste_billes=deepcopy(Positions_billes) N=max([len(b) for b in Liste_billes])-1 #hauteur de la planche (Attention: les listes ont normalement la même taille) M=len(Liste_billes)//2+1 #hauteur du réceptacle pour les billes #Réglages de la fenêtre d'affichage largeur=2*N*hauteur/(N+M+0.25) ; borne_x=N+1/2 plt.figure(num=0, figsize=(largeur,hauteur), dpi=resolution) ; fig,ax = plt.subplots(num=0) ax.set_xlim(( -borne_x,borne_x)) ; ax.set_ylim((-M-0.25, N)) ; ax.xaxis.set_ticks(range(-N,N+1)) plt.tick_params(axis = 'x', labelsize = 8) ; plt.yticks([], []) #taille des billes taille_bille=242//(N+M+0.25) #représentation de la planche de Galton list_x=[2*k-(L-1) for L in range(N+1) for k in range(L)] list_y=[N-L for L in range(N+1) for k in range(L)] Trace_Galton,= ax.plot(list_x,list_y, ls="none", marker=".",color="black") #Objet pour la représentation des billes descendantes Trace_billes,= ax.plot([], [], ls="none", marker="o",color="blue", markersize=taille_bille) #Objet pour la représentation des billes accumulées dans le réceptacle Trace_point_acc, = ax.plot([], [], ls="none", marker="o",color="blue", markersize=taille_bille) #Liste des effectifs de billes accumulées accumulation=[0 for x in range(-N,N+1)] #Initialisation des positions des billes b_x=[None for p in range(len(Liste_billes))] # liste des abscisses des billes à placer b_y=[None for p in range(len(Liste_billes))] # liste des ordonnées des billes à placer def init(): """ Fonction initialisant l'animation """ return (Trace_Galton,Trace_billes,Trace_point_acc,) def animate(i): """ Fonction définissant la i ème scène de l'animation """ #gestion des billes en descente for p in range(len(Liste_billes)): #pour chaque bille if Liste_billes[p] and i>=attente*p:#s'il reste des positions à traiter et qu'on a lâché la bille if len(Liste_billes[p])>1: #si ce n'est pas la dernière position b_x[p],b_y[p] = Liste_billes[p].pop(0),N-i+attente*p #on place la bille à sa position et on efface cette position elif -M+0.5*(accumulation[N+int(Liste_billes[p][0])]-1)