Un fractal este o figură geometrică ce poate fi divizată în mai multe părți, astfel încât fiecare dintre acestea să fie o copie în miniatură a originalului. Câteva exemple naturale de fractali sunt ferigile, fulgii de zăpadă, cochiliile de melci și fulgerele. De obicei, definiția fractalilor este simplă și recursivă.

Fractal

Voi prezenta în mai multe articole cum se pot desena (până la $n$ iterații) câțiva fractali celebri folosind biblioteca grafică standard Java (AWT). În mare, programele vor diferi doar prin funcția recursivă de desenare.

Covorul lui Sierpinski

Pentru a desena Covorul lui Sierpinski, se pornește de la un pătrat negru, în centrul căruia se desenează un pătrat alb a cărei latură este de $3$ ori mai mică decât cea a pătratului mare. Pentru celelalte $8$ pătrate mici se repetă procedeul. Recomand ca mărimea pătratului inițial să fie o putere a lui $3$, deoarece la fiecare iterație vom împărți acest număr la $3$ și n-ar fi bine să obținem rest. Eu voi alege $2^6 = 729$.

Covorul lui Sierpinski

Pentru început, creăm clasa Main cu atributul n (numărul total de generații ce trebuie desenate la un moment dat). Acesta va avea inițial valoarea 1.

Desigur, avem nevoie de metoda paint(Graphics g) și de o metodă draw unde vom implementa funcția recursivă prin care se desenează fiecare element al fractalului. Aceasta primește ca parametri obiectul de tip Graphics2D unde se va desena, coordonatele x și y ale pătratului curent, w, latura pătratului mic și it, numărul curent de iterații.

Primul apel al lui draw se va face în metoda paint. Înainte de acesta, vom desena pătratul negru, de latură 729.

În metoda main vom creea și inițializa fereastra unde va fi desenat fractalul:

Mi se pare interesant ca apăsând pe săgeată-dreapta să se incrementeze n și să se redeseneze fractalul, pentru a vedea o nouă iterație. Similar, când apăsăm pe săgeată-stânga, se va redesena covorul, cu o iterație mai puțin. Pentru asta, avem nevoie de o clasă care implementează interfața KeyListener.

Acum trebuie definită metoda draw. Începem prin a desena pătratul mic din centrul pătratului curent:

Continuăm cu 8 apeluri recursive la draw, prin care se desenează cele 8 pătrate mai mici:

Condiția de oprire a funcției recursive testează dacă s-a ajuns la numărul maxim de iterații, adică la n.

Iată rezultatul și fișierele finale:

Covorul lui Sierpinski în Java

Main.java

KListener.java

Puteți găsi pe WikiPedia o soluție mai scurtă și mai eficientă ca memorie. Dacă aveți sugestii pentru ce alte articole despre fractali să scriu, sau dacă aveți vreo întrebare despre Covorul lui Sierpinski, nu uitați să lăsați un comentariu mai jos 🙂

Îți place conținutul acestui site?

Dacă vrei să mă susții în întreținerea server-ului și în a scrie mai multe articole de calitate pe acest blog, mă poți ajuta printr-o mică donație. Află aici cum o poți face!