link graphics global part,size procedure main() size:=400 knee:=[0.30, 0.22] part:=[ [knee,[[ 0.20,-0.25],[ 0.25, 0.20]]], [knee,[[-0.25, 0.20],[ 0.20, 0.25]]], [knee,[[ 0.70, 0.10],[-0.10, 0.70]]] ] 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=very light gray") | stop("can't open window") Fg("light weak green") drawRecursively([[0.0,0.0],knee]) WriteImage("lightfern.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 { every r:=!part do drawRecursively ([ addv(r[1], mpyvm(l[1],r[2])), addv(r[1], mpyvm(l[2],r[2])) ]) DrawLine(l[1][1]*size,l[1][2]*size, l[2][1]*size,l[2][2]*size) } return end