import matplotlib.pyplot as plt
import numpy as np

def TraceTerrain():
    
    plt.plot([-11.9,11.9],[0,0],"-k");
    plt.plot([0,0],[0,0.914],"-r");
    plt.plot([-11.9,-11.9],[0,0.2],"-k");
    plt.plot([+11.9,+11.9],[0,0.2],"-k");
    plt.plot([-6.4,-6.4],[0,0.2],"-k");
    plt.plot([+6.4,+6.4],[0,0.2],"-k");
    
def courbe1():
    global h,s_1,s_2,traj,t,Pos0;
    # Quelques paramètres 
    g=9.81             # accélération pesanteur
    m=5.8e-2;          # Masse de la balle
    viscosite=0.0026;  # Viscosité de l'air
    mu=1e-4;           # coefficient de portance (effet magnus)
    e=0.8;             # coefficient de restitution au rebond
    V0=s_1.val;              # vitesse
    angle0=s_2.val/180*3.14;  # angle (ramené en radians)
     
    Vit0=[V0*np.cos(angle0),V0*np.sin(angle0)];   # Vecteur vitesse initiale

    x=Vit0[0]*t+Pos0[0];
    y=-g/2*t**2+Vit0[1]*t+Pos0[1];
#       
#(v*cos(a)*t-11.9);
#-10*t^2+v*sin(a)*t+0.5;
        
    return [x,y]
    
def courbe2():
    global h,s_1,s_2,s_3,visc,traj,t,Pos0;
    # Quelques paramètres 
    g=9.81             # accélération pesanteur
    m=5.8e-2;          # Masse de la balle
    viscosite=0.0026;  # Viscosité de l'air
    mu=1e-4;           # coefficient de portance (effet magnus)
    e=0.8;             # coefficient de restitution au rebond
    V0=s_1.val;              # vitesse
    angle0=s_2.val/180*3.14;  # angle (ramené en radians)
    spin=s_3.val;               # spin
    visco=visc*viscosite
    Vit0=[V0*np.cos(angle0),V0*np.sin(angle0)];   # Vecteur vitesse initiale
    
    pxr=[Pos0[0]];
    pyr=[Pos0[1]];
    vx=Vit0[0];
    vy=Vit0[1];
    
    dt=t[1]-t[0]; # pas de temps
    
    for i in range(0,len(t)):
        ax=(-0.5*visco*np.sqrt(vx**2+vy**2)*vx-mu*vy*spin)/m;
        ay=-g+(-0.5*visco*np.sqrt(vx**2+vy**2)*vy+mu*vx*spin)/m;
        vx=vx+ax*dt;
        vy=vy+ay*dt;
        pxr.append(pxr[i]+vx*dt+0.5*ax*dt**2)
        pyr.append(pyr[i]+vy*dt+0.5*ay*dt**2)
        if pyr[i+1]<0 :
            pyr[i+1]=-pyr[i+1] #rebond
            vy=-e*vy;
        
    return [pxr,pyr]

## Paramètres de simulation
Tmax=4;            # Temps de calcul de 4s
dt=0.01            # pas de temps
Pos0=[-13.9,0.914]     # vecteur position initiale 

## =======================================================
##        CODE INTERFACE GRAPHIQUE
## =======================================================
def chgt1(val):
    global c1,nb # Tracé de la courbe rouge (0 ou 1)
    nb+=1
    #print(c1)
    if nb%2==1:c1=1
    else:c1=0

def chgt2(val):
    global c2,nb2        # Tracé de la courbe bleu (0 ou 1)
    nb2+=1
    if nb2%2==1:c2=1
    else:c2=0

def chgtvis(val):
    # Prise en compte viscosité (0 ou 1)
    global visc,nb3
    nb3+=1
    if nb3%2==1:visc=1
    else:visc=0
    
def update_figure(val):
    global h,s_1,s_2,s_3,s_4,traj,t,c1,c2
    print("V= ",s_1.val,"  A= ",s_2.val,"  S=  ",s_3.val)
    v=s_1.val          # vitesse
    a=s_2.val/180*3.14 # angle (ramené en radians)
    s=s_3.val          # spin
   
    if c1 :
        [X,Y]=courbe1();
    else:
        [X,Y]=0*t,0*t;
    
    if c2 :
        [X2,Y2]=courbe2();
    else :
        [X2,Y2]=0*t,0*t;
    
    graph1.set_xdata(X) #MAJ tracé
    graph1.set_ydata(Y) #MAJ tracé
    graph2.set_xdata(X2) #MAJ tracé
    graph2.set_ydata(Y2) #MAJ tracé

#intialiation
t=np.linspace(0,10,1000)
X=np.linspace(0,10,1000)*0
Y=np.linspace(0,10,1000)*0
X2=np.linspace(0,10,1000)*0
Y2=np.linspace(0,10,1000)*0

c1,c2,visc=0,0,0
nb,nb2,nb3=0,0,0

#figure
close('all') #ferme les graphes précédents
#ajustement position graphe et plages des axes
subplots_adjust(left=0.15, bottom=0.25)
axis([-15, 15, -1, 10])
graph1, =plt.plot (X, Y,'r',label='Courbe 1') #graph, pour rafraichir
graph2, =plt.plot (X2, Y2,'b',label='Courbe 2') #graph, pour rafraichir
legend(loc=1)

TraceTerrain()

##graph, pour rafraichir
from matplotlib.widgets import Slider , CheckButtons #, RadioButtons inutilisé ici
#slider 1
axcolor = 'lightgoldenrodyellow'
ax_1 = plt.axes([0.1, 0.1, 0.3, 0.03], axisbg=axcolor)  #xG,yG,long,epaisseur barre jaune
s_1 = Slider(ax_1, "Vitesse (m/s)", 2, 100, valinit=20, valfmt='%i')
s_1.on_changed(update_figure) #fonction appelée si mouvement slider 

#slider  2
axcolor = 'lightgoldenrodyellow'
ax_2 = plt.axes([0.1, 0.05, 0.3, 0.03], axisbg=axcolor)  #xG,yG,long,epaisseur barre jaune
s_2 = Slider(ax_2,  "Angle (°)", -10, 80, valinit=30, valfmt='%i')
s_2.on_changed(update_figure) #fonction appelée si mouvement slider 

#slider  3
axcolor = 'lightgoldenrodyellow'
ax_3 = plt.axes([0.6, 0.1, 0.3, 0.03], axisbg=axcolor)  #xG,yG,long,epaisseur barre jaune
s_3 = Slider(ax_3,  "Spin (rad/s)", -10, 80, valinit=15, valfmt='%i')
s_3.on_changed(update_figure) #fonction appelée si mouvement slider 

#bouton  4
axcolor = 'lightgoldenrodyellow'
ax_4 = plt.axes([0.6, 0.05, .08, .04], axisbg=axcolor)  #xG,yG,long,epaisseur barre jaune
s_4 = Button(ax_4,  "Viscosité")
s_4.on_clicked(chgtvis)
s_4.on_clicked(update_figure) #fonction appelée si click


#bouton  5
axcolor = 'lightgoldenrodyellow'
ax_5 = plt.axes([0.7, 0.05, 0.08, 0.04], axisbg=axcolor)  #xG,yG,long,epaisseur barre jaune
s_5 = Button(ax_5,  "Courbes 1")
s_5.on_clicked(chgt1)
s_5.on_clicked(update_figure) #fonction appelée si click 

#bouton  6
axcolor = 'lightgoldenrodyellow'
ax_6 = plt.axes([0.8, 0.05, 0.08, 0.04], axisbg=axcolor)  #xG,yG,long,epaisseur barre jaune
s_6 =Button(ax_6,  "Courbes 2")
s_6.on_clicked(chgt2)
s_6.on_clicked(update_figure) #fonction appelée si click

update_figure(1)

## remplacer les boutons par des croix à cocher ...CheckButtons

