# -*- coding: utf-8 -*-
"""
EFFET DE PEAU

É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")


### Période de l'onde (en secondes)
### seul paramètre à modifier
f = 1


T = int(1/(f*1e-2))

### Accélération de l'animation : fait simplement osciller l'onde plus vite
p = 2

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

t_min = 0
t_max = 2*T

y_min = -1.5
y_max = 1.5

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


delta = np.sqrt(1/f) 
### lgeur d'onde dans le vide c = .2
### elle vaut 1 pour T = 5

w = 2*np.pi/T
k = 2*np.pi/delta

### Création de l'onde
def onde(x,t):
    xi = np.cos(p*w*t - k*x) * np.exp(-k*x) # facteur 2 devant omega pour que ça aille plus vite !
    return xi

def enveloppe(x):
    return np.exp(-k*x)

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

### Création de la figure sur laquelle se fait l'animation
env = enveloppe(x)

fig = plt.figure(figsize=(14,8))

figX = fig.add_subplot(111)
plt.plot(x,env,'g--')
plt.plot(x,-env,'g--')
plt.xlim(x_min, x_max)
plt.ylim(y_min,y_max)
plt.xlabel(r'$x$ (unité arbitraire)' )
plt.ylabel(r"$E/E_0$")
plt.text(.1,1.15, r'Champ électrique', fontsize=14, color='b')

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

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 sommet
    x_sommet = p*w/k * (t - int(t/T)*T)
    line[1].set_data(x_sommet,onde(x_sommet,t))
    
    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)
plt.text(0.25,6.15, r'Signal du capteur à x = '+str(x_capteur)+' $\lambda_0$', fontsize=14, color='r')

### 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-OPH.mp4', fps=ips, codec="libx264",bitrate=-1)	# Sauvegarde du film


plt.show()