import matplotlib.pyplot as plt
import numpy as np
import math


def TP():
  """EXAMPLE 1: comment dessiner des vecteurs et des points. Appuyez sur 'q' pour quitter un dessin."""
  f = np.array([6,6])
  s = np.array([5,0])
  draw_vector2D( vector=f, label='first', color='red' )
  draw_vector2D( vector=s, color='blue' )
  plt_run("demo 1")  #<------obligatoire a la fin de chaque dessin



  """EXAMPLE 2: comment dessiner des vecteurs et des points. Appuyez sur 'q' pour quitter un dessin."""
  p = np.array([0,1])
  draw_point2D( point=p, label='whatever', color='green' )
  plt_run("demo 2")  #<------obligatoire a la fin de chaque dessin



#########################################ci-dessous: tache 2##########################
  v1 = np.array([1,5])
  v2 = np.array([4,-5])
  v3 = np.array([-6,-1.3])
  q = v2 / np.linalg.norm(v2)

  draw_vector2D( vector=v1, label='v1', color='red')
  draw_vector2D( vector=v2, label='v2', color='green')
  draw_vector2D( vector=v3, label='v3', color='blue')
  draw_vector2D( vector=q, label='q', color='yellow')

  plt_run("tache 2")
#########################################ci-dessus: tache 2###########################




#########################################ci-dessous: tache 3##########################
  c = np.arange(-3, 3, 0.1)

  for i in c:
      draw_point2D( point=i*v1, color='green' )
  draw_vector2D( vector=v1, label='v1', color='red')

  plt_run("tache 3 (a)")


  c = np.arange(-2, 2, 0.1)
  d = np.arange(-2, 2, 0.1)

  for i in c:
      for j in d:
        draw_point2D( point=i*v1 + j*v2,color= 'red' )
  draw_vector2D( vector=v1, label='v1', color='red')
  draw_vector2D( vector=v2, label='v2', color='blue')

  plt_run("tache 3 (b)")
#########################################ci-dessus: tache 3###########################




#########################################ci-dessous: tache 4##########################
  v5 = np.array([-4,4])
  v5_proj_v1 = np.dot(v5, (v1 / np.linalg.norm(v1)) ) * (v1 / np.linalg.norm(v1))
  v5_orth = v5 - v5_proj_v1
  v5_ref_v1 = v5 - 2 * v5_orth

  draw_vector2D( vector=v1, label='v1',  color='blue')
  draw_vector2D( vector=v5, label='v5', color='blue')
  draw_vector2D( vector=v5_proj_v1, label='v5_proj_v1', color='red', width=0.006)
  draw_vector2D( vector=v5_orth, label='v5_orth', color='red', width=0.006)
  draw_vector2D( vector=v5_ref_v1, label='v5_reflected_v1', color='red', width=0.006)

  plt_run("tache 4")
#########################################ci-dessus: tache 4###########################




#########################################ci-dessous: tache 5##########################
  v6 = np.array([6,-2])
  v7 = np.array([7,-1])
  v6_unit = v6 / np.linalg.norm(v6)
  v7_normal = v7 - ( np.dot(v7, v6_unit) )*v6_unit
  v7_normal_unit = v7_normal / np.linalg.norm(v7_normal)
  print("dot(v7_normal_unit, v6_unit) = ", np.dot(v7_normal_unit, v6_unit))

  draw_vector2D( vector=v6, label='v6',color='blue')
  draw_vector2D( vector=v7, label='v7', color='blue')
  draw_vector2D( vector=v6_unit, label='v6_unit', color='red', width=0.006)
  draw_vector2D( vector=v7_normal_unit, label='v7_normal_unit', color='red', width=0.006)

  plt_run("tache 5")
#########################################ci-dessus: tache 5###########################













########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################
########Il n'est pas necessaire de lire ou de modifier le code sous cette ligne.##################

def plt_run(title=''):
  plt.gca().set_aspect('equal')
  plt.axis( (-8,8,-8,8) )
  plt.grid()
  plt.title(title)
  #figManager = plt.get_current_fig_manager()
  #figManager.window.showMaximized()
  plt.show()

def draw_point2D(*, point, label = '', color = 'black'):
  plt.plot(*point, color = color, marker='o')
  plt.text(*point, label, fontsize=15, color='black', ha='right')

def draw_vector2D(*, origin = np.array([0,0]), vector, color = 'black', label = '', width=0.003):
  plt.quiver(*origin, *vector, angles='xy', scale_units='xy', scale=1, width=width, color=color)
  plt.text(*(origin+1.1*vector), label, fontsize=15, color='black', ha='right')

def draw_line2D(*, normal = np.array([0.0,1.0]), color = 'black', label = '', width=0.001):
  l,u = -6.0, 6.0
  plt.plot([l, u], [-normal[0]*(l)/normal[1], -normal[0]*u/normal[1]], color=color, linestyle='-')

TP()






