Repetición: ejercicio de dibujar un círculo fractal (solución)

March 27, 2008 – 9:05 am

Aquí tenéis una solución para el ejercicio de la semana anterior:

   Downloaddownload.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
void circuloFractalSimple(float radio){
  // Si el circulo que debemos dibujar
  // es demasiado pequeño, salimos de la recursion
  if(radio < 8){
    return;
  }
 
  // Dibujamos nuestro circulo
  ellipse(0, 0, radio, radio);
 
  // Guardamos nuestro estado
  // Esto es necesario porque
  // sino acumulamos todas los movimientos (translate)
  pushMatrix();
 
  // Nos movemos al centro del circulo secundario de la derecha
  translate(radio / 4, 0);
 
  // Dibujamos el circulo secundario de la derecha
  // El circulo siguiente sera de tamaño la mitad que el de ahora
  circuloFractalSimple(radio / 2);
 
  // Volvemos a nuestro estado
  // Para no acumular los movimientos (translates)
  popMatrix();
 
  // Guardamos nuestro estado
  pushMatrix();
 
  // Nos movemos al centro del circulo secundario de la izquierda
  translate(-radio / 4, 0);
 
  // Dibujamos el circulo secundario de la izquierda
  circuloFractalSimple(radio / 2);
 
  // Volvemos a nuestro estado
  popMatrix();
}
 
void setup(){
  // Definimos la talla de nuestra pantalla
  size(500, 500); 
 
  // Pintamos el fondo de blanco
  background(255);
 
  // Cogemos el lapiz negro
  stroke(0);
 
  // Nos situamos a bajo (y=height) y al centro de la pantalla (x=width/2)
  translate(width/2, height/2);
 
  // Dibujamos un circulo inicial de 400 pixeles
  circuloFractalSimple(400);
 
  saveFrame("circuloFractalSimple.jpg");
}

Y aquí tenéis una solución para la versión más compleja:

   Downloaddownload.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
void circuloFractal(float radio, boolean negro){
  // Si el circulo que debemos dibujar
  // es demasiado pequeño, salimos de la recursion
  if(radio < 8){
    return;
  }
 
  // Dejamos el lapiz
  noStroke();
  // Cogemos el pincel (para rellenar)
  if(negro){
    // De color negro si el parametro negro es verdadero
    fill(0);
  }else{
    // De color blanco si el parametro negro es falso
    fill(255);
  }
 
  // Dibujamos nuestro circulo
  ellipse(0, 0, radio, radio);
 
  // Guardamos nuestro estado
  // Esto es necesario porque
  // sino acumulamos todas los movimientos (translate)
  pushMatrix();
 
  // Nos movemos al centro del circulo secundario de la derecha
  translate(radio / 4, 0);
 
  // Dibujamos el circulo secundario de la derecha
  // Con el color invertido
  // "!" es el operador "negacion"
  // si el circulo de ahora era negro, el siguiente no lo sera
  // El circulo siguiente sera de tamaño la mitad que el de ahora
  circuloFractal(radio / 2, !negro);
 
  // Volvemos a nuestro estado
  // Para no acumular los movimientos (translates)
  popMatrix();
 
  // Guardamos nuestro estado
  pushMatrix();
 
  // Nos movemos al centro del circulo secundario de la izquierda
  translate(-radio / 4, 0);
 
  // Dibujamos el circulo secundario de la izquierda
  circuloFractal(radio / 2, !negro);
 
  // Volvemos a nuestro estado
  popMatrix();
}
 
void setup(){
  // Definimos la talla de nuestra pantalla
  size(500, 500); 
 
  // Pintamos el fondo de blanco
  background(255);
 
  // Nos situamos a bajo (y=height) y al centro de la pantalla (x=width/2)
  translate(width/2, height/2);
 
  // Dibujamos un circulo inicial de 100 pixeles y de color negro (negro = true)
  circuloFractal(400, true);
 
  saveFrame("circuloFractal.jpg");
}

Post a Comment