// crackseules texte
int e = 0 ;
int dimx = 600;
int dimy = 600;
int num = 0;
int maxnum = 100;
float textPos, textLen ;
String message = "This is my text, blablabla !!!" ;
// grid of cracks
int[] cgrid;
Crack[] cracks;
// color parameters
int maxpal = 512;
int numpal = 0;
color[] goodcolor = new color[maxpal];
// sand painters
//SandPainter[] sands;
// MAIN METHODS ---------------------------------------------
void setup() {
size(600,600,P3D);
frameRate (30) ;
textPos = (dimx) ;
// size(dimx,dimy,P3D);
background(255);
// takecolor("eau.jpg");
smooth() ;
// Text support
PFont f = createFont("Arial", 32);
textFont(f);
textLen = textWidth(message);
cgrid = new int[dimx*dimy];
cracks = new Crack[maxnum];
begin();
}
void draw() {
// crack all cracks
for (int n=0;n<num;n++) {
cracks[n].move(); // directement à la ligne 177 void move() on avance
// Added code
textPos--;
if (textPos < -textLen) {
textPos = width;
}
fill(#0077AA);
text(message, textPos, height / 2);
fill(255);
}
}
void mousePressed() {
begin();
}
// METHODS --------------------------------------------------
void makeCrack() {
if (num<maxnum) {
// make a new crack instance
cracks[num] = new Crack();
num++;
}
}
void begin() {
// erase crack grid
for (int y=0;y<dimy;y++) {
for (int x=0;x<dimx;x++) {
cgrid[y*dimx+x] = 10001;
}
}
// make random crack seeds
//16 au départ, 1 c'est chouette, 0 çà bloque
for (int k=0;k<16;k++) {
int i = int(random(dimx*dimy-1));
cgrid[i]=int(random(360));
}
// make just three cracks
// avec 1 c'est moins compliqué
num=0;
for (int k=0;k<3;k++) {
makeCrack();
}
background(255);
}
// OBJECTS -------------------------------------------------------
class Crack {
float x, y;
float t; // direction of travel in degrees
Crack() {
// find placement along existing crack
findStart();
// sp = new SandPainter();
}
void findStart() {
// pick random point
int px=0;
int py=0;
// shift until crack is found
boolean found=false;
int timeout = 0;
while ((!found) || (timeout++>1000)) {
px = int(random(dimx));
py = int(random(dimy));
if (cgrid[py*dimx+px]<10000) {
// e = (cgrid[py*dimx+px]);
// println ("cgrid "+e) ;
found=true;
}
}
if (found) {
// start crack
int a = cgrid[py*dimx+px];
if (random(100)<50) {
a-=90+int(random(-2,2.1));
} else {
a+=90+int(random(-2,2.1));
}
startCrack(px,py,a);
} else {
println("timeout: "+timeout);
}
}
void startCrack(int X, int Y, int T) {
x=X;
y=Y;
t=T;//60;
x+=0.61*cos(t*PI/180); // 180°= demi circonférence
y+=0.61*sin(t*PI/180); // ce qui signifie la lettre grecque PI
} // 90 ° = PI/2
// on ne parle plus de degrés m)ais de "radian" en convertissant les degrés avec radians()
void move() { // sin() et cos() permettent de travailler avec des valeurs exprimées en degré
// continue cracking
x+=0.42*cos(t*PI/180);//
y+=0.42*sin(t*PI/180);
// bound check
float z = 0.33; // je vois pas trop ce que çà change
// int cx = int(x+random(-z,z)); // add fuzz
// int cy = int(y+random(-z,z));
int cx = int(x); // avec ceci, les lignes sont plus nettes
int cy = int(y);
// draw sand painter
// regionColor();
// draw black crack
stroke(0,85); // si je mets 0 c'est noir, 255 blanc, alors je vois rien
//point(x+random(-z,z),y+random(-z,z));
point(x,y); // ouais c'est plus net
// ici on va vérifier où on en est; il faut que les 4 soient vraies, si une est fausse, tout est faux
if ((cx>=0) && (cx<dimx) && (cy>=0) && (cy<dimy)) {
// safe to check, ||= true si 1 des 2 val est vraie
if ((cgrid[cy*dimx+cx]>10000) || (abs(cgrid[cy*dimx+cx]-t)<5)) {
// continue cracking
cgrid[cy*dimx+cx]=int(t);
} else if (abs(cgrid[cy*dimx+cx]-t)>2) {
// crack encountered (not self), stop cracking
findStart();
makeCrack();
}
} else {
// out of bounds, stop cracking
findStart();
makeCrack(); // ici je pourrais mettre une boucle qui le fait repartir en arrière un temps
}
}
}