Fractals : Von Koch snowflake
12-11-2013, 11:08 PM (This post was last modified: 12-22-2013 07:58 AM by Damien.)
Post: #1 Damien Junior Member Posts: 29 Joined: Dec 2013
Fractals : Von Koch snowflake
Hi everyone,

This small program draws some simple fractals.
The K parameter controls the curve complexity.
Change K value from 0 (3 segments drawn), to 6 (12288 segments drawn).

Code:
 EXPORT VON_KOCH_SNOWFLAKES() BEGIN  LOCAL T2,T1,AA,LL,a,l,L0;  LOCAL Xi,Yi,X1,Y1,X0,Y0;  LOCAL XA,YA,XD,YD,A0,II;  LOCAL x,y,NP; // Init parameters  HAngle:=0; // RAD  M:=3;  N:=4;  K:=5; // change K from 0 to 6 (or 7 if you are very very... patient)  NP:=208; // Point coordinates of the starting curve  x:={0,NP,NP/2,0};  y:={√3/2*NP,√3/2*NP,0,√3/2*NP}; // Model segments Length  l:={1/3,1/3,1/3,1/3}; // Segments angle with the horizontal  a:={0,π/3,−π/3,0}; // Black screen  RECT_P(#383838h); // Main loop   FOR II:=1 TO M DO // Calculate starting and ending point of segment number II   XD:=x(II); YD:=y(II);   XA:=x(II+1); YA:=y(II+1);   X0:=XD; Y0:=YD;   IF XA<>XD THEN     A0:=ATAN((YA−YD)/(XA−XD)) ;   ELSE     A0:=π/2*SIGN(YA−YD);    END;   IF (XA−XD)<0 THEN A0:=A0+π; END;   L0:=√((XA−XD)²+(YA−YD)²); // Move the pen to its starting place   Xi:=IP(X0); Yi:=IP(Y0); //secondary loop: each time it pass through, an elementary segment is plotted.   FOR I:=0 TO N^K−1 DO // so there is  N^K segments to draw (M time)    LL:=L0; AA:=A0 ; T1:=I;     IF K<>0 THEN       FOR J:=K−1 DOWNTO 0 STEP 1 DO       R:=N^J; T2:=IP(T1/R);       AA:=AA+a(T2+1); // angle for segment number I       LL:= LL*l(T2+1); // length for segment number I        T1:=T1−T2*R;      END; // NEXT J     END; // Time to draw     X0:=X0+LL*COS(AA);      Y0:=Y0+LL*SIN(AA);     X1:=IP(X0); Y1:=IP(Y0);     LINE_P(Xi,Yi,X1,Y1,RGB(240,230,0)); // orange     Xi:=X1; Yi:=Y1;    END; // NEXT I   END; // NEXT II   WAIT(-1); END;

Now if you want the fractal to grow inside the triangle replace the line:
Code:
x:={0,NP,NP/2,NP}
with:
Code:
x:={NP,0,NP/2,NP}
and you've got another variant of the Von Koch snowflake.

For something a little different, you can remplace the init parameters with:
Code:
  M:=4; N:=4; K:=5;  NP:=208;  x:={0,NP,NP,0,0};  y:={0,0,NP,NP,0};  l:={1/(2+2*COS(.45*π)),1/(2+2*COS(.45*π)),1/(2+2*COS(.45*π)),1/(2+2*COS(.45*π))};  a:={0,.45*π,−.45*π,0};
or
Code:
  M:=4; N:=4; K:=6;  NP:=208;  x:={0,NP,NP,0,0};  y:={0,0,NP,NP,0};  l:={1/(2+2*COS(.48*π)),1/(2+2*COS(.48*π)),1/(2+2*COS(.48*π)),1/(2+2*COS(.48*π))};  a:={0,.48*π,−.48*π,0};

or
Code:
  M:=1; N:=4; K:=6;  NP:=208;  x:={0,0};  y:={NP,-NP};  l:={1/3,1/3,√10/9,5/9};  a:={0,π/2,−ATAN(3),0};

Code:
  M:=2; N:=2; K:=12;  NP:=240;  x:={NP/2,NP/2,NP/2};  y:={NP/4,3*NP/4,NP/4};  l:={1/√2,1/√2};  a:={π/4,−π/4)};

Now lets try to cut corners. The segments drawing will now be replaced by arcs of ellipse.
The basic program is the same, with only the addition of few extra lines of code.
The S parameter controls the smoothness of the rounding, the K parameter controls the complexity degree of the curve.
Code:
 EXPORT Rounded_Fractal() BEGIN LOCAL T2,T1,AA,LL,a,l,L0; LOCAL Xi,Yi,X1,Y1,X0,Y0; LOCAL XA,YA,XD,YD,A0,II; LOCAL x,y,NP,X2,Y2,VX,VY; LOCAL WX,WY,K4,XQ,YQ,AN; HAngle:=0; // RAD  // init parameters  M:=2; N:=4; K:=6; S:=3;  NP:=240;  x:={0,NP,0};  y:={NP,0,NP};  l:={1/2,.45,.45,.5};  a:={0,π/2,−π/2,0}; // Clear screen  RECT_P(#383838h); // main loop   FOR II:=1 TO M DO   XD:=x(II); YD:=y(II);   XA:=x(II+1); YA:=y(II+1);   X0:=XD; Y0:=YD; X1:=X0; Y1:=Y0;   X2:=X0; Y2:=Y0;     IF XA<>XD THEN     A0:=ATAN((YA−YD)/(XA−XD)) ;   ELSE     A0:=π/2*SIGN(YA−YD);    END;   IF (XA−XD)<0 THEN A0:=A0+π; END;    L0:=√((XA−XD)²+(YA−YD)²);    FOR I:=0 TO N^K−1 DO     LL:=L0; AA:=A0 ; T1:=I;     IF K<>0 THEN       FOR J:=K−1 DOWNTO 0 STEP 1 DO       R:=N^J; T2:=IP(T1/R);       AA:=AA+a(T2+1); LL:= LL*l(T2+1);       T1:=T1−T2*R;      END; // NEXT J     END;     X0:=X1; Y0:=Y1; X1:=X2; Y1:=Y2;     X2:=X2+LL*COS(AA);Y2:=Y2+LL*SIN(AA);     VX:=X1-X0; VY:=Y1-Y0;     WX:=X2-X1; WY:=Y2-Y1;      FOR K4:=0 TO S DO      AN:=π/2*K4/S;      XQ:=(X0+X2-COS(AN)*WX+SIN(AN)*VX)/2;      YQ:=(Y0+Y2-COS(AN)*WY+SIN(AN)*VY)/2;      IF I==0 THEN         Xi:=IP(X0); Yi:=IP(Y0);      END;      IF I>0 THEN       LINE_P(Xi,Yi,IP(XQ),IP(YQ),RGB(240,230,0));        Xi:=IP(XQ); Yi:=IP(YQ);      END;    END; // NEXT K4   END; // NEXT I  END; // NEXT II  WAIT(-1); END;

Lets change some init parameters like so:
Code:
  M:=1; N:=13; K:=3; S:=4;  NP:=240;  x:={0,NP};  y:={NP,0};  l:={.4,.4,.2,.2,.2,.2,.4,.4,.2,.2,.2,.2,.2};  a:={0,π/2,0,−π/2,0,−π/2,-π,−π/2,0,π/2,0,π/2,0};

Cheers,

Damien.
12-14-2013, 09:03 PM
Post: #2
 ArielPalazzesi Member Posts: 90 Joined: Dec 2013
RE: Fractales : Von Koch snowflake
Downloading...... Thanks!
12-14-2013, 11:01 PM (This post was last modified: 12-18-2013 10:15 PM by Damien.)
Post: #3 Damien Junior Member Posts: 29 Joined: Dec 2013
RE: Fractals : Von Koch snowflake
You're welcome ! Have Fun !

regards,

Damien.
12-15-2013, 06:14 PM
Post: #4
 Mic Member Posts: 131 Joined: Dec 2013
RE: Fractales : Von Koch snowflake
Nice work !

12-15-2013, 07:07 PM (This post was last modified: 12-18-2013 10:16 PM by Damien.)
Post: #5 Damien Junior Member Posts: 29 Joined: Dec 2013
RE: Fractals : Von Koch snowflake
And more to come very soon!

Cheers,

Damien.
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)