HP Forums
Fractals : Von Koch snowflake - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Software Libraries (/forum-10.html)
+--- Forum: HP Prime Software Library (/forum-15.html)
+--- Thread: Fractals : Von Koch snowflake (/thread-31.html)



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:
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};

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...... Wink

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.