####### Modules ######

import matplotlib.pyplot as plt
import math as mt

######################

##### Algos ##########

# Exemple 1.1
def GrapheFibo(n:int) -> None :
    plt.figure()
    X = range(0,n)
    Y = [1,1]
    for k in range(n-2) : 	# Création de la liste des ordonnées
        Y = Y+[Y[-1]+Y[-2]]
    plt.plot(X,Y) 			# Création du graphe
    plt.show() 				# Affichage du graphe 

# Exemple 1.2
def Log() :
    X = [0.1+k/100 for k in range(0,191)]      	# Listes des abscisses sur ]0,2] pour un tracé "lisse"
    Y = [0.1] + [k*0.5 for k in range(1,5)] 	# Listes des abscisses sur ]0,2] pour un tracé "haché"
    fX =  [x**2*mt.log(x) for x in X] 	# Création des images de X par la fonction x|-> x^2*ln(x)
    fY = [y**2*mt.log(y) for y in Y]	# Création des images de Y par la même fonction 
    plt.plot(X,fX)       # Création du graphe "lisse"
    plt.plot(Y,fY)       # Création du graphe "haché"
    plt.show()           # Affichage du graphe "haché"
    


# Exemple 1.3
def f(x) :
    return(mt.exp(x)-x**3+x**2-x)

def Famille():
    X=[2*k/25 for k in range(0,51)] 	# Création d'une liste de points dans [0,4] 
    C=[mt.cos(x) for x in X] 
    S=[mt.sin(x) for x in X] 
    F=[f(x) for x in X] 
    plt.plot(X,C)        # Création graphe du cos
    plt.plot(X,S)        # Création graphe du sin
    plt.plot(X,F)        # Création graphe de f
    plt.show()           # Affichage de tous les graphes

# Exemple 1.5
def graphe(f : "function") -> None : 
	X = [k/100 for k in range(0,101)] 	# Abscisses dans [0,1] 
	FX = [f(x) for x in X] 
	plt.plot(X,FX)
	plt.show()

# Exempme 2.1
def TestAxe():
    commande=input("Paramètre de axis (equal, image, off, tight, ou rien.)\n\n")
    X = [k/20 for k in range(0,101)] 		# Abscisses dans [0,5]
    F = [f(x) for x in X]					# la fonction f définie au-dessus	
    plt.plot(X,F)                        # Création du graphe de f
    if commande!="" :
        plt.axis(commande)                  # Modification des axes
        plt.title("Paramètre : "+commande)  # Titre du graphe
    else :
        plt.title("Aucun paramètre")
    plt.show()                               # Affichage du graphe

# Exemple 2.2
def Style():
    X=[k/60 for k in range(0,301)]	# Abscisses dans [0,5] 
    couleurs=['b','g','r','m','c']      # Choix de couleurs bleu, gris, rouge, magenta et cyan
    style=[',','x','-.','o','|']        # Choix de style de pointillés et de points
    for k in range(1,6) :               # Création des différents graphes avec les styles et légendes
        C = [mt.cos(k*x) for x in X]
        plt.plot(X,C, couleurs[k-1]+style[k-1],label=f"$y=\cos({k}x)$")
    plt.title("Graphes de fonctions trigonométriques")
    S = [mt.sin(x) for x in X] 
    plt.plot(X,S, "k", linewidth=3, label="$y=\sin(x)$") 
    plt.legend()                         # Création de la légende
    plt.show()                           # Affichage du graphe
