PROGRAM snowflake; { SNOWFLAKE FRACTAL - by Tim Meekins - April 9, 1986 } { Requires DIABLO.LIB for graphics routines. } TYPE a6 = ARRAY[0..6] of integer; CONST sd : a6 = (0,1,1,0,0,0,1); rd : a6 = (0,0,7,10,0,2,2); VAR dx,dy : ARRAY[0..11] of real; ln : ARRAY[0..6] of real; sn : a6; a,mx,my,l,x,y : real; tl,i,ns,c : integer; nc : byte; finished,correct : boolean; {$i diablo.lib} BEGIN FOR c := 0 TO 6 DO ln[c] := 1 / 3; ln[2] := sqrt(ln[1]); a := 0; FOR c := 6 TO 11 DO BEGIN dx[c] := cos(a); dy[c] := sin(a); dx[c-6] := -dx[c]; dy[c-6] := -dy[c]; a := a + 0.52359879 END; mx := 1.33; my := 0.5; finished := false; WHILE NOT finished DO BEGIN correct := false; WHILE NOT correct DO BEGIN write('Enter number of cycles (1 - 6) >'); readln(nc); IF nc=0 THEN BEGIN finished := true; correct := true END ELSE BEGIN nc := abs(nc); correct := (nc >= 1) AND (nc <= 6); IF NOT correct THEN writeln('ERROR: Cycles must be 1 - 6') END END; IF NOT finished THEN BEGIN init_diablo; x := 534; y := 140; tl := 324; plot(round(x),round(y)); FOR c := 0 TO nc DO sn[c] := 0; WHILE (sn[0] = 0) AND (NOT keypressed) DO BEGIN i := 0; l := tl; ns := 0; FOR c := 1 TO nc DO BEGIN l := l * ln[sn[c]]; ns := ns + sd[sn[c-1]]; IF (ns mod 2) = 1 THEN i := i + 12 - rd[sn[c]] ELSE i := i + rd[sn[c]]; i := i mod 12 END; x := x + mx * l * dx[i]; y := y - my * l * dy[i]; sn[nc] := sn[nc] + 1; drawto(round(x),round(y)); FOR c := nc DOWNTO 1 DO IF sn[c] = 7 THEN BEGIN sn[c] := 0; sn[c-1] := sn[c-1] +1 END END END END; reset_diablo END.