header

Bewegende tekst rond een deuropening

De schets met als voorbeeldtekst: het gedicht De tuinman van Ida Gerhardt.

 Uit : Verzamelde gedichten.
Amsterdam, Athenaeum-Polak & Van Gennep, 1980
 

Mover m1; Mover m2; Mover m3; Mover m4; Mover m5; Mover m6; Mover m7; 
Mover m8; Mover m9; Mover m10; Mover m11; Mover m12; Mover m13; Mover m14;
 
Mover lijn1; Mover lijn2; Mover lijn3; Mover lijn4; Mover lijn5;
void setup() { 
 // Door P2D of P3D toe te voegen beweegt de tekst minder schokkerig ! 
 // Bij fullScreen bevindt de text ingesteld op height zich net onder de onderrand van het scherm 
 // Bij fonts met verschillende grootte kloppen de waarde van sw niet meer 
 // kleine verschillen in sw (stringwidth), bij dezelfde lengte van de string, veroorzaken een verschuiving van de tekstlijnen  
 // size(960, 540,P2D); 
 fullScreen(P2D); 
 m1 = new Mover("Ik ben een tuinman. Niets dan dat,", height-280, 1.5, color(255, 0, 0), createFont("Asea", 30, true)); 
 m2 = new Mover("met aarde en met mest bespat;", height-260, 1.4, color(255), createFont("Asea", 30, true)); 
 m3 = new Mover("ik buig mij neer, ik richt mij op,", height-240, 1.3, color(255), createFont("Asea", 30, true)); 
 m4 = new Mover("ik klem de schoffel en de schop", height-220, 1.2, color(255), createFont("Asea", 30, true)); 
 m5 = new Mover("Ik wied, ik volg mijn diepste wet", height-200, 1.1 ,color(255), createFont("Asea", 30, true)); 
 m6 = new Mover("als ik de naakte zaailing zet;", height-180, 1, color(255), createFont("Asea", 30, true)); 
 m7 = new Mover("ik richt mij op, ik buig mij neer,", height-160, 0.9, color(255), createFont("Asea", 30, true)); 
 m8 = new Mover("een tuinman ben ik en niets meer.", height-140, 0.8, color(255), createFont("Asea", 30, true)); 
 m9 = new Mover("Ga ik met donker stram naar huis", height-120, 0.7, color(255), createFont("Asea", 30, true)); 
 m10 = new Mover("de pijn spaart schouderblad noch kruis", height-100, 0.6, color(255), createFont("Asea", 30, true)); 
 m11 = new Mover("ik waak nog als ik rusten mag", height-80, 0.5, color(255), createFont("Asea", 30, true)); 
 m12 = new Mover("Mijn land, mijn land; het is kort dag", height-60, 0.4, color(255), createFont("Asea", 30, true));
lijn1 = new Mover("Delft straks uw spa voor mij de wig", 50, 1, color(255, 0, 0), createFont("Asea", 30, true)); 
 lijn2 = new Mover("vergeet waar ik geborgen lig.", 50, 0.8, color(255), createFont("Asea", 30, true)); 
 lijn3 = new Mover("Voorbij mijn moeite, nood en pijn", 50, 0.6, color(255), createFont("Asea", 30, true)); 
 lijn4 = new Mover("moet er een tuin van sterren zijn.", 50, 0.4, color(255), createFont("Asea", 30, true)); 
}
void draw() { 
 background(0); 
  
 pushMatrix(); 
 m1.rechthoek(); 
 m1.display(); 
 popMatrix();
 
pushMatrix(); 
 m2.rechthoek(); 
 m2.display(); 
 popMatrix();
 
pushMatrix(); 
 m3.rechthoek(); 
 m3.display(); 
 popMatrix();
 
pushMatrix(); 
 m4.rechthoek(); 
 m4.display(); 
 popMatrix();
 
pushMatrix(); 
 m5.rechthoek(); 
 m5.display(); 
 popMatrix();
 
pushMatrix(); 
 m6.rechthoek(); 
 m6.display(); 
 popMatrix();
 
pushMatrix(); 
 m7.rechthoek(); 
 m7.display(); 
 popMatrix();
 
pushMatrix(); 
 m8.rechthoek(); 
 m8.display(); 

popMatrix();
 

pushMatrix(); 
 m9.rechthoek(); 
 m9.display(); 
 popMatrix();
 
pushMatrix(); 
 m10.rechthoek(); 
 m10.display(); 
 popMatrix(); 
  
 pushMatrix(); 
 m11.rechthoek(); 
 m11.display(); 
 popMatrix(); 
  
 pushMatrix(); 
 m12.rechthoek(); 
 m12.display(); 
 popMatrix(); 
  
 pushMatrix(); 
 lijn1.lijn(); 
 lijn1.display(); 
 popMatrix();
 
pushMatrix(); 
 lijn2.lijn(); 
 lijn2.display(); 
 popMatrix();
 
pushMatrix(); 
 lijn3.lijn(); 
 lijn3.display(); 
 popMatrix(); 
  
 pushMatrix(); 
 lijn4.lijn(); 
 lijn4.display(); 
 popMatrix(); 
}
De class met de rechthoek(), lijn() en display() methodes.
Het is de bedoeling dat de tekst met een beamer op een muur wordt geprojecteerd waarbij de tekst  zich rond een deuropening zal bewegen.
 

class Mover { 
 PFont f; 
 String text; 
 float sw; 
 float x; 
 float y; 
 float snelh; 
 color c;
float teller; 
 float teller2; 
 float r;
Mover(String text_, float y_, float snelh_, color c_, PFont f_) { 
 text = text_; 
 y = y_; 
 snelh = snelh_; 
 c = c_; 
 f = f_; 
 }
void rechthoek() { 
 sw = textWidth(text); 
 teller = teller + snelh;  
 //1) X richting 
 if ((teller >=0 ) && (teller < width/3)) translate(teller, 0); 
 //2) y richting 
 if ((teller >= height/1.6875) && (teller < height/0.7941)) translate(width/3, -(teller-height/1.6875)); 
 //3) x richting 
 if ((teller >= width/1.41176) && (teller < width/0.96+sw)) translate(teller-width/2.666, -height/1.5);  
 //4) y richting 
 if ((teller >= height/0.54+sw) && (teller < height/0.397+sw)) translate(width/1.5+sw, -height/0.397-sw+teller);
//5) Actie: beweging in x richting naar eindpunt x = 960. 
 // Beginpunt x is de x waarde in vorige translate(x,y); = 640+sw 
 // eindpunt y is beginpunt y in de eerste stap y = 0, 
 // Instellingen teller: 
 // 1) Beginstand teller = vorige eindstand teller = 1360+sw  
 // Aantal tellen = 320-sw  
 // 2) Eindstand teller = beginstand teller + aantal tellen = 1360+sw+320-sw = 1680 
 // Instellingen van translate(x,y) 
 // x = teller-(eindstand teller - eindpunt x) = teller - (1680-960)  
 // x = teller- 720 
 // y = eindpunt y eerste stap = 0  
 if ((teller > width/0.70588+sw) && (teller < width/0.5714+sw)) translate(teller-width/1.3333, 0);
//sw wordt bij de eindstand teller opgeteld zodat de text uit het beeld kan lopen 
 if (teller >= width/0.5714+sw) teller = 0; 
 }
void lijn() { 
 sw = textWidth(text); 
 teller2 = teller2 + snelh;  
 // X richting 
 if ((teller2 >=0 ) && (teller2 < width+sw)) translate(teller2, 0); 
 if (teller2 >= width+sw) teller2 = 0; 
 }
void display() { 
 textAlign(RIGHT); 
 textFont(f);  
 fill(c);  
 text(text, x, y); 
 }
}