|
» codelab : http://codelab.fr/accueil » Forum : Moduleft : http://codelab.fr/moduleft » [processing] Arbre récursif : http://codelab.fr/739 Ceci est la version imprimable d'un sujet du forum, pour retourner à la version complète : [processing] Arbre récursif |
| Staross — 2007-09-29 15:55:58 |
Une fonction récursive très classique qui dessine de petits arbres. mafonction()
{
mafonction()
}Cette fonction à un problème car elle va s'appeller elle-même à l'infini ! mafonction(int nb)
{
if(nb > 0)
mafonction(nb-1)
}Le nombre nb va diminuer au cours des appelles et la fonction va arreter de s'appeller elle même quand nb = 0. import processing.opengl.*;
void setup()
{
size(800, 600,OPENGL);
smooth();
colorMode(RGB, 255, 255, 255, 100);
rectMode(CENTER);
}
void draw()
{
background(0);
drawline(300, 300, 30. + mouseY/100., mouseX/10, 8);
}
void drawline(
int x, //coordonnées du départ de la branche
int y,
float angle, //angle de départ
int len, //longeur de la branche
int nb //nombre d'embranchements
)
{
if(nb > 0) //condition d'arret
{
float dev=0.25; //deviation angulaire à chaque branche
int nx = int(x+cos(angle)*len); //un peu de trigo.
int ny = int(y+sin(angle)*len);
stroke(nb*10, nb*10, nb*10, 120); //les lignes deviennent plus foncé à chaque branche
fill(30*(-nb+10), 30*(-nb+10), 30*(-nb+10)); //les surfaces deviennent plus clairs à chaque branche
//dessine
line(x,y,nx,ny);
ellipse(x,y,nb+4,nb+4);
//appelle les branches suivantes
drawline(nx,ny,angle-dev-len/100.,len-2,nb-1);
drawline(nx,ny,angle+dev+len/100.,len-2,nb-1);
}
}
|
| tobald — 2007-09-30 00:23:47 |
|
| Staross — 2007-09-30 15:40:21 |
Le même genre mais avec des angles aléatoires mutliples de pi. import processing.opengl.*;
int sizex = 1024;
int sizey = 768;
float pi = 3.14159265;
float phi = 1.61803399;
void setup()
{
size(sizex, sizey,OPENGL);
smooth();
colorMode(RGB, 255, 255, 255, 100);
noLoop();
noStroke();
}
void draw()
{
background(255);
form(sizex/2,sizey/2,int(random(5,12)),int(random(5,100)),0);
}
void form(int x, int y, int nb, int len, float angle)
{
if(nb > 0 && len > 0)
{
angle = pi/2*int(random(-4,4));
println(len);
int nx = int (x+ len*cos(angle) );
int ny = int (y+ len*sin(angle) );
stroke(10+15*nb,8*nb,angle*10,len);
line(x+random(-2,2),y+random(-2,2),nx+random(-2,2),ny+random(-2,2));
stroke(10+15*nb,8*nb,angle*10,len+10);
line(x+random(-2,2),y+random(-2,2),nx+random(-2,2),ny+random(-2,2));
stroke(10+15*nb,8*nb,angle*10,len+50);
line(x,y,nx,ny);
form(nx,ny,nb-1,len-6,angle);
form(nx,ny,nb-1,len-10,angle);
}
else
{
stroke(10+15*nb, 8*nb, angle*10, 20);
ellipse(x,y,2,2);
}
}
void mousePressed()
{
redraw();
}
|
| dUX — 2007-10-01 01:04:13 |
Génial !
|
| tobald — 2007-10-01 21:06:44 |
hello dux, ça faisait un petit moment ... |
| Staross — 2007-10-01 21:34:37 |
Bonne remarque, c'est parce que dans la fonction draw (qui est appellé par le programme automatiquement), j'appelle une seule fois ma fonction
|
| osc — 2007-10-03 10:50:02 |
Les arbres récursifs sont assez courant, mais c'est tellement puissant.
|