# -*- coding: utf-8 -*-
"""
REPRÉSENTATION SPATIALE ET TEMPORELLE D'UNE ONDE PROGRESSIVE

Étienne Thibierge
http://www.etienne-thibierge.fr/

Février 2020
"""

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim


plt.close("all")


### Paramètres de la vidéo
duree = 12  # durée en secondes
ips   = 24  # images par seconde
nb_images = duree*ips   # nbre total d'image


### Paramètres des figures
x_min = 0
x_max = 100

t_min = 0
t_max = 10

y_min = -2
y_max = 7

### Création de l'onde
def onde(x,t):
    c = x_max/t_max
    u = x - c*t
    xi = 6*np.exp(-u**2/30) - 2*np.exp(-(u+8)**2/30)    
    return xi

x = np.linspace(x_min,x_max,200)
x_capteur = 50

### Création de la figure sur laquelle se fait l'animation
fig = plt.figure(figsize=(15,5))
fig.subplots_adjust(hspace=0.4)

figX = fig.add_subplot(121)
plt.xlim(x_min, x_max)
plt.ylim(y_min,y_max)
plt.xlabel(r'x (cm)')
plt.ylabel(r"Hauteur d'eau (cm)")
plt.axvline(x=x_capteur,ls='dotted',color='r')
plt.text(2.5,6.15, r'Film de la vague', fontsize=14, color='b')

figT = fig.add_subplot(122)
plt.xlim(t_min, t_max)
plt.ylim(y_min,y_max)
plt.xlabel(r't (s)')
plt.ylabel(r"Hauteur d'eau (cm)")
plt.text(0.25,6.15, r'Signal du capteur à x = '+str(x_capteur)+' cm', fontsize=14, color='r')

### Mise en forme extérieure à la boucle pour effacement entre chaque image
lineX, = figX.plot([], [], '-', color='b')
lineT, = figT.plot([], [], '-', color='r')
lineCapteur, = figX.plot([],[],'or')
line = [lineX, lineT, lineCapteur]

def animate(i):
    # i est le numéro de l'image dans le film
    t = i/ips
    
    ### Construction de l'allure de la corde à l'instant t
    xi_space = onde(x,t)
    line[0].set_data(x, xi_space)
    
    ### Positionnement du capteur
    xi_capteur = onde(x_capteur,t)
    line[2].set_data(x_capteur,xi_capteur)
    
    ### Construction du chronogramme vu par le capteur
    t_capteur = np.linspace(0,t,200)
    chronogramme = onde(x_capteur,t_capteur)
    line[1].set_data(t_capteur,chronogramme)
    
    return line

### Pour démarrer et arrêter l'animation à chaque clic
anim_running = True
def onClick(event):
    global anim_running
    if anim_running:
        film.event_source.stop()
        anim_running = False
    else:
        film.event_source.start()
        anim_running = True
fig.canvas.mpl_connect('button_press_event', onClick)

### Génération de l'animation
#today = time.strftime("%x")
#fig.text(0.02,.95, r'(C) Étienne Thibierge ' + today, fontsize=12)

film = anim.FuncAnimation(fig, animate, frames=nb_images, interval=20, repeat=True)
#film.save('video_o2_ondes_repr-onde-progr.mp4', fps=ips, codec="libx264",bitrate=-1)	# Sauvegarde du film


plt.show()