
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots(figsize=(5, 2))

ax.set(xlim=(-0, 10), ylim=(-2.5, 2.5))
ax.set_xlabel('position ( m )')
ax.set_ylabel('amplitude')

# contient les valeurs des amplitudes des ondes en fonction de la 
# position à une date donnée
x_pos = []
amplitude_1 = []
amplitude_2 = []
amplitude_S = []

# paramètres de l'onde sinusoidale, fréquence , célérité et décalage
# en position des deux sources
freq     = 0.1
celerite = 0.20
DeltaX   = 0.25

# calcul de la nouvelle onde à la date t
# somme de deux ondes sinusoidale, une source est décalée de DeltaX
def onde(t):
    x_pos.clear()
    amplitude_1.clear()
    amplitude_2.clear()
    amplitude_S.clear()
    x = 0.0
    a_1 = 0
    a_2 = 0    
    while x < 10:
        x_pos.append(x)
        if t - x / celerite > 0:
             a_1 = np.sin( 2 * np.pi * freq *(t - x / celerite))
        else:
            a_1 = 0.0
        if t - (x + DeltaX) / celerite > 0:
            a_2 = np.sin(2 * np.pi * freq *(t - (x + DeltaX) / celerite))
        else:
            a_2 = 0.0 
        amplitude_1.append( a_1)
        amplitude_2.append( a_2)
        amplitude_S.append( a_1 + a_2 )
        x = x + 0.1

# calcul du premier tracé des ondes à t=0 secondes
onde(0)

# dessin des trois ondes
line_1 = ax.plot(x_pos, amplitude_1, color='r', lw=1)[0]
line_2 = ax.plot(x_pos, amplitude_2, color='b', lw=1)[0]
line_S = ax.plot(x_pos, amplitude_S, color='k', lw=1)[0]

# mise à jour du graphe des trois ondes lors de l'animation
def animate(i):
    onde(i) 
    line_1.set_ydata(amplitude_1)
    line_2.set_ydata(amplitude_2)
    line_S.set_ydata(amplitude_S)

# appel régulier de l'animation
anim = FuncAnimation(
    fig, animate, interval=100, frames=100)

fig.tight_layout()
plt.draw()
# sauvegarde d'une vidéo de l'animation
anim.save('interference_onde_sinusoidale.mp4')
plt.show()
