Fractals : Von Koch snowflake - Damien - 12-11-2013 11:08 PM
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:
with:
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};
Or (added 15/12/2013)
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)};
(added 16/12/2013)
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;
(added 18/12/13)
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.
RE: Fractales : Von Koch snowflake - ArielPalazzesi - 12-14-2013 09:03 PM
Downloading......
Thanks!
RE: Fractals : Von Koch snowflake - Damien - 12-14-2013 11:01 PM
You're welcome ! Have Fun !
regards,
Damien.
RE: Fractales : Von Koch snowflake - Mic - 12-15-2013 06:14 PM
Nice work !
RE: Fractals : Von Koch snowflake - Damien - 12-15-2013 07:07 PM
And more to come very soon!
Cheers,
Damien.
|