"""
Auteur : Maupu Grégory
Programme qui permet d'observer le lieu des points vec(MA).vec(MB) = 0
Le programme place les points vec(MA).vec(MB) > 0 et vec(MA).vec(MB) < 0
La frontière entre les 2 zones correspond au lieu cherché

Entrées : nombre de points et vitesse de l'animation
Sorties : Graphique avec des points
"""

from math import *
from pylab import *
from matplotlib import animation
from random import *

A =[0,0]
B = [10,0]

def produit_scalaire(x,y,x1,y1) :
    """
    Calcule produit scalaire de deux vecteurs u et v
    u(x,y) et v(x',y')
    renvoie xx'+yy'
    """
    return x*x1 + y*y1

def vecteur(x0,y0,x1,y1):
    """
    Calcule les coordonnées d'un vecteur connaissant celles des deux points
    """
    return x1 - x0, y1 - y0


# Génération de 100 points M aléatoire
# Si MA.MB > 0 en rouge
# Si MA.MB < 0 en bleu


n = int(input("Combien de points souhaitez-vous afficher ?"))
v = int(input("A quelle vitesse se déroule l'animation (en ms) ? "))

def liste_points():
    """
    Génére une liste aléatoire de points, uniquement les abscisses
    """    
    x = []
    for i in range(n) :
        x.append(uniform(-1,11))
    return x

# Animation

liste = liste_points()


fig, ax = subplots()

xdata, ydata = [],[],
xdata1, ydata1 = [], [],
xdata2, ydata2 = [], [],

line, = plot([],[],'b.')
line1, = plot([],[], 'r.')
line2, = plot([], [], 'g.')

x=linspace(-10,20,10)
xlim(-10,20)
ylim(-10,10)

legende = ax.text(0.02,0.90,'',transform=ax.transAxes)

def init() :
    ax.set_xlim(-10,20)
    ax.set_ylim(-10,10)
    return line, line1, line2,legende

def animate(frame) :
   y = uniform(-6,6)
   AM = vecteur(A[0],A[1],frame,y)
   BM = vecteur(B[0],B[1], frame,y)
   p = produit_scalaire(AM[0],AM[1],BM[0],BM[1])
   if abs(p) < 1 :
       xdata2.append(frame)
       ydata2.append(y)
       line2.set_data(xdata2,ydata2)
   elif p < 0 :
       xdata.append(frame)
       ydata.append(y)
       line.set_data(xdata,ydata)
   elif p > 0 :
       xdata1.append(frame)
       ydata1.append(y)
       line1.set_data(xdata1,ydata1)
   k = len(xdata) + len(xdata1) + len(xdata2)  
   legende.set_text('Nombre de points :' + str(k))
   
   return line, line1, line2, legende

      

ani = animation.FuncAnimation(fig,animate,init_func=init, frames=liste,interval=v,blit=True,repeat=False)

show()
    
    




