Une fonction récursive très classique qui dessine de petits arbres.
En programmation, une fonction récursive est simplement une fonction qui s'apelle elle-même :
mafonction() { mafonction() }
Cette fonction à un problème car elle va s'appeller elle-même à l'infini !
On doit toujours mettre ce qu'on appelle une condition d'arret, qui permet d'arreter la récursion au bout d'un moment, par exemple :
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.
Enfin bref !
Hors ligne
Hors ligne
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(); }
Hors ligne
Génial !
Va falloir que je me penche là dessus.
Hors ligne
hello dux, ça faisait un petit moment ...
Esthétiquement parlant , le rendu me plait bien.
Par contre j'ai vraiment pas le courage de me plonger dans processing pour l'instant
comment se fait il que la "chaine" commence par un point créant 1 point et non 2 comme par la suite.
Hors ligne
Bonne remarque, c'est parce que dans la fonction draw (qui est appellé par le programme automatiquement), j'appelle une seule fois ma fonction
drawline(x,y,...). Elle va dessiner le premier trait de x,y (l'origine) à nx,ny (le point suivant) (line(x,y,nx,ny) et le cercle au point x,y (ellipse(x,y,nb+4,nb+4).
Ensuite seulement j'appelle deux fois la fonction drawline() avec deux angles différents, et là ça se sépare en deux. Si on appellait trois fois drawline ça ferait trois branches sur chaque noeud.
En fait c'est un peu odiot de dessiner le cercle sur le noeud d'origine (x,y) parce que les dernières branches n'ont pas de feuilles !
Hors ligne
Les arbres récursifs sont assez courant, mais c'est tellement puissant.
ya Robert Penner et son Danseur Fractal -> http://www.robertpenner.com/index2.html
ou encore Jared Tarbell et son Tree Garden -> http://complexification.net/gallery/mac … reeGarden/
J'adore celui de Jared
Là c'est du Flash mais ça revient au même.
Hors ligne