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