We are about to switch to a new forum software. Until then we have removed the registration on this forum.
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
in spanish!
http://en.wikipedia.org/wiki/Barnsley_fern
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.