Dessiner avec des mots en angle droit

Ce script permet d’écrire des mots à angle droit en suivant la souris, égrenant un texte donné, ici "Alice au pays des merveilles".

Précédent | 26/27 | Suivant

Ce code dissocie le texte en une longue série de mots puis les écrits dans l’espace de la fenêtre en respectant leur longueur, et en restant à angle droit. La barre d’espacement permet de démarrer ou stopper le processus d’écriture, permettant de déplacer le point d’écriture à différents endroits de la surface.

C’est une base améliorable évidemment, on peut imaginer changer typo, tailles et couleurs assez facilement.

// placer le curseur au bon endroit
// puis appuyer sur la barre d'espacement
// pour démarrer/stopper l'ecriture

String[] mots;
PFont p;
int compteur=0;

int px=200;
int py=200;

int lastrx=-2;
int lastry=-2;
boolean dessin=false;

void setup() {
 size(800, 600);
 stroke(0);
 fill(0);
 background(255);
 // preparation du texte
 String[] texte=loadStrings("alice_pays_merveilles-total.txt");
 String tout=join(texte, " ");
 // splitter mais garder les points et virugules.
 mots=splitTokens(tout, " \"();:-…°*«»");  
 println(mots.length);

 p=createFont("staticBold", 18);
 textFont(p, 18);
 textAlign(LEFT, CENTER);
}

void draw() {
}

void keyPressed() { // start/stop du dessin
 if (dessin==true) {
   dessin=false;
 }
 else {
   dessin=true;
   px=mouseX;
   py=mouseY;
   lastrx=0;
   lastry=0;
 }
}

void mouseMoved() {
 if (dessin==true) { // permet de controler start / stop de l'ecriture
   float longueur=textWidth(mots[compteur]+" ");
   float l=dist(mouseX, mouseY, px, py);
   if (l > longueur) {
     // déterminer la direction
     int rx=mouseX-px;
     int ry=mouseY-py;
     int addx, addy;
     if (abs(rx)-abs(ry) > 0) { // deplacement plutot vertical ou horizontal ?
       // deplacement horizontal
       rx=constrain(rx, -1, 1);
       ry=0;
     }
     else {
       // deplacement vertical
       ry=constrain(ry, -1, 1);
       rx=0;
     }

     if ((rx !=-lastrx && rx !=0) || (ry != -lastry && ry != 0)) { // ne jamais revenir en arrière
       fill(0);
       translate(px, py);
       rotate(-atan2(rx, ry)+HALF_PI); // calcul de la rotation
       text(mots[compteur], 0, 0);

       // le mot est ecrit, preparer le suivant
       px=int(px+(rx*longueur));
       py=int(py+(ry*longueur));
       lastrx=rx;
       lastry=ry;

       compteur++;
       if (compteur>=mots.length) {
         compteur=0;
       }
     }
   }
 }
}