Peinture dynamique programmée avec le module p5 francisé.
L'objectif du PPPP (Projet Personnel de Peinture Programmée)
est de produire un dessin dynamique tenant compte de la position de la souris, du temps
qui s'écoule et de variables d'entrée globales modifiées via une IHM,
en un script de 30 à 70 lignes.
On peut aussi étudier un tutoriel de p5 en français, mais en notant bien au préalable qu'ici,
dans l'environnement du PPPP,
les fonctions setup et drawsont déjà définies :
la première est inutile et la fonction dessinerremplace la seconde.
On retient déjà que la variable globale numImage (= frameCount)
indique le n° de l'image en cours, produite par la fonction dessiner.
Donc par exemple, la 60e image produite arrive au bout d'une seconde lorsque
la fonction de dessin est exécutée 60 fois par seconde.
On doit comprendre enfin que la programmation est ici exprimée en langage Javascript avec
des fonctions complémentaires de dessin (module p5-fr), auquel
on a ajouté l'usage du chapeau pour exprimer les puissances. Ainsi
une expression comme y = (x-3)*(1 - x^2) sera exploitable.
De même on peut utiliser les fonctions natives du module p5 (line, rect, etc…), mais
c'est alors se priver de la commodité des repères.
Décadidactologue : Les ingrédients, point par point
Dans l'environnement du PPPP, comme dans ce document, on peut utiliser les fonctions 2D natives
de p5, mais il est convenu d'utiliser
les fonctions francisées, car elles offrent en plus la possibilité de travailler comme en Mathématique ou
en Physique, c'est à dire avec plusieurs repères orthonormés en même temps,
définis grâce à une instruction de la forme
R = nouveau.repère(x,y, u,a) où (x,y) représente les coordonnées dans le repère de base,
u l'unité graphique en pixels et a l'angle que fait l'axe des abscisses du nouveau repère
avec (Ox), celui du repère de base lié nativement à la toile. On peut de plus changer dynamiquement
ces valeurs pour tout repère ainsi construit, avec une instruction similaire :
R.défini_par(x,y, u,a).
un fond pour la toile, défini avec une couleur RVB
modulable via une IHM pour les variables d'entrée.
On la définit avec
trois ingrédients : curseur, incrémenteur et booléen.
Le texte affiché, avec usage des coordonnées, montre bien
l'exécution périodique de la fonction dessiner (a priori 60 fois/s). Exercice :
Ajouter un curseur vert permettant à l'utilisateur de modifier la composante verte du fond,
avec une valeur initiale de 128 pour garder l'aspect du script originel
lorsque avec_du_vert est vrai.
des points et des lignes droites avec quatre ingrédients : point, ligne, segment
et trait (ou couleur).
La fonction ligne est relative au repère de base alors que segment
permet en plus de tracer une ligne dans un repère défini au préalable.
On peut changer dynamiquement l'unité d'un repère avec R1.unité(U) où U
est un nombre positif définissant une longueur en pixels (px). Exercice :
Via un curseur Ug, permettre à l'utilisateur de changer cette unité.
des figures de base avec trois ingrédients :
cercle (ou disque), rectangle et coloriage.
Si la couleur des traits est définie avec couleur ou trait, la couleur intérieure
des figures est définie avec coloriage. On peut utiliser des noms de couleurs en anglais
(voir ici). Exercice :
on modifie (ou complète) les commentaires du script pour préciser les parties du visage représentées
par les instructions graphiques et on modifie le script pour changer les couleurs
et ajouter des oreilles au personnage.
des figures de base (comme ci-dessus) avec une animation qui tient compte d'un ingrédient fondamental :
numImage (ou frameCount), on ajoute aussi une translation du repère de la toile.
La couleur des traits est définie avec couleur ou trait et la couleur intérieure
avec coloriage. Exercice : on complète le script pour ajouter une dent blanche au personnage.
en fonction de la position du pointeur de la souris, avec trois variables prédéfinies :
Xsouris, Ysouris et sourisEstAppuyée. On note que si le fond
n'est pas colorié à chaque appel de la fonction dessiner,
le dessin est complété —on peint sur une toile déjà peinte— et donc on peut
ainsi créer une brosse pour étaler une figure donnée.
des polygones avec trois ingrédients :
triangle, quadrilatère et polygone (ou polygone.régulier).
Dans cet exemple le dessin n'est produit que lorsqu'on appuie sur le bouton de la souris. Exercice : on modifie le script pour ajouter un triangle équilatéral noir au milieu
du personnage et pour que ce dernier ait le bras gauche baissé.
des disques variables avec deux ingrédients :
sourisEstAppuyée et moletteActive (une fonction spécifique à définir).
Dans cet exemple le dessin n'est produit que lorsqu'on appuie sur le bouton de la souris, on tourne
sa molette ou on déplace le curseur (car on appuie forcément sur le bouton de la souris !).
des arcs avec un ingrédient : arc (ou secteur).
On peut aussi tracer un arc selon un repère prédéfini (avec nouveau.repère).
un exemple montrant l'usage de repères et de fonctions, d'une part pour
faciliter la mise au point du script de dessin à partir d'un prototype dessiné sur le papier,
et d'autre part pour faire évoluer indépendamment ses différentes parties, en particulier
en utilisant les variables globales Xsouris et Ysouris.
un exemple faisant office d'exercice probatoire
(les modifications à apporter sont spécifiées dans les commentaires);
sa résolution permet de montrer qu'on a réellement compris les notions de base sur le principe du PPPP,
autrement dit qu'on est capable de produire un dessin dynamique interactif en autonomie.