%let name=peano_curve; filename odsout '.'; /* This is one that Craige Hales pointed me towards, and I tweaked/modified a little... */ %macro peano(maxdepth, xpixels, ypixels); goptions device=png; goptions xpixels=&xpixels ypixels=&ypixels; DATA GPEANO; KEEP COLOR FUNCTION X Y XSYS YSYS; ARRAY B(A) B1-B300; ARRAY C(A) C1-C300; LENGTH COLOR COLOR1-COLOR13 $8.; ARRAY ACOLOR(ICOLOR) COLOR1-COLOR13; ICOLOR = 1; ACOLOR='cxA6CEE3'; ICOLOR = 2; ACOLOR='cx1F78B4'; ICOLOR = 3; ACOLOR='cxB2DF8A'; ICOLOR = 4; ACOLOR='cx33A02C'; ICOLOR = 5; ACOLOR='cxFB9A99'; ICOLOR = 6; ACOLOR='cxE31A1C'; ICOLOR = 7; ACOLOR='cxFDBF6F'; ICOLOR = 8; ACOLOR='cxFF7F00'; ICOLOR = 9; ACOLOR='cxCAB2D6'; ICOLOR = 10; ACOLOR='cx6A3D9A'; ICOLOR = 11; ACOLOR='cyan'; ICOLOR = 12; ACOLOR='gray55'; ICOLOR = 13; ACOLOR='hotpink'; DO A=1 TO 300; /* PRECOMPUTE THE ANGLES WE NEED */ B = SIN((A - 150) * 30 * 3.1415926535 / 180); C = COS((A - 150) * 30 * 3.1415926535 / 180); END; /* A = 150; STARTING ANGLE */ /* L = 0; LEVEL OF RECURSION */ /* M = 4; MAX DEPTH, A VARIABLE, MORE THAN 5 TAKES A WHILE, and needs larger xpixels/ypixels */ /* S = 80; SCALE, 80 FILLS THE DISPLAY JUST RIGHT */ A = 150; L = 0; M = &maxdepth; /*** this is the interesting variable to change ***/ S = 80; F1 = SQRT(1 + TAN(30 * 3.1415926535 / 180) * TAN(30 * 3.1415926535 / 180)) / 6; F2 = 1 / F1; F3 = 2 / 6; F4 = 1 / F3; X = 10; Y = 75; /* START POSITION, 10,75 KEEPS IT ON THE SCREEN */ FUNCTION = 'MOVE '; XSYS = '5'; YSYS = '5'; /* WINDOW PERCENT TO START OUT */ OUTPUT; XSYS = 'B'; YSYS = 'B'; /* RELATIVE WINDOW PERCENT FOR REMAINDER */ FUNCTION = 'DRAW '; LINK IN; STOP; OUT: IF L <= 1 THEN DO; ICOLOR=MOD(ICOLOR+1,13)+1; COLOR=ACOLOR; END; L=L+1; IF L>=M THEN GOTO OUT780; S=S*F3; A=A+2; LINK IN; LINK OUT; A=A-2; LINK OUT; A=A-2; LINK OUT; S=S*F4; S=S*F1; A=A+7; LINK OUT; LINK IN ; A=A+2; LINK IN ; A=A+2; LINK IN ; S=S*F2; S=S*F3; A=A-9; LINK OUT; S=S*F4; S=S*F1; A=A+7; LINK OUT; LINK IN; S=S*F2; S=S*F3; A=A-7; LINK IN; LINK OUT; S=S*F4; GOTO OUT790; OUT780: LINK RDRAW; OUT790: L=L-1; RETURN; IN: IF L <= 1 THEN DO; ICOLOR=MOD(ICOLOR+1,13)+1; COLOR=ACOLOR; END; L=L+1; IF L>=M THEN GOTO IN780; S=S*F3; A=A-2; LINK OUT; LINK IN; A=A+2; LINK IN; A=A+2; LINK IN; S=S*F4; S=S*F1; A=A-7; LINK IN; LINK OUT; A=A-2; LINK OUT; A=A-2; LINK OUT; S=S*F2; S=S*F3; A=A+9; LINK IN; S=S*F4; S=S*F1; A=A-7; LINK IN; LINK OUT; S=S*F2; S=S*F3; A=A+7; LINK OUT; LINK IN; S=S*F4; GOTO IN790; IN780: LINK RDRAW; IN790: L=L-1; RETURN; RDRAW: /* RELATIVE DRAW */ X = S * C; Y = S * B; OUTPUT; RETURN; RUN; TITLE1 justify=left ls=1.5 " PEANO CURVE (max depth = &maxdepth)"; FOOTNOTE1 justify=left " See Mandelbrot's Book: " link="http://www.amazon.com/Fractal-Geometry-Nature-Benoit-Mandelbrot/dp/0716711869" Font="albany amt/italic" color=blue "The Fractal Geometry of Nature"; PROC GSLIDE ANNOTATE=GPEANO DES='' name="&name"; RUN; %mend; goptions border; options nocenter; ODS LISTING CLOSE; ODS HTML path=odsout body="&name..htm" (title="Mandelbrot - Peano Curve") style=htmlblue; goptions gunit=pct ftitle="albany amt/bold" ftext="albany amt" htitle=16pt htext=12pt; goptions ctext=gray33; %peano(4,800,600); %peano(5,1200,900); %peano(6,4800,3600); quit; ODS HTML CLOSE; ODS LISTING;