link graphics global part,size procedure main() size:=200 knee:=[0.30, 0.22] part:=[ [knee,[[ 0.70, 0.10],[-0.10, 0.70]]], [knee,[[ 0.20,-0.25],[ 0.25, 0.20]]], [knee,[[-0.25, 0.20],[ 0.20, 0.25]]] ] WOpen("size=" || size || "," || size,"bg=light gray") | stop("can't open window") Fg("red") every r:=!part do { drawScaled(addv(r[1], mpyvm([0,0],r[2])),addv(r[1], mpyvm([0,1],r[2]))) drawScaled(addv(r[1], mpyvm([0,0],r[2])),addv(r[1], mpyvm([1,0],r[2]))) drawScaled(addv(r[1], mpyvm([1,0],r[2])),addv(r[1], mpyvm([1,1],r[2]))) drawScaled(addv(r[1], mpyvm([0,1],r[2])),addv(r[1], mpyvm([1,1],r[2]))) } Fg("very dark green") drawRecursively([[0.0,0.0],knee]) WriteImage("lightleaf.gif",0,0,size,size) WClose() end procedure mpyvm(v,m) return [v[1]*m[1,1]+v[2]*m[2,1],v[1]*m[1,2]+v[2]*m[2,2]] end procedure addv(u,v) return [u[1]+v[1],u[2]+v[2]] end procedure drawRecursively(l) local r if integer(l[1][1]*size)=integer(l[2][1]*size) & integer(l[1][2]*size)=integer(l[2][2]*size) then { DrawPoint(l[1][1]*size,l[1][2]*size) } else { drawScaled(l[1],l[2]) every r:=!part do drawRecursively ([ addv(r[1], mpyvm(l[1],r[2])), addv(r[1], mpyvm(l[2],r[2])) ]) } return end procedure drawScaled(L,M) local K K:=L ||| M every !K *:= size DrawLine!K return end