fern fractal

edited February 2014 in Using Processing

Hi, Im trying to make a code that generate a fern fractal, I´ve used this web page [http://fermat.usach.cl/~dinamicos/fractal.pdf], and it draws something with a fractal appearance, but is not the fern. I dont see the mistake. Here´s the code

       float factor = 400;
float desplazamientox =300;
int nivelmax = 8;
PVector v1,v2,v3,v4;

class Cuadro{
  PVector [] punto = new PVector[4];
  Cuadro(PVector p1, PVector p2, PVector p3, PVector p4){
    punto[0] = p1;
    punto[1] = p2;
    punto[2] = p3;
    punto[3] = p4;
  } 
 Cuadro transforma1(){ 
   Cuadro nuevoCuadro;
   PVector [] puntoNuevo = new PVector[4];
   puntoNuevo[0] = new PVector(0.85*punto[0].x + 0.04 * punto[0].y+0.08, -0.04*punto[0].x+0.85 * punto[0].y +0.18);
   puntoNuevo[1] = new PVector(0.85*punto[1].x + 0.04 * punto[1].y+0.08, -0.04*punto[1].x+0.85 * punto[1].y +0.18);
   puntoNuevo[2] = new PVector(0.85*punto[2].x + 0.04 * punto[2].y+0.08, -0.04*punto[2].x+0.85 * punto[2].y +0.18);
   puntoNuevo[3] = new PVector(0.85*punto[3].x + 0.04 * punto[3].y+0.08, -0.04*punto[3].x+0.85 * punto[3].y +0.18);   
   nuevoCuadro = new Cuadro(puntoNuevo[0],puntoNuevo[1], puntoNuevo[2], puntoNuevo[3]);
   return nuevoCuadro;
 } 
 Cuadro transforma2(){ 
   Cuadro nuevoCuadro;
   PVector [] puntoNuevo = new PVector[4];
   puntoNuevo[0] = new PVector(0.2*punto[0].x - 0.26 * punto[0].y + 0.4, 0.23*punto[0].x+0.22 * punto[0].y +0.05);
   puntoNuevo[1] = new PVector(0.2*punto[1].x - 0.26 * punto[1].y+ 0.4, 0.23*punto[1].x+0.22 * punto[1].y +0.05);
   puntoNuevo[2] = new PVector(0.2*punto[2].x - 0.26 * punto[2].y+ 0.4, 0.23*punto[2].x+0.22 * punto[2].y +0.05);
   puntoNuevo[3] = new PVector(0.2*punto[3].x - 0.26 * punto[3].y+ 0.4, 0.23*punto[3].x+0.22 * punto[3].y +0.05);   
   nuevoCuadro = new Cuadro(puntoNuevo[0],puntoNuevo[1], puntoNuevo[2], puntoNuevo[3]);
   return nuevoCuadro;
 } 
  Cuadro transforma3(){ 
   Cuadro nuevoCuadro;
   PVector [] puntoNuevo = new PVector[4];
   puntoNuevo[0] = new PVector(-0.15*punto[0].x + 0.28 * punto[0].y + 0.57, 0.26*punto[0].x+0.24 * punto[0].y -0.12);
   puntoNuevo[1] = new PVector(-0.15*punto[1].x + 0.28 * punto[1].y + 0.57, 0.26*punto[1].x+0.24 * punto[1].y -0.12);
   puntoNuevo[2] = new PVector(-0.15*punto[2].x + 0.28 * punto[2].y + 0.57, 0.26*punto[2].x+0.24 * punto[2].y -0.12);
   puntoNuevo[3] = new PVector(-0.15*punto[3].x + 0.28 * punto[3].y + 0.57, 0.26*punto[3].x+0.24 * punto[3].y -0.124);
   nuevoCuadro = new Cuadro(puntoNuevo[0],puntoNuevo[1], puntoNuevo[2], puntoNuevo[3]);
   return nuevoCuadro;
 }
 Cuadro transforma4(){ 
   Cuadro nuevoCuadro;
   PVector [] puntoNuevo = new PVector[4];
   puntoNuevo[0] = new PVector(0.5, 0.16 * punto[0].y);
   puntoNuevo[1] = new PVector(0.5, 0.16 * punto[1].y);
   puntoNuevo[2] = new PVector(0.5, 0.16 * punto[2].y);
   puntoNuevo[3] = new PVector(0.5, 0.16 * punto[3].y);
   nuevoCuadro = new Cuadro(puntoNuevo[0],puntoNuevo[1], puntoNuevo[2], puntoNuevo[3]);
   return nuevoCuadro;
 }
 void dibuja(){
   PVector [] puntodibujo = new PVector[4];
   for(int i = 0; i < 4; i++){
     puntodibujo[i] = new PVector(punto[i].x * factor+desplazamientox, punto[i].y * factor); 

   }
   /*println(puntodibujo[0].x);
    println(puntodibujo[0].y);
     println(puntodibujo[1].x);
      println(puntodibujo[1].y);
       println(puntodibujo[2].x);
        println(puntodibujo[2].y);
         println(puntodibujo[3].x);
          println(puntodibujo[3].y);*/
   quad(puntodibujo[0].x,puntodibujo[0].y,puntodibujo[1].x,puntodibujo[1].y,puntodibujo[2].x,puntodibujo[2].y,puntodibujo[3].x,puntodibujo[3].y);
 }  
}
void setup(){
  size(700,700);
  fill(150);
  noStroke();
  noLoop();

}
void draw(){
  v1 = new PVector(0,0);
  v2 = new PVector(0,1);
  v3 = new PVector(1,1);
  v4 = new PVector(1,0);

  Cuadro primero = new Cuadro(v1,v2,v3,v4);
  dibujaFractal(primero, 1);
  //primero.dibuja();

}
void dibujaFractal(Cuadro primero, int nivel){
    Cuadro segundo = primero.transforma1();
    Cuadro tercero = primero.transforma2();
    Cuadro cuarto = primero.transforma3();
    Cuadro quinto = primero.transforma3();
  if (nivel < nivelmax){
    dibujaFractal(segundo, nivel + 1);
    dibujaFractal(tercero, nivel + 1);
    dibujaFractal(cuarto, nivel + 1);
    dibujaFractal(quinto, nivel + 1);
  }
  else
  {

    /*println (primero.punto[1].y);
    println (segundo.punto[0].y);
    println (segundo.punto[0].x);
    println (segundo.punto[0].y);
    println (segundo.punto[1].x);
    println (segundo.punto[1].y);*/
    segundo.dibuja();
    tercero.dibuja();
    cuarto.dibuja();
    quinto.dibuja();
  }
}

Answers

  • What does this code do? What do you want it to do? You say you can't see the mistake. How do you know you have a mistake?

  • This code is suposed to draw a fern fractal as is explained in the link, and it doesnt

  • There is nice fern fractal sketch on openprocessing

  • edited February 2014

    as is explained in the link

    in spanish!

    http://en.wikipedia.org/wiki/Barnsley_fern

  • edited February 2014

    Saying "it doesn't" isn't really a helpful question, in the same way that "well then make it do it" wouldn't be a helpful answer. What does it do instead? At what point does the code's execution differ from your expectations? You might have to trace through this with a piece of paper and a pencil, or at least add some print statements to figure that out.

  • And for some very concise code here is another fractal fern in contextfreeart, a programming environment particulary well suited to recursion and fractals.

Sign In or Register to comment.