O documento descreve o conjunto de Mandelbrot, incluindo sua definição matemática, visualização e código para gerar imagens do conjunto variando parâmetros como o centro, raio e número de cores. O texto apresenta 22 figuras geradas pelo código variando esses parâmetros e referências sobre o conjunto de Mandelbrot.
2. Definição
De modo usual
O conjunto Mandelbrot M é definido como um subconjunto de C
tal que c ∈ M se, somente se,
lim sup
n→∞
|zn| ≤ 2
onde zn, n ∈ N, é o n-ésimo termo da sequência gerada a partir de
0 e c de acordo com a seguinte equação recursiva:
z0 = 0
zn+1 = z2
n + c
3. Definição
No plano cartesiano
O conjunto Mandelbrot M pode ser visto como um subconjunto de
R2 tal que (r1, r2) ∈ M se, somente se,
lim sup
n→∞
q
x2
n + y2
n ≤ 2
onde:
x0 = 0, y0 = 0
xn+1 = x2
n − y2
n + r1
yn+1 = 2xnyn + r2
Nota-se que xn+1 e yn+1 dependem de r1 e r2, respectivamente.
5. Observações
I Pela definição, quando (r1, r2) 6∈ M, deve existir um certo
n ∈ N a partir do qual
p
x2
n + y2
n > 2.
I Computacionalmente, o cálculo de xn e yn só pode ser feito
até um número máximo de iterações nmax que é finito.
I Desde modo,
I se n ≥ nmax e
p
x2
n + y2
n ≤ 2 o ponto (r1, r2) correspondente é
declarado como pertencente a M.
I caso contrário, havendo n < nmax para o qual
p
x2
n + y2
n > 2,
o ponto é dito não pertencer a M.
I Esses fatos podem ser usados para gerar visualizações mais
informativas e agradáveis de M.
7. Mandelbrot como conjunto Fuzzy
Função caracterı́stica
Pode-se pensar na visualização padrão de M como um conjunto
fuzzy definido a partir da seguinte função caracterı́stica:
µM(r1, r2) =
n + 1
nmax
na qual n + 1 é o maior inteiro não superior a nmax tal que
p
x2
n + y2
n ≤ 2.
O valor µM(r1, r2) determina o grau de pertinência do ponto
(r1, r2) ao conjunto M, sendo µM(r1, r2) = 1 petinência total.
Cores são então usadas para representar classes de pertinência com
µM(r1, r2) < 1; o preto representa µM(r1, r2) = 1.
8. Código C
1 void p r i n t p p m p i x e l s ()
2 {
3 double r1 max = CENTER X − RADIUS ;
4 double r2 max = CENTER Y + RADIUS ;
5 double dr = (2∗RADIUS) /IMAGE SIZE ;
6
7 char ∗∗ color map = make color map (NUM COLORS) ;
8
9 f o r ( i n t p i x e l y = 0; p i x e l y < IMAGE SIZE ; p i x e l y ++) {
10 double r2 = r2 max − p i x e l y ∗ dr ;
11
12 f o r ( i n t p i x e l x = 0; p i x e l x < IMAGE SIZE ; p i x e l x ++) {
13 double r1 = r1 max + p i x e l x ∗ dr ;
14
15 p r i n t p p m p i x e l ( r1 , r2 , color map ) ;
16 }
17 p r i n t f ( ”n” ) ;
18 }
19
20 f r e e c o l o r m a p ( color map , NUM COLORS) ;
21 }
9. Código C
1
2 void p r i n t p p m p i x e l ( double r1 , double r2 , char ∗∗ color map )
3 {
4 i n t n = 0;
5
6 double xn = 0 , yn = 0 , xn sq = 0 , yn sq = 0;
7
8 w h i l e (( n < N MAX) && ( xn sq + yn sq <= 4) ) {
9 n++;
10
11 yn = 2∗xn∗yn + r2 ;
12 xn = xn sq − yn sq + r1 ;
13
14 xn sq = xn∗xn , yn sq = yn∗yn ;
15 }
16
17 p r i n t f ( ”%s ” ,
18 color map [ n < N MAX ? n % NUM COLORS : NUM COLORS] ) ;
19 }
10. Código C
1
2 char ∗∗ make color map ( s i z e t s i z e )
3 {
4 double base [ ] [ 3 ] = {
5 // base RGB i n t e n s i t i e s : th e se were d e f i n e d with the help of
6 // http :// jdherman . github . i o / colormap /
7 {0.23 , 0.12 , 0.34} , {0.11 , 0.29 , 0.61} , {0.00 , 0.46 , 0.88} ,
8 {0.32 , 0.72 , 0.93} , {0.65 , 0.98 , 1.00} , {0.82 , 0.82 , 0.50} ,
9 {1.00 , 0.65 , 0.00} , {0.66 , 0.42 , 0.14} , {0.33 , 0.19 , 0.28}
10 };
11 char buf [ 2 5 ] ;
12
13 char ∗∗ map = ( char ∗∗) malloc (( s i z e + 1)∗ s i z e o f ( char ∗) ) ;
14 a s s e r t (map) ;
15
16 f o r ( i n t i = 0; i < s i z e ; i ++) {
17 double f r a c = 8.0∗ i / s i z e ;
18 i n t j = f r a c ; f r a c −= j ;
19
20 // s e t RGB componentes by i n t e r p o l a t i n g l i n e a r l y the base v a l u e s
21 i n t R = (( base [ j +1][0] − base [ j ] [ 0 ] ) ∗ f r a c+base [ j ] [ 0 ] ) ∗PPM MAXVAL;
22 i n t G = (( base [ j +1][1] − base [ j ] [ 1 ] ) ∗ f r a c+base [ j ] [ 1 ] ) ∗PPM MAXVAL;
23 i n t B = (( base [ j +1][2] − base [ j ] [ 2 ] ) ∗ f r a c+base [ j ] [ 2 ] ) ∗PPM MAXVAL;
24
25 s p r i n t f ( buf , ”%d %d %d” , R, G, B) ;
26 map [ i ] = strdup ( buf ) ;
27 a s s e r t (map [ i ] ) ;
28 }
29 map [ s i z e ] = ”0 0 0” ;
30
31 r e t u r n map ;
32 }
11. Código C
1
2 void f r e e c o l o r m a p ( char ∗∗ map , s i z e t s i z e )
3 {
4 i f (map == NULL) r e t u r n ;
5
6 f o r ( i n t i =0; i <s i z e ; i ++)
7 f r e e (map [ i ] ) ;
8
9 f r e e (map) ;
10 }