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".

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;
        }
      }
    }
  }
}