Bonjour !
Je travaille sur un programme Python dont le but est d'afficher une figure 3D d'une membrane vibrante. J'ai obtenu préalablement les coordonnées dans l'espace de certains points de la membrane. J'ai déjà réussi à afficher la figure en 3D à un instant fixé en utilisant la fonction .plot_trisurf pour passer d'un nuage de points à une surface.
J'essaie maintenant d'afficher une figure 3D dynamique mais j'ai beaucoup de mal. J'ai essayé de m'inspirer d'exemples pour faire mon programme mais je n'ai pas trouvé d'exemples correspondant à ma situation, où il faudrait combiner à la fois la 3D et gérer la fonction .plot_trisurf
En plus, afficher des figures en 3D est assez nouveau pour moi et je ne comprends pas exactement le rôle de chaque ligne dans mon code (donc j'ai du mal à savoir ce qui ne va pas)
Voilà mon code pour le graphique 3D à un instant donné (celui-ci fonctionne comme voulu) :
Voilà mon code adapté à une situation dynamique. Quand je lance le programme, la fenetre de plot s'ouvre mais reste vide : je pense que les calculs ne suivent pas ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 def graphe_freq_propre(X): #je note ici X, les arguments réellement utilisés n'ont pas d'importance dans le tracé mais uniquement dans le calcul des points Lx,Ly,Lz=liste_coordonnees(X) fig = plt.figure() ax = fig.gca(projection='3d') ax.plot_trisurf(Lx, Ly, Lz, cmap=cm.jet, linewidth=0.2) plt.show()
Est-il possible d'alléger les calculs que doit faire le programme, en utilisant une autre méthode que .plot_trisurf pour approximer une surface passant à travers les points ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 def graphe_freq_propre_dyn(f,frame,X): #f : fréquence // frame : nombre d'images cherchées omega = 2*pi*f #j'en ai besoin uniquement dans les calculs des coordonnées past=1/(f*frame) Lframex,Lframey,Lframez=[],[],[] #liste des coordonnées : une entrée = une image for i in range(frame): #calcul de toutes les coordonnées nécessaires Lx,Ly,Lz=liste_coordonnees(X) Lz=[cos(omega*past)*i for i in Lz] #fin du calcul des coordonnées, la dépendance temporelle de la fonction est en cos(omega*t) if i==0: #on stocke les coordonnées selon x et y qu'une fois (ne changent pas) Lframex+=Lx Lframey+=Ly Lframez.append(Lz) plt.ion() fig = plt.figure() ax = fig.gca(projection='3d') plt.show() for i in range (10) : #pour observer plus d'une période for j in range(frame): ax.plot_trisurf(Lframex, Lframey, Lframez[j], cmap=cm.jet, linewidth=0.2) plt.draw() time.sleep(0.5)
Ou existe-il un moyen de faire les calculs nécessaires pour plot_trisurf sans afficher directement le graphe (afin d'avoir un tracé fluide une fois tous les calculs fait, quitte à avoir un temps de calcul très grand ...) ?
Et surtout : comment pourrais-je adapter le code pour utiliser la fonction animation (qui est, je suppose, plus adaptée) ?
Merci pour votre temps et votre aide !![]()
Partager