martes, 12 de abril de 2011

Fractales y recursividad

Una de las ventajas del uso de algoritmos recursivos, es la posibilidad de resolver un problema subdividiendo este, en problemas más pequeños, como ejemplo están los fractales que son curvas que repiten su estructura básica de forma infinita, el uso de recursividad hace que el problema de programarlos sea más sencillo que usando algoritmos iterativos.
ma info en wikipedia http://es.wikipedia.org/wiki/Fractal
El siguiente es un ejemplo de código en processing

//Autor Ing Carlos Lino Rengifo

float angulo;
float x,y;
void setup()
{
  size(800,600);
  angulo = 0;
  x=120;
  y=300;
  koch(5,480);
  curvakoch(3);
 curvapeano(3);
 }
void gira(float ang)
{
  angulo+= PI*ang/180;
}
void salta(float xx, float yy)
{
   x= xx;
   y= yy;
}
void salta(float distancia)
{
  float xx = x+distancia*cos(angulo);
  float yy = y-distancia*sin(angulo);
  salta(xx,yy);
}
void traza(float distancia)
{
  float xx= x+distancia*cos(angulo);
  float yy= y-distancia*sin(angulo);
   line(int(xx),int(yy),int(x),int(y));
  salta(xx,yy);
}
void koch(int nivel, float distancia)
{
  if ( nivel == 0)
  {
    traza(distancia);
   }
  else
  {
    koch(nivel-1,distancia/3);
    //salta(distancia/3);
    gira(60.0);
  
    koch(nivel-1,distancia/3);
    //salta(distancia/3);
    gira(-120.0);
  
    koch(nivel-1,distancia/3);
    //salta(distancia/3);
    gira(60.0);  
    koch(nivel-1,distancia/3);
  }
}
void curvakoch(int orden)
{
  float distancia = (3*height-30)/(2*1.732);
  x= width/2 - distancia/2;
  y= (distancia/3)*1.732/2+5;
  salta(x,y);
  koch(orden,distancia);
  gira(-120.0);
  koch(orden,distancia);
  gira(-120.0);
  koch(orden,distancia);

}
void peano(int nivel, float distancia)
{
  if (nivel == 0)
  {
    traza(distancia);
  }
  else
  {
    peano(nivel-1,distancia/3);
    gira(-90.0);
    peano(nivel-1,distancia/3);
    gira(90.0);
    peano(nivel-1,distancia/3);
    gira(90.0);
    peano(nivel-1,distancia/3);
    peano(nivel-1,distancia/3);
    gira(90.0);
    peano(nivel-1,distancia/3);
    gira(90.0);
    peano(nivel-1,distancia/3);
    gira(90.0);
    peano(nivel-1,distancia/3);
    peano(nivel-1,distancia/3);
   }
}
void curvapeano(int orden)
{
  float distancia = width/3;
  x= width/2-height/2;
  y=width/2;
  salta(x,y);
  peano(orden,distancia);
}

No hay comentarios:

Publicar un comentario