+ All Categories
Home > Documents > 3 - Fractali Obtinuti Prin Metoda IFS

3 - Fractali Obtinuti Prin Metoda IFS

Date post: 10-Oct-2014
Category:
Upload: nicolae-darie
View: 77 times
Download: 4 times
Share this document with a friend
31
Preliminarii Fie M R n o mul¸time . O func¸tie f : M R n senume¸stecontrac¸tie dac˘ a exist˘ a q (0, 1) astfel încât a) f (x) - f (y)‖≤ q x - y, x, y M ; b) f (M ) M. Fie M R n o mul¸time închis˘ a ¸si f : M R n o contrac¸tie a mul¸timii M . Atunci, pentru orice x (0) M sirul (x (n) ) nN definit prin x (n+1) = f (x (n) ), n N convergelaunicasolu¸tieaecua¸tiei f (x)= x. Senume¸ stesistemiterativdefunc¸tiialmul¸timiiînchise M R n ofamilie (f i ) i= 1,m (m N * ) decontrac¸tiialemul¸timii M . Pentru un punct x (0) M, fie A_0= {x (0) }. Definimrecurent¸sirulde mul¸timi A k (submul¸timi ale lui M )cu A k+1 = m i=1 f i (A k ). Fie A = lim k→∞ A k . Atunci A este unfractal (ob¸tinutprin metodasistemuluidefunc¸tiiiterate). Pentru reprezentarea grafic˘ a vom considera n =2 ¸sicontrac¸tiile f i (i = 1,m) de forma f i (x, y )=(a (i) 11 x + a (i) 12 y + b (i) 1 ,a (i) 21 x + a (i) 22 y + b (i) 2 ), numite ¸ si transform˘ ari afine. Pentru diverse valori ale lui m ¸si ale coefi- cien¸tilor a (i) 11 ,a (i) 12 ,b (i) 1 ,a (i) 21 ,a (i) 22 ,b (i) 2 se ob¸tin diverse imagini fractalice. Covovorul lui Sierpinski Construc¸tie: Se folosesc 8 contrac¸tii pe [-0, 5; 1, 5] × [-0, 5; 1, 5] ¸si anume f 1 (x, y)= 1 3 x, 1 3 y , 1
Transcript
Page 1: 3 - Fractali Obtinuti Prin Metoda IFS

PreliminariiFie M ⊂ Rn o multime . O functie f : M → R

n se numeste contractiedaca exista q ∈ (0, 1) astfel încât

a) ‖f (x)− f (y)‖ ≤ q ‖x− y‖ , ∀x, y ∈M ;

b) f(M) ⊂M.Fie M ⊂ R

n o multime închisa si f : M → Rn o contractie a multimii

M . Atunci, pentru orice x(0) ∈M , sirul (x(n))n∈N definit prin

x(n+1) = f (x(n)), ∀n ∈ N

converge la unica solutie a ecuatiei f (x) = x.

Se numeste sistem iterativ de functii al multimii închiseM ⊂ Rn o familie(fi)i=1,m (m ∈ N∗) de contractii ale multimiiM . Pentru un punct x(0) ∈M,fie A_0 = {x(0)}. Definim recurent sirul de multimi Ak (submultimi ale lui

M) cu Ak+1 =

m⋃

i=1

fi(Ak). Fie

A = limk→∞

Ak.

Atunci A este un fractal (obtinut prin metoda sistemului de functii iterate).

Pentru reprezentarea grafica vom considera n = 2 si contractiile fi (i =1,m) de forma

fi(x, y) = (a(i)11x+ a

(i)12y + b

(i)1 , a

(i)21x+ a

(i)22y + b

(i)2 ),

numite si transformari afine. Pentru diverse valori ale lui m si ale coefi-cientilor a

(i)11 , a

(i)12 , b

(i)1 , a

(i)21 , a

(i)22 , b

(i)2 se obtin diverse imagini fractalice.

Covovorul lui SierpinskiConstructie: Se folosesc 8 contractii pe [−0, 5; 1, 5] × [−0, 5; 1, 5] si

anume

f1(x, y) =

(1

3x,1

3y

),

1

Page 2: 3 - Fractali Obtinuti Prin Metoda IFS

f2(x, y) =

(1

3x+

2

3,1

3y

),

f3(x, y) =

(1

3x+

1

3,1

3y

),

f4(x, y) =

(1

3x,1

3y +

1

3

),

f5(x, y) =

(1

3x,1

3y +

2

3

),

f6(x, y) =

(1

3x+

1

3,1

3y +

2

3

),

f7(x, y) =

(1

3x+

2

3,1

3y +

1

3

),

f8(x, y) =

(1

3x+

2

3,1

3y +

2

3

).

Punctul initial este (1, 1).

Pentru implemenare am definit o structura punct (reprezentând coordo-natele unui punct în plan):

public struct punct{public double x;public double y;public punct(double x, double y){this.x = x;this.y = y;}}doua liste de puncteList<punct> lista_puncte_1 = new List<punct>();List<punct> lista_puncte_2 = new List<punct>();un punct initialpublic punct p0 = new punct(1,1);functiile care definesc contractiile:private punct contr1(punct p)

2

Page 3: 3 - Fractali Obtinuti Prin Metoda IFS

{punct p_nou = new punct();p_nou.x = 1 / 3.0 * p.x;p_nou.y = 1 / 3.0 * p.y;return p_nou;}private punct contr2(punct p){punct p_nou = new punct();p_nou.x = 1 / 3.0 * p.x + 2 / 3.0;p_nou.y = 1 / 3.0 * p.y;return p_nou;} etc.Desenarea se poate realiza urmarind evolutia listei de puncte la fiecare

pas astfel:public override void deseneaza(){init_ecran();lista_puncte_1 = new List<punct>();lista_puncte_1.Add(p0);for (int k = 0; k <= nivel; k++){init_ecran();foreach (punct el_p in lista_puncte_1){p = el_p;int cx = (int)Math.Round((p.x - left) / dx);int cy = (int)Math.Round((p.y - bottom) / dy);bmp.SetPixel(cx, cy, Color.White);//Culoare(k * 20));if (k < nivel){lista_puncte_2.Add(contr1(p));lista_puncte_2.Add(contr2(p));lista_puncte_2.Add(contr3(p));lista_puncte_2.Add(contr4(p));lista_puncte_2.Add(contr5(p));lista_puncte_2.Add(contr6(p));lista_puncte_2.Add(contr7(p));

3

Page 4: 3 - Fractali Obtinuti Prin Metoda IFS

lista_puncte_2.Add(contr8(p));}}lista_puncte_1 = lista_puncte_2;lista_puncte_2 = new List<punct>();asteapta(2);}}sau aplicand aleator setul de contractii definit anterior:

public override void deseneaza(){

init_ecran();p = p0;Random nr_aleator = new Random();for (int k = 0; k <= 5000000; k++){int cx = (int)Math.Round((p.x - left) / dx);int cy = (int)Math.Round((p.y - bottom) / dy);bmp.SetPixel(cx, cy, Color.Red);switch (nr_aleator.Next(8)){case 0: p = contr1(p); break;case 1: p = contr2(p); break;case 2: p = contr3(p); break;case 3: p = contr4(p); break;case 4: p = contr5(p); break;case 5: p = contr6(p); break;case 6: p = contr7(p); break;case 7: p = contr8(p); break;}}}

Triunghiul lui Sierpinski

4

Page 5: 3 - Fractali Obtinuti Prin Metoda IFS

Constructie: Se folosesc 3 contractii pe [−0, 6; 1, 4]× [−0, 6; 1, 4] (plancomplex) si anume

f1(z) =z

2,

f2(z) =z + 1

2,

f3(z) =z + i

2.

Punctul initial este 1 + i.Pentru implementare am creat o structura de numere complexe:public struct complex{public double Re, Im;public complex(double real, double imaginar){this.Re = real;this.Im = imaginar;}

static public complex operator +(complex z1, complex z2){return new complex(z1.Re + z2.Re, z1.Im + z2.Im);}static public complex operator +(double a, complex z1){return new complex(z1.Re + a, z1.Im);}static public complex operator -(complex z1, complex z2){return new complex(z1.Re - z2.Re, z1.Im - z2.Im);}static public complex operator -(double a, complex z1){return new complex(a - z1.Re, -z1.Im);}static public complex operator -(complex z1, double a){

5

Page 6: 3 - Fractali Obtinuti Prin Metoda IFS

return new complex(z1.Re - a, z1.Im);}static public complex operator *(complex z1, complex z2){return new complex(z1.Re * z2.Re - z1.Im * z2.Im, z1.Re * z2.Im +

z1.Im * z2.Re);}static public complex operator *(double a, complex z1){return new complex(a * z1.Re, a * z1.Im);}static public complex operator /(complex z1, complex z2){double numitor = z2.Re * z2.Re + z2.Im * z2.Im;return new complex((z1.Re * z2.Re + z1.Im * z2.Im) / numitor,(-z1.Re * z2.Im + z1.Im * z2.Re) / numitor);}static public complex operator /(complex z1, double a){return new complex(z1.Re / a, z1.Im / a);}static public complex operator /(double a, complex z1){double numitor = z1.Re * z1.Re + z1.Im * z1.Im;return new complex(a * z1.Re / numitor, -a * z1.Im / numitor);}}Am definit o lista de numere complexe, un numar complex initial, con-

tractiile si functia de desenare pas cu pas:List<complex> lista_nr_complexe_1 = new List<complex>();List<complex> lista_nr_complexe_2 = new List<complex>();complex z = new complex();public complex z0 = new complex(1,1);private complex contr1(complex z){return z / 2.0;}private complex contr2(complex z)

6

Page 7: 3 - Fractali Obtinuti Prin Metoda IFS

{

return (1 + z) / 2.0;}private complex contr3(complex z){complex i = new complex(0,1);return (z+ i) / 2.0;}

public override void deseneaza(){init_ecran();lista_nr_complexe_1 = new List<complex>();lista_nr_complexe_1.Add(z0);for (int k = 0; k <= nivel; k++){init_ecran();foreach (complex el_z in lista_nr_complexe_1){z = el_z;int x = (int)Math.Round((z.Re - left) / dx);int y = (int)Math.Round((z.Im - bottom) / dy);bmp.SetPixel(x, y, Culoare(k * 20));if (k < nivel){lista_nr_complexe_2.Add(contr1(z));lista_nr_complexe_2.Add(contr2(z));lista_nr_complexe_2.Add(contr3(z));}}lista_nr_complexe_1 = lista_nr_complexe_2;lista_nr_complexe_2 = new List<complex>();asteapta(2);}}

Curba lui Koch

7

Page 8: 3 - Fractali Obtinuti Prin Metoda IFS

Constructie: Se folosesc 4 contractii pe [−0, 1; 1, 1]× [−0, 4; 0, 8] (plancomplex) si anume

f1(z) =z

3,

f2(z) =1

3+ z

(1

6+ i

√3

6

)

,

f3(z) =2

3+ (z − 1)

(1

6− i√3

6

)

,

f4(z) =z + 2

3.

Punctul initial este 12+ 1

2i.

Pentru implementare am creat o structura de numere complexe:Am definit o lista de numere complexe, un numar complex initial, con-

tractiile si functia de desenare pas cu pas:List<complex> lista_nr_complexe_1 = new List<complex>();List<complex> lista_nr_complexe_2 = new List<complex>();complex z = new complex();public complex z0 = new complex(0.5,0.5);public complex o = new complex(1 / 6.0, Math.Sqrt(3) / 6.0);public complex oc = new complex(1 / 6.0, - Math.Sqrt(3) / 6.0);private complex contr1(complex z){return z / 3.0;}private complex contr2(complex z){

return 1 / 3.0 + o * z;}private complex contr3(complex z){return 2 / 3.0 + oc * (z - 1);}private complex contr4(complex z){return 2 / 3.0 + z / 3.0;

8

Page 9: 3 - Fractali Obtinuti Prin Metoda IFS

}public override void deseneaza(){init_ecran();lista_nr_complexe_1 = new List<complex>();lista_nr_complexe_1.Add(z0);for (int k = 0; k <= nivel; k++){init_ecran();foreach (complex el_z in lista_nr_complexe_1){z = el_z;int x = (int)Math.Round((z.Re - left) / dx);int y = (int)Math.Round((z.Im - bottom) / dy);bmp.SetPixel(x, y, Culoare(k * 50));if (k < nivel){lista_nr_complexe_2.Add(contr1(z));lista_nr_complexe_2.Add(contr2(z));lista_nr_complexe_2.Add(contr3(z));lista_nr_complexe_2.Add(contr4(z));}}lista_nr_complexe_1 = lista_nr_complexe_2;lista_nr_complexe_2 = new List<complex>();asteapta(1);}}

Fractal FloareConstructie: Se folosesc 2 contractii pe [−2, 2]× [−2, 2] si anume

f1(x, y) =

(1

3x,1

3y +

9

10

),

f2(x, y) =

(cos

5· x− sin 2π

5· y, sin 2π

5· x+ cos 2π

5· y).

Punctul initial este (0, 0).

9

Page 10: 3 - Fractali Obtinuti Prin Metoda IFS

Fractal LantConstructie: Se folosesc 2 contractii pe [−2, 2]× [−2, 2] si anume

f1(x, y) =

(1

2x,1

10y +

9

10

),

f2(x, y) =(cos

π

5· x− sin π

5· y, sin π

5· x+ cos π

5· y).

Punctul initial este (0, 0).

Fractal FerigaConstructie: Se folosesc 4 contractii pe [−6, 6]× [−5, 12] si anume

f1(x, y) = (0; 0, 16 · y) ,

f2(x, y) = (0, 2 · x− 0, 26 · y; 0, 23 · x+ 0, 22 · y + 1, 6) .f3(x, y) = (−0, 15 · x+ 0, 28 · y; 0, 26 · x+ 0, 24 · y + 0, 44) .f4(x, y) = (0, 85 · x+ 0, 04 · y;−0, 04 · x+ 0, 85 · y + 1, 6) .

Punctul initial este (0, 0).

Fractal GalaxieConstructie: Se folosesc 2 contractii pe [−1, 02; 1, 02]× [−1, 02; 1, 02] si

anumef1(x, y) = (0, 15 · x+ 0, 8; 0, 15 · y) ,

f2(x, y) = (0, 38 · x− 0, 83 · y; 0, 92 · x+ 0, 34 · y) .Punctul initial este (0, 0).

Fractal RameConstructie: Se folosesc 4 contractii pe [−1, 1; 1, 1] × [−1, 1; 1, 1] si

anumef1(x, y) = (0, 04 · x+ 0, 5; 0, 97 · y) ,

f2(x, y) = (−y; x) .f3(x, y) = (0, 23 · x− 0, 71 · y; 0, 71 · x+ 0, 23 · y) .

Punctul initial este (0, 0).

10

Page 11: 3 - Fractali Obtinuti Prin Metoda IFS

Fractal SpiralaConstructie: Se folosesc 2 contractii pe [−2; 2]× [−2; 2] si anume

f1(x, y) = (0, 02 · x+ 0, 322 · y + 0, 2;−0, 011 · x+ 0.068 · y − 0, 85) ,

f2(x, y) = (0, 768 · x+ 0, 58 · y;−0, 55 · x+ 0, 8 · y) .Punctul initial este (0, 0).

Fractal SoareConstructie: Se folosesc 2 contractii pe [−2, 2]× [−2, 2] si anume

f1(x, y) = (−0, 1 · y; 0, 5 · x+ 0, 9) ,

f2(x, y) =(cos

π

5· x− sin π

5· y, sin π

5· x+ cos π

5· y).

Punctul initial este (0, 0).

Fractali De RhamO clasa generala de fractali se poate obtine folosind 2 contractii si anume

f1(x, y) = (0, 5 · x+ δ · y; x+ ε · y) ,

f2(x, y) = (0, 5 · x+ ξ · y + 0.5;−x+ η · y + 1) ,unde δ, ε, ξ, η sunt numere reale din intervalul [−1, 1].

Pentru a micsora numarul de puncte generate prin metoda sistemeloriterate de functii se foloseste tehnica numita jocul haosului. Astfel, dacaavem m contractii, punctele multimii An+1 se definesc alegând aleator ocontractie din cele m si aplicând-o punctelor multimii An.Uneori alegereaunei contractii nu se face în mod uniform, ca în exemplul urmator:

ALTE MODELE FRACTALE

Vom prezenta alte modele definite de contractiile:1. private punct contr1(punct p){return new punct(0.36 * p.x - 0.64 * p.y + 0.625, 0.64 * p.x + 0.36 *

p.y);}

11

Page 12: 3 - Fractali Obtinuti Prin Metoda IFS

private punct contr2(punct p){return new punct(0.255 * p.x + 0.375, 0.255 * p.y + 0.675);}private punct contr3(punct p){return new punct(0.255 * p.x + 0.125, 0.255 * p.y + 0.225);}private punct contr4(punct p){return new punct(0.255 * p.x + 0.625, 0.255 * p.y + 0.225);}.2. private punct contr1(punct p){return new punct(Math.Sin(0.45 * p.x + 0.35 * p.y), Math.Sin(-0.35 *

p.x + 0.45 * p.y));

}private punct contr2(punct p){return new punct(Math.Sin(-0.45 * p.x + 0.35 * p.y), Math.Sin(-0.35 *

p.x - 0.4 * p.y));

}private punct contr3(punct p){return new punct(Math.Sin(0.75 * p.y - 0.38), Math.Sin(- 0.65 * p.x +

0.5));}private punct contr4(punct p){return new punct(Math.Sin(0.7 * p.y - 0.35), Math.Sin(-0.6 * p.x -

0.15));}

Alta metoda de constructie a imaginilor fractale prin IFS este aplicareacontractiilor unui model dat. Pentru programare se considera un patrat

12

Page 13: 3 - Fractali Obtinuti Prin Metoda IFS

(format din pixeli) si o imagine initiala. Punctele sunt memorate într-o ma-trice booleana A. Daca un pixel din desen apartine imaginii initiale, atuncielementul din matricea corespunzatoare ia valoarea 1, altfel 0. Dupa apli-carea unui set de contractii imaginii initiale, noile elemente din matrice carese obtin iau valoarea 1 (restul devenind 0). Iata un exemplu:

bool[,] A = new bool[400, 400];bool[,] B = new bool[400, 400];private punct contr1(punct p){return new punct(p.x / 2.0, p.y / 2.0);}private punct contr2(punct p){return new punct((p.x + 400) / 2.0, p.y / 2.0);}private punct contr3(punct p){return new punct(p.x / 2.0, (p.y + 400) / 2.0);}public override void deseneaza(){init_ecran();for (int i = 0; i < 400; i++)A[i, 0] = A[0, i] = A[399, i] = A[i, 399] = true;

for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true) bmp.SetPixel(100 + i, 500 - j, Color.Blue);asteapta(2);for (int k = 1; k <= nivel; k++){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){

13

Page 14: 3 - Fractali Obtinuti Prin Metoda IFS

punct p =new punct((double)i, (double)j);B[(int)contr1(p).x, (int)contr1(p).y ] =B[(int)contr2(p).x, (int)contr2(p).y ] =B[(int)contr3(p).x, (int)contr3(p).y ] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i,j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i+j));}asteapta(2);}

}

Alte modele:

1. bool[,] A = new bool[410, 410];bool[,] B = new bool[410, 410];private punct contr1(punct p){return new punct(0.577 * p.y + 38.04, -0.577 * p.x + 235.72);}private punct contr2(punct p){return new punct(0.577 * p.y + 176.52, -0.577 * p.x + 315.72);}private punct contr3(punct p){return new punct(0.577 * p.y + 38.08, -0.577 * p.x + 395.72);}

public override void deseneaza(){

14

Page 15: 3 - Fractali Obtinuti Prin Metoda IFS

init_ecran();for (int i = 0; i < 410; i++)for (int j = 0; j < 410; j++)A[i, j] = false;for (int i = 0; i < 400; i++)A[0, i] = A[399, i] = A[i, 0] = A[i, 399] = true;

for (int i = 0; i < 410; i++)for (int j = 0; j < 410; j++)if (A[i, j] == true) bmp.SetPixel(100 + i, 500 - j, Color.Blue);asteapta(2);for (int k = 1; k <= nivel; k++){init_ecran();for (int i = 0; i < 410; i++)for (int j = 0; j < 410; j++)if (A[i, j] == true){punct p =new punct((double)i, (double)j);B[(int)contr1(p).x, (int)contr1(p).y ] =B[(int)contr2(p).x, (int)contr2(p).y ] =B[(int)contr3(p).x, (int)contr3(p).y ] = true;}for (int i = 0; i < 410; i++)for (int j = 0; j < 410; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i,j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i+j));}asteapta(2);}

2. bool[,] A = new bool[400, 400];bool[,] B = new bool[400, 400];private punct contr1(punct p){

15

Page 16: 3 - Fractali Obtinuti Prin Metoda IFS

return new punct(0.333 * p.x + 133.33, 0.333 * p.y + 266.66);}private punct contr2(punct p){return new punct(0.333 * p.y + 266.66, p.x);}private punct contr3(punct p){return new punct(-0.333 * p.y + 133.33, p.x);}

public override void deseneaza(){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)A[i, j] = false;for (int i = 0; i < 400; i++){A[0, i] = A[399, i] = A[i, 0] = A[i, 399] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true) bmp.SetPixel(100 + i, 500 - j, Color.Blue);asteapta(2);for (int k = 1; k <= nivel; k++){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p =new punct((double)i, (double)j);B[(int)contr1(p).x, (int)contr1(p).y ] =B[(int)contr2(p).x, (int)contr2(p).y ] =B[(int)contr3(p).x, (int)contr3(p).y ] = true;}for (int i = 0; i < 400; i++)

16

Page 17: 3 - Fractali Obtinuti Prin Metoda IFS

for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i,j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i+j));}asteapta(2);}

}

3. public struct punct{public double x;public double y;public punct(double x, double y){this.x = x;this.y = y;}}bool[,] A = new bool[400, 400];bool[,] B = new bool[400, 400];private punct contr1(punct p){return new punct(0.255 * p.x + 149.04, 0.255 * p.y + 268.56);}private punct contr2(punct p){return new punct(0.255 * p.x + 45.84, 0.255 * p.y + 89.28);}private punct contr3(punct p){return new punct(0.255 * p.x + 252.24, 0.255 * p.y + 89.28);}private punct contr4(punct p)

17

Page 18: 3 - Fractali Obtinuti Prin Metoda IFS

{return new punct(0.36 * p.x - 0.64 * p.y + 254.74, 0.64 * p.x + 0.36 *

p.y - 0.99);}public override void deseneaza(){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)A[i, j] = false;for (int i = 0; i < 400; i++)A[0, i] = A[399, i] = A[i, 0] = A[i, 399] = true;

for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true) bmp.SetPixel(100 + i, 500 - j, Color.Blue);asteapta(2);for (int k = 1; k <= nivel; k++){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p =new punct((double)i, (double)j);B[(int)contr1(p).x, (int)contr1(p).y ] =B[(int)contr2(p).x, (int)contr2(p).y ] =B[(int)contr3(p).x, (int)contr3(p).y ] =B[(int)contr4(p).x, (int)contr4(p).y] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i,j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i+j));}

18

Page 19: 3 - Fractali Obtinuti Prin Metoda IFS

asteapta(2);}

}

Feriga BarnsleyConstructie: Se folosesc 4 contractii pe [−5, 5]× [0, 10] si anume

f1(x, y) = (0; 0, 2 · y) ,

f2(x, y) = (0, 85 · x+ 0, 05 · y;−0, 04 · x+ 0, 85 · y + 1, 6) .f3(x, y) = (0, 2 · x− 0, 26 · y; 0, 23 · x+ 0, 22 · y + 1, 6) .

f4(x, y) = (−0, 15 · x+ 0, 28 · y; 0, 26 · x+ 0, 24 · y + 0, 44) .Punctul initial este (2, 3). Se genereaza un numar aleator între 0 si 1.

Daca numarul este cuprins în intervalul (0; 0, 05) se alege prima contractie,daca numarul este cuprins în intervalul (0, 05; 0, 86) se alege a doua con-tractie, daca numarul este cuprins în intervalul (0, 86; 0, 93) se alege a treiacontractie, iar Daca numarul este cuprins în intervalul (0, 93; 1) se alege ul-tima contractie:

public class desen : Metoda{public struct punct{public double x;public double y;public punct(double x, double y){this.x = x;this.y = y;}}public punct p = new punct();public punct p0 = new punct(2,3);private punct contr1(punct p){punct p_nou = new punct();p_nou.x = 0.0;

19

Page 20: 3 - Fractali Obtinuti Prin Metoda IFS

p_nou.y = 0.2 * p.y;return p_nou;}private punct contr2(punct p){punct p_nou = new punct();p_nou.x = 0.85 * p.x + 0.05 * p.y;p_nou.y = -0.04 * p.x + 0.85 * p.y + 1.6;return p_nou;}private punct contr3(punct p){punct p_nou = new punct();p_nou.x = 0.2 * p.x - 0.26 * p.y;p_nou.y = 0.23 * p.x + 0.22 * p.y + 1.6;return p_nou;}private punct contr4(punct p){punct p_nou = new punct();p_nou.x = -0.15 * p.x + 0.28 * p.y;p_nou.y = 0.26 * p.x + 0.24 * p.y + 0.44;return p_nou;}public override void deseneaza(){init_ecran();p = p0;Random nr_aleator = new Random();double temp;for (int n = 0; n <= 5000000; n++){int cx = (int)Math.Round((p.x - left) / dx);int cy = (int)Math.Round((p.y - bottom) / dy);bmp.SetPixel(cx, cy, Color.Green);temp = nr_aleator.NextDouble();if (temp < 0.05) p = contr1(p);else if (temp < 0.86) p = contr2(p);

20

Page 21: 3 - Fractali Obtinuti Prin Metoda IFS

else if (temp < 0.93) p = contr3(p);else p = contr4(p);}

}

}

Alte plante fractale:

public class desen : Metoda{public struct punct{public double x;public double y;public punct(double x, double y){this.x = x;this.y = y;}}public punct p = new punct();public punct p0 = new punct(0,0);private punct contr1(punct p){punct p_nou = new punct();p_nou.x = 0.0;p_nou.y = 0.5 * p.y;return p_nou;}private punct contr2(punct p){punct p_nou = new punct();p_nou.x = 0.42 * p.x - 0.42 * p.y;p_nou.y = 0.42 * p.x + 0.42 * p.y + 0.2;return p_nou;

21

Page 22: 3 - Fractali Obtinuti Prin Metoda IFS

}private punct contr3(punct p){punct p_nou = new punct();p_nou.x = 0.42 * p.x + 0.42 * p.y;p_nou.y = -0.42 * p.x + 0.42 * p.y + 0.2;return p_nou;}private punct contr4(punct p){punct p_nou = new punct();p_nou.x = -0.32 * p.x + 0.32 * p.y;p_nou.y = 0.32 * p.x + 0.32 * p.y + 0.55;return p_nou;}public override void deseneaza(){init_ecran();p = p0;Random nr_aleator = new Random();double temp;for (int n = 0; n <= 1000000; n++){int cx = (int)Math.Round((p.x - left) / dx);int cy = (int)Math.Round((top - p.y) / dy);bmp.SetPixel(cx, cy, Color.Green);temp = nr_aleator.NextDouble();if (temp < 0.10) p = contr1(p);else if (temp < 0.45) p = contr2(p);else if (temp < 0.85) p = contr3(p);else p = contr4(p);}

}

}

SUPERFRACTALI

22

Page 23: 3 - Fractali Obtinuti Prin Metoda IFS

Daca se considera mai multe seturi de contractii si la fiecare pas se alegeun anumit set pentru a se aplica multimii de puncte de la pasul respectiv seobtin superfractalii. Alegerea setului de contractii se poate face deterministsau aleator. Alegerea aleatoare conduce la imagini fractale deosebite si de omare varietate. Exemple:

1. public class desen : Metoda{public struct punct{public double x;public double y;public punct(double x, double y){this.x = x;this.y = y;}}bool[,] A = new bool[400, 400];bool[,] B = new bool[400, 400];private punct contr1_1(punct p){return new punct(p.x / 2.0, p.y / 2.0);}private punct contr1_2(punct p){return new punct((p.x + 400) / 2.0, p.y / 2.0);}private punct contr1_3(punct p){return new punct(p.x / 2.0, (p.y + 400) / 2.0);}private punct contr2_1(punct p){return new punct(0.255 * p.x + 149.04, 0.255 * p.y + 268.56);}private punct contr2_2(punct p){

23

Page 24: 3 - Fractali Obtinuti Prin Metoda IFS

return new punct(0.255 * p.x + 45.84, 0.255 * p.y + 89.28);}private punct contr2_3(punct p){return new punct(0.255 * p.x + 252.24, 0.255 * p.y + 89.28);}private punct contr2_4(punct p){return new punct(0.36 * p.x - 0.64 * p.y + 254.74, 0.64 * p.x + 0.36 *

p.y - 0.99);}public override void deseneaza(){init_ecran();for (int i = 0; i < 400; i++)A[i, 0] = A[0, i] = A[399, i] = A[i, 399] = true;

for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true) bmp.SetPixel(100 + i, 500 - j, Color.Blue);asteapta(2);Random nr_aleator = new Random();

for (int k = 1; k <= nivel; k++){int temp = nr_aleator.Next(2);if (temp == 0){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p = new punct((double)i, (double)j);B[(int)contr1_1(p).x, (int)contr1_1(p).y] =B[(int)contr1_2(p).x, (int)contr1_2(p).y] =B[(int)contr1_3(p).x, (int)contr1_3(p).y] = true;

24

Page 25: 3 - Fractali Obtinuti Prin Metoda IFS

}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i, j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i + j));}asteapta(2);}else{init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p = new punct((double)i, (double)j);B[(int)contr2_1(p).x, (int)contr2_1(p).y] =B[(int)contr2_2(p).x, (int)contr2_2(p).y] =B[(int)contr2_3(p).x, (int)contr2_3(p).y] =B[(int)contr2_4(p).x, (int)contr2_4(p).y] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i, j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i + j));}asteapta(2);}}}}

25

Page 26: 3 - Fractali Obtinuti Prin Metoda IFS

2.

public class desen : Metoda{public struct punct{public double x;public double y;public punct(double x, double y){this.x = x;this.y = y;}}bool[,] A = new bool[400, 400];bool[,] B = new bool[400, 400];private punct contr1_1(punct p){return new punct(0.333 * p.x + 133.33, 0.333 * p.y + 266.66);}private punct contr1_2(punct p){return new punct(0.333 * p.y + 266.66, p.x);}private punct contr1_3(punct p){return new punct(-0.333 * p.y + 133.33, p.x);}private punct contr2_1(punct p){return new punct(0.382 * p.x + 122.88, 0.382 * p.y + 247.5);}private punct contr2_2(punct p){return new punct(0.382 * p.x + 241.32, 0.382 * p.y + 161.76);}private punct contr2_3(punct p){return new punct(0.382 * p.x + 5.56, 0.382 * p.y + 161.76);

26

Page 27: 3 - Fractali Obtinuti Prin Metoda IFS

}private punct contr2_4(punct p){return new punct(0.382 * p.x + 50.12, 0.382 * p.y + 23.8);}private punct contr2_5(punct p){return new punct(0.382 * p.x + 196.8, 0.382 * p.y + 23.8);}private punct contr3_1(punct p){return new punct(p.x / 2.0, p.y / 2.0);}private punct contr3_2(punct p){return new punct((p.x + 400) / 2.0, p.y / 2.0);}private punct contr3_3(punct p){return new punct(p.x / 2.0, (p.y + 400) / 2.0);}private punct contr4_1(punct p){return new punct(0.255 * p.x + 149.04, 0.255 * p.y + 268.56);}private punct contr4_2(punct p){return new punct(0.255 * p.x + 45.84, 0.255 * p.y + 89.28);}private punct contr4_3(punct p){return new punct(0.255 * p.x + 252.24, 0.255 * p.y + 89.28);}private punct contr4_4(punct p){return new punct(0.36 * p.x - 0.64 * p.y + 254.74, 0.64 * p.x + 0.36 *

p.y - 0.99);}

27

Page 28: 3 - Fractali Obtinuti Prin Metoda IFS

public override void deseneaza(){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)A[i, j] = false;for (int i = 0; i < 400; i++){A[0, i] = A[399, i] = A[i, 0] = A[i, 399] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true) bmp.SetPixel(100 + i, 500 - j, Color.Blue);asteapta(2);Random nr_aleator = new Random();int temp;

for (int k = 1; k <= nivel; k++){temp = nr_aleator.Next(4);if (temp == 0){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p = new punct((double)i, (double)j);B[(int)contr1_1(p).x, (int)contr1_1(p).y] =B[(int)contr1_2(p).x, (int)contr1_2(p).y] =B[(int)contr1_3(p).x, (int)contr1_3(p).y] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i, j] == true)

28

Page 29: 3 - Fractali Obtinuti Prin Metoda IFS

bmp.SetPixel(100 + i, 500 - j, Culoare(i + j));}asteapta(2);}if (temp == 1){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p = new punct((double)i, (double)j);B[(int)contr2_1(p).x, (int)contr2_1(p).y] =B[(int)contr2_2(p).x, (int)contr2_2(p).y] =B[(int)contr2_3(p).x, (int)contr2_3(p).y] =B[(int)contr2_4(p).x, (int)contr2_4(p).y] =B[(int)contr2_5(p).x, (int)contr2_5(p).y] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i, j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i + j));}asteapta(2);}

if (temp == 2){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p = new punct((double)i, (double)j);B[(int)contr3_1(p).x, (int)contr3_1(p).y] =

29

Page 30: 3 - Fractali Obtinuti Prin Metoda IFS

B[(int)contr3_2(p).x, (int)contr3_2(p).y] =B[(int)contr3_3(p).x, (int)contr3_3(p).y] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i, j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i + j));}asteapta(2);}if (temp == 3){init_ecran();for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++)if (A[i, j] == true){punct p = new punct((double)i, (double)j);B[(int)contr4_1(p).x, (int)contr4_1(p).y] =B[(int)contr4_2(p).x, (int)contr4_2(p).y] =B[(int)contr4_3(p).x, (int)contr4_3(p).y] =B[(int)contr4_4(p).x, (int)contr4_4(p).y] = true;}for (int i = 0; i < 400; i++)for (int j = 0; j < 400; j++){A[i, j] = B[i, j];B[i, j] = false;if (A[i, j] == true)bmp.SetPixel(100 + i, 500 - j, Culoare(i + j));}asteapta(2);}}

30

Page 31: 3 - Fractali Obtinuti Prin Metoda IFS

}

31


Recommended