PDF : 40 pages avec des lignes aléatoires

Un script complet pour générer un livre de 40 pages avec couverture avant et arrière. Le script lui-même génère des lignes avec un déplacement aléatoire. Dès que la ligne touche le bord de la zone définie pour le dessin, une nouvelle page est créée et un nouveau dessin démarre. Une fois les 40 pages créée, le script s’arrête.

Précédent | 7/26 | Suivant

Le code a des variables paramétrables en tête du script, pour déterminer l’amplitude des lignes, le nombre de pages, les marges du dessin, l’auteur du livre...

Chaque dessin est accompagné d’une numérotation de page, du décompte du nombre de lignes et du temps d’exécution du dessin.

//
// Livre aleatoire - octobre 2010
//
import processing.pdf.*;
PGraphicsPDF pdf;

PFont myFont;

// parametres du dessin, changer pour affiner
int nbpages=40; // nombre de pages
int marge=100; // marges à respecter
int deplacement=8; // déplacement maximum entre deux iterations
String auteur="Stéphane Noel";

// variable du script
float posx,posy,p_posx,p_posy;
int compteur=1;
int nbsquare=0;
int startmillis=0;

void setup() {
 size(594, 594);
 //String[] fontList = PFont.list();
 //println(fontList);
 myFont = createFont("Aller-Light", 24); // police gratuite : http://www.fontsquirrel.com/fonts/Aller
 textFont(myFont,24);

 pdf = (PGraphicsPDF)beginRecord(PDF, "randomlinesbook.pdf"); // titre du pdf
 beginRecord(pdf);
 background(255);
 positionnebloc(); // nouvelle position de départ du dessin

 commencelivre(); // appelle la fonction qui cree la couverture
 fill(255);
 stroke(10);

 numerotation();
}

void draw() {
 fill(255);
 line(posx,posy,p_posx,p_posy);
 p_posx=posx;
 p_posy=posy;
 nbsquare++;
 posx+=random(-deplacement,deplacement);
 posy+=random(-deplacement,deplacement);
 if(posx > width-marge || posx < marge || posy > height-marge || posy < marge) { // si la ligne sort de la zone
   fill(0);
   affichenbsquare(); afficher le nombre de lignes et le temps d'execution
   compteur++;
   fill(255);
   pdf.nextPage();
   if(compteur < nbpages) {
     background(255);
     positionnebloc(); // nouvelle position de départ du dessin
     nbsquare=0;
     numerotation();
   }
   else { // si le nombre de page est atteint
     finitlivre(); // genere la couverture arriere
     endRecord();
     exit();  // Quitte
   }
 }
}

void positionnebloc() {
 p_posx=posx=random(width*0.45,width*0.55);
 p_posy=posy=random(height*0.45,width*0.55);
}

void numerotation() {
 float ty=height-(marge/2);
 textFont(myFont,8);
 fill(0);
 textAlign(LEFT);
 text("Page " + compteur,marge,ty);
}

void affichenbsquare() {
 // calcule le temps de réalisation
 int duree=millis()-startmillis;

 float ty=height-(marge/2);
 textFont(myFont,8);
 fill(0);
 textAlign(RIGHT);
 text(duree/1000+ " secondes, " + nbsquare + " formes",width-marge,ty);
 startmillis=millis();
}

void commencelivre() { // cree la couverture
 fill(0);

 textAlign(CENTER);
 textFont(myFont,30);
 text("The random line book",width/2,(height/2)-30);
 textFont(myFont,18);
 text(auteur,width/2,(height/2)+30);
 pdf.nextPage();
 pdf.nextPage();
 background(255);
}

void finitlivre() {
 pdf.nextPage(); // une page blanche
 fill(0);
 // cree une page avec la date de création
 textAlign(LEFT);

 String texte="\nCe livre a été entièrement généré par un script.\n\nChacun de ses dessins part de la zone centrale de la page, et est composé de traits d'une longueur de "
   + (deplacement*25.1)/72 +" millimètres maximum dans n'importe quelle direction, à partir du trait précédent."
   +" Chaque dessin s'arrete lorsque le bord de la zone de dessin est touché.\n\n"
   +"Ce livre est composé de "+ nbpages +" pages. Il a été généré le "+day() +"/"+month()+"/"+year()+" à "+hour()+":"+minute()+".";
 textFont(myFont,12);
 text(texte,marge,marge+12,width-(marge*2),height-(marge*2));

 textFont(myFont,10);
 text(auteur,marge,height-(marge+12));
}

void keyPressed() { // pour interrompre n'importe quand (garde-fou)
 affichenbsquare();
 pdf.nextPage();
 pdf.nextPage();
 finitlivre();
 endRecord();
 exit();  // Quit
}