// Solution de la série 3 sur le graphisme et la fonction plot

funcprot(0); // pour ne pas indiquer une redéfinition des fonctions

// Exercice 1
// ==========
// Simple exemple de l'utilisation de la fonction plot
ax1 = linspace(0, 7, 101);  // 101 points régulièrement espacés entre 0 et 7
ay1 = sin(ax1);
plot(ax1, ay1);

ax1b = 0:0.07:7;
disp(ax1b - ax1);


// Exercice 2
// ==========
// Paramètres possibles pour changer des tailles, styles et couleurs dans un graphique
scf(2);  // Dessinera dans la fenêtre graphique n° 2.
clf(2);  // Efface le contenu de la fenêtre n° 2.
ax2 = linspace(-20, 20, 400);  // points régulièrement espacés
ay2 = sin(ax2) ./ ax2;

plot( ax2, ay2..
      ,"color", [0, 0, 1].. // couleurs [r, g, b]  entre  0 et 1  ou une lettre "r", "g", "b", etc.
      ,"Thickness", 4..    // épaisseur du trait
      ,"LineStyle", ":".. // "-" ligne pleine, "--" traitillé, ":" pointillé, "-.", "none"
      ,"Visible", "on"..   // si on veut cacher une ligne, mettre "off"
      ); 

ax2b = linspace(-6*%pi, 6*%pi+1e-8, 25);  // points régulièrement espacés
ay2b = sin(ax2b) ./ ax2b;
plot( ax2b, ay2b, 'LineStyle', 'none'..
      ,"Marker", 'o'..  // "o", "x", "*", ".", "d"=diamond, "s"=square
      ,"MarkSize", 8 ..
      ,"MarkerFaceColor", 'r'.. // "r", "g", "b, "c", "m", "k"=black, "w"=white
      ,"MarkBackground", "m"..  // fond de la marque, = MarkerFaceColor
      ,"MarkForeground", "k"..  // bord
      );

// Exercice 3
// ==========
// Plusieurs courbes dans un graphique, avec des couleurs et des légendes
win3 = scf(3);  // Mémorise un pointeur sur la fenêtre n° 3
clf(3);  // Efface le contenu de la fenêtre n° 3.
ax3a = linspace(-2, 2, 101);  // points régulièrement espacés
ay3a = exp(ax3a);  // pour la courbe de l'exponentielle
plot( ax3a, ay3a..
      ,"color", [0.5, 0, 0].. // couleurs [r, g, b]  entre  0 et 1  ou une lettre "r", "g", "b", etc.
      ,"Thickness", 1..    // épaisseur du trait
      ,"LineStyle", "-".. // "-" ligne pleine, "--" traitillé, ":" pointillé, "-.", "none"
      ); 

// Inversion de  X  et  Y,  donne la fonction  Ln
plot( ay3a, ax3a..
      ,"color", [0, 0.5, 0].. // couleurs [r, g, b]  entre  0 et 1  ou une lettre "r", "g", "b", etc.
      ,"Thickness", 1..    // épaisseur du trait
      ,"LineStyle", "-".. // "-" ligne pleine, "--" traitillé, ":" pointillé, "-.", "none"
      ); 

// Ligne de symétrie  y = x
plot( [-2, 8], [-2, 8]..
      ,"color", [0, 0.5, 0.5].. // couleurs [r, g, b]  entre  0 et 1  ou une lettre "r", "g", "b", etc.
      ,"Thickness", 1..    // épaisseur du trait
      ,"LineStyle", "--".. // "-" ligne pleine, "--" traitillé, ":" pointillé, "-.", "none"
      ); 

// Couleur du fond de la fenêtre 'win3'
win3.color_map(31,:) = [1, 1, 0];  // = jaune
win3.background =  31; // référence à la table de couleur 'color_map'

// Référence au graphique
axes3 = win3.children;  // la courbe et les axes contenu dans la fenêtre graphique

// Couleur du fond du graphique
win3.color_map(30,:) = [0.5, 1, 1];  // = cyan clair
axes3.background = 30; // change la couleur de fond du graphique.

axes3.thickness = 2; // épaisseur des axes
axes3.font_size = 3; // Taille de la police de caractères
axes3.font_style = 4;
// 0=courrier gras,  1=courrier gras, 2=courrier,  3=italique
// 5=gras+italique,  4=gras,  6=normal,  7=gras italique  
// 8=très gras,  9=très gras + italique
// c.f. help font_style  et  help graphics fonts

axes3.zoom_box=[-2.1, -2.1, 7.6, 7.6]; // défini les échelles des axes

// Titre, légendes et informations.
title( axes3, "C''est le titre", ..
       'fontsize', 5);
xlabel(axes3, "axe des x", 'fontsize', 4);
ylabel(axes3, "axe des y", 'fontsize', 4);
xstring(-0.2, 6, "y = exp(x)");
xstring(5, 5, "y = x");
xstring(5.3, 1, "y = Ln(x)");

win3.figure_size = [780, 520]; // c.f. help figure_size
axes3.margins = [0.08, 0.02, 0.1, 0.15]; // gauche, droite, haut, bas

// Exercice 4
// ==========
// Graphisme en 3D
win4 = scf(4);  // Mémorise un pointeur sur la fenêtre n° 4
clf(4);  // Efface le contenu de la fenêtre n° 4.
ax4 = linspace(-4, 4, 50);  
ay4 = linspace(-6, 6, 31);  
az4 = cos(ax4') * cos(ay4);  // = Matrice correspondant à la fonction de x et y
plot3d( ax4, ay4, az4);

axes4 = win4.children; // pour modifier des données sur le graphique
data4 = axes4.children;

// Change la couleur de la surface
win4.color_map(31,:) = [0, 1, 0];  // = verte
data4.color_mode = 31;

// Change la couleur du dessous de la surface
win4.color_map(32,:) = [1, 0, 1];  // = magenta
data4.hiddencolor = 32;

data4.thickness = 2; // épaisseur des traits



// 5) Challenge de l'exercice 4
//=============================
iy = 0;
for ny=ay4 do
  ix = 0;
  iy = iy + 1;
  for nx=ax4 do
    ix = ix + 1;
    az4(ix, iy) = sin(2*sqrt(nx^2 + ny^2)) / (sqrt(nx^2 + ny^2)+1e-8);
  end
end

win5 = scf(5);
clf(5);
plot3d( ax4, ay4, az4);
win5.color_map(31,:) = [0, 1, 0];  // = verte
win5.color_map(32,:) = [1, 1, 0.5];  // = jaune pale
axes5 = win5.children; // pour modifier des données sur le graphique
data5 = axes5.children;
data5.color_mode = 31;
data5.hiddencolor = 32;

// Exercice 6
// ==========
// Un exemple d'animation
win6 = scf(6);  // Mémorise un pointeur sur la fenêtre n° 6
clf(6);  // Efface le contenu de la fenêtre n° 6.
at6 = linspace(0, 30, 201)';  
ax6 = ( at6 / 10) .* cos(at6);
ay6 = ( at6 / 10) .* sin(at6);

plot( ax6, ay6);

axes6 = win6.children; // pour modifier des données sur le graphique
data6 = axes6.children;
line6 = data6.children; // les données qui sont dans le graphique

data6.children.thickness = 5; // épaisseur du trait

// modifie les données de la courbe pour faire une animation
for nn=1:50 do
  drawlater();  // pour différer l'affichage graphique
  line6.data  = [( at6 / 10) .* cos(at6 - 0.05*nn) , ( at6 / 10) .* sin(at6 - 0.05*nn)];
  drawnow();  // pour afficher le graphique avec les modifications de la courbe
end;

// Exercice 7
// ==========
// Un exemple d'animation
win7 = scf(7);  
clf(7);
ax7 = linspace(0, 20, 201);  
ay7 = sin(ax7);

plot( ax7, ay7);

axes7 = win7.children; // pour modifier des données sur le graphique
data7 = axes7.children;
line7 = data7.children; // les données qui sont dans le graphique

data7.children.thickness = 2; // épaisseur du trait

// modifie les données de la courbe pour faire une animation
for nn=1:30 do
  drawlater();  // pour différer l'affichage graphique
  line7.data(:,2) = sin(ax7 + nn*0.1)';
  drawnow();  // pour afficher le graphique avec les modifications de la courbe
end;

// Exercice 8, supplément, animation de deux points dans un graphique
// ==========
win8 = scf(8);  
clf(8);

ax8 = [4];  
ay8 = [0];

// Premier point
plot( 4, 0, 'LineStyle', 'none'..
      ,"Marker", 'o'..  // "o", "x", "*", ".", "d"=diamond, "s"=square
      ,"MarkSize", 10 ..
      ,"MarkerFaceColor", 'r'.. // "r", "g", "b, "c", "m", "k"=black, "w"=white
      ,"MarkBackground", "m"..  // fond de la marque, = MarkerFaceColor
      ,"MarkForeground", "k"..  // bord
      );

// Deuxième point
plot( 4.5, 0, 'LineStyle', 'none'..
      ,"Marker", 'o'..  // "o", "x", "*", ".", "d"=diamond, "s"=square
      ,"MarkSize", 8 ..
      ,"MarkerFaceColor", 'g'.. // "r", "g", "b, "c", "m", "k"=black, "w"=white
      ,"MarkBackground", "c"..  // fond de la marque, = MarkerFaceColor
      ,"MarkForeground", "k"..  // bord
      );

axes8 = win8.children; // pour modifier des données sur le graphique
data8 = axes8.children;
line81 = data8(1).children; // les données sur le premier point
line82 = data8(2).children; // les données sur le deuxième point
global line81, line82;  // Pour utiliser ces variables dans la fonction ex8()
axes8.zoom_box=[-5.1, -5.1, 5.1, 5.1]; // défini les échelles des axes

function ex8()
//============
// modifie les coordonnées du point du graphique pour faire une animation
global line81, line82;  // Pour utiliser ces variables définies à l'extérieur de la fonction
for nn=1:400 do
  drawlater();  // pour différer l'affichage graphique
  line81.data = [4*cos(nn/80), 4*sin(nn/80)];
  line82.data = [4*cos(nn/80)+0.5*cos(nn/15), 4*sin(nn/80)+0.5*sin(nn/15)];
  drawnow();  // pour afficher le graphique avec les modifications de la courbe
end;
endfunction
