Menu pour créer une peinture programmée


L'éditeur :

Le script de dessin : (à réduire )


Le document :
La présentation :

La liste des ingrédients :

Le script de dessin

Éditeur transparent

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 draw sont déjà définies : la première est inutile et la fonction dessiner remplace 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)(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).

  1. 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.
  2. 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)U est un nombre positif définissant une longueur en pixels (px).
    Exercice : Via un curseur Ug, permettre à l'utilisateur de changer cette unité.
  3. 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.
  4. 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.
  5. 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.
  6. 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é.
  7. 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 !).
  8. 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).
  9. 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.
  10. 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.