-----------------------------

to main ; Fern by Bill Beaumont with thanks to Bill Kerr
3d_frame
sphc -30 -94 0 2 draw 305
end

to draw :size
if :size<5[stop]
fd :size/25         ; trunk
lt 80 draw :size*.3 ; left branch
rt 82 fd   :size/25
rt 80 draw :size*.3 ; rite branch
lt 78 draw :size*.9 ; spine
lt  2 bk   :size/25
lt  2 bk   :size/25
end

to procs
ed[main draw procs]
end
-----------------------

to main ; Tree
3d_frame
sp 0 -45 do 75 4
bk 40
end

to do :size :level
if :level<1[setpc 4 label "* setpc 2 stop]
lt 25
fd :size do .5*:size :level-1 bk :size       ; left branch
rt 20
fd .6*:size do .6*:size :level-1 bk .6*:size ; scnd branch
rt 25
fd .5*:size do .6*:size :level-1 bk .5*:size ; thrd branch
rt 25
fd .5*:size do .6*:size :level-1 bk .5*:size ; rite branch
lt 45
end

to procs
ed[main do procs]
end
---------------------

to main ; Stars
3d_frame
sph 18 -30 -15 draw 25 4
end

to draw :size :level
if :level<1[stop]
repeat 6[shape]
end

to shape
setpc 7-:level
fd :size rt 90
fd :size rt 30
draw :size/2 :level-1
lt 180
end

to procs
ed[main draw shape procs]
end
------------------------

to main ; Peano
3d_frame
sphc 92 -92 0 6 draw 6 90 5
end

to draw :size :ang :level
if :level<1[stop]
lt :ang
draw :size -:ang :level-1 fd :size rt :ang
draw :size  :ang :level-1 fd :size
draw :size  :ang :level-1 rt :ang fd :size
draw :size -:ang :level-1 lt :ang
end

to procs
ed[main draw procs]
end
---------------------

to main ; Dragons
3d_frame
dragons
end

to dragons
for[i 1 4][
    sph 0 0 :i*90
    setpc :i
    dragon 9 90 4]
end

to dragon :level :turn :size
if :level<1[fd :size stop]
dragon :level-1  90 :size
rt :turn
dragon :level-1 -90 :size
end

to procs
ed[main dragons dragon procs]
end
-----------------------------

to main ; Bush
3d_frame
sp -20 -85 bush 60 11
end

to bush :size :level
if :level<1[stop]
setpc 1+random 7 fd :size
rt 75 bush :size/1.5 :level-1
lt 90 bush :size/1.5 :level-1
rt 15 bk :size
end

to procs
ed[main bush procs]
end
-------------------------

to main ; Tris
3d_frame
sphc -98 -86 30 15 do 195 6
end

to do :size :level
if :level<1[stop]
repeat 3[shape rt 120]
fill_it
end

to shape
do :size/2 :level-1
fd :size
end

to fill_it
setfc 7-:level
rt 30 pu fd .6*:size
fill
bk .6*:size pd lt 30
end

to procs
ed[main do shape fill_it procs]
end
-------------------------

to main ; Disks
3d_frame
sphc -19 -11 0 6 do 22 3
end

to do :size :level
if :level<1[stop]
repeat 6[draw rt 60]
end

to draw
fd :size rt 60 fd :size bk :size
arch lt 60
rt 180 do :size :level-1 rt 180
end

to arch
rt 180 setpc 4
arc 121 3*:size/4
arc 121   :size/4
lt 180 setpc 6
fill_it
end

to fill_it
setfc heading+1
pu rt 60 fd :size/2
fill
bk :size/2 lt 60 pd
end

to procs
ed[main do draw arch fill_it procs]
end
--------------------

to main ; Chess by Yehoshua Yelin
3d_frame
sphc -80 -80 0 4 chess 160 4
end

to chess :size :level
if :level<1[stop]
repeat 4[draw]
fill_it
end

to draw
fd :size rt 90
chess :size/2 :level-1
end

to fill_it
setfc ifelse memberp heading[0 180][1][6]
pu rt 45 fd 5
fill
bk 5 lt 45 pd
end

to procs
ed[main chess draw fill_it procs]
end
--------------------

to main ; GingerMan
3d_frame
pu draw 0 -.9
end

to draw :x :y
setxy :x+8 :y+8
setpixel 4
draw 17-:y+abs :x :x
end

to procs
ed[main draw procs]
end
--------------------

to main ; Lattice
3d_frame
sphc 6 14 0 [130 130 130] draw 19 9 3
sphc 7 14 0 [170 170 170] draw 19 9 3
sphc 8 14 0 [255 255 255] draw 19 9 3
end

to draw :long :wide :count
repeat 6[shape :long :wide :count rt 60]
end

to shape :long :wide :count
if :count<1[stop]
repeat 2[fd :long rt 120 fd :wide rt 60]
lt 120
draw :long :wide :count-1
rt 120
fd :wide lt 120 fd :long
end

to procs
ed[main draw shape procs]
end
--------------------

to main ; Lasvegas
3d_frame
sphc -7 -20 0 3 draw 10 4
end

to draw :size :level
if :level<1[stop]
repeat 3[shape rt 120]
fill_it
end

to shape
fd :size lt 60
fd :size rt 60
fd :size
rt 180 draw :size :level-1 rt 180
draw :size :level-1
end

to fill_it
setfc 4
pu rt 22 fd 4 fill bk 4 lt 22 pd
end

to procs
ed[main draw shape fill_it procs]
end
--------------------

to main ; Sixes
3d_frame
sph 48 -83 -90 draw 96 4
end

to draw :size :level
if :level<1[stop]
repeat 3[shape rt 60]
fill_it
end

to shape
pu rt 60 fd 4 lt 60 pd
draw :size/2-3 :level-1
setpc 7
pu rt 60 bk 4 lt 60 pd
fd :size rt 60 fd :size
end

to fill_it
setfc 7-:level
pu rt 60 fd 2
fill
bk 2 lt 60 pd
end

to procs
ed[main draw shape fill_it procs]
end
--------------------

to main ; Sqr
3d_frame
sp -88 -88
repeat 4[draw 0 lt 90]
end

to draw :size
if :size>86[move stop]
move
pu rt 90 fd 4 lt 90 pd
draw :size+4
pu rt 90 fd 4 lt 90 pd
move
end

to move
setpc 1+remainder :size 15
fd :size bk :size
end

to procs
ed[main draw move procs]
end
--------------------

to main ; Triangs
3d_frame
sphc 0 -84 -30 14
do 128 5
end

to do :size :level
if :level<1[stop]
repeat 3[shape rt 120]
fill_it
end

to shape
fd .75*:size rt 180
do .5*:size :level-1
rt 180 fd .25*:size
end

to fill_it
pu rt 30 fd :size/2
setfc 3+2*:level fill
bk :size/2 lt 30 pd
end

to procs
ed[main do shape fill_it procs]
end
--------------------

to main ; Grill
3d_frame
setpensize[3 3]setpc 1 do 21 4
setpensize[1 1]setpc 3 do 21 4
do 21 4
end

to do :size :level
if :level<1[stop]
repeat 4[draw rt 90]
end

to draw
arc2 90 :size lt 90
do :size :level-1
rt 180
arc2 90 :size lt 90
end

to procs
ed[main do draw procs]
end
--------------------

to main ; Circles
3d_frame
sph -58 19 18.6 draw 60 4
end

to draw :size :level
if :level=0[stop]
repeat 4[shape rt 90]
end

to shape
setpensize se :level :level
setpc 7-:level
arc2 90 :size
lt 90
draw :size/2 :level-1
end

to procs
ed[main draw shape procs]
end
--------------------

to main ; Penrose by Mike Sandy
setpc 1 pu
draw 50 4
end

to draw :size :level
localmake "ang 36
localmake "tau (1+sqrt 5)/2
bk :size*:tau
rt 2*:ang
;small :size :level
;large :size :level
pent :size :level
end

to pent :l :n
if :n=0 [pu stop]
;; draw central pattern
repeat 5[lt :ang large :l :n rt :ang
  fd :l lt :ang fd :l lt :ang]
end

to large :l :n
if :n=0 [pu stop]
if :n=1 [pd]
fd :l lt 2*:ang
np
lt :ang small :l/:tau :n-1
rp
fd :l lt 3*:ang
np
lt :ang large :l/:tau :n-1
rt 2*:ang large :l/:tau :n-1
rp
fd :l
np
small :l/:tau :n-1 rt :ang bk :l/:tau
lt :ang large :l/:tau :n-1
rp
lt 2*:ang
fd :l lt 3*:ang
pu
if :n=1 [np lt 20 fd 5 setfc 4 fill rp]
end

to small :l :n
if :n=0 [pu stop]
if :n=1 [pd]
np
rt :ang large :l/:tau :n-1
np
lt 3*:ang fd :l/:tau rt 180
small :l/:tau :n-1
rt 4*:ang small :l/:tau :n-1
rp
lt 4*:ang large :l/:tau :n-1
rp
fd :l lt 4*:ang fd :l lt :ang
fd :l lt 4*:ang fd :l lt :ang
pu
if :n=1 [np lt 20 fd 5 setfc 2 fill rp]
end

to np
make "penf 0
localmake "coord.posn (list  xcor ycor heading)
ifelse pendownp [make "coord.posn fput 1 :coord.posn]~
                [make "coord.posn fput 0 :coord.posn]
push "coord.stack :coord.posn
end

to rp
pu
localmake "coord.posn pop "coord.stack
make "penf first :coord.posn
make "coord.posn butfirst :coord.posn
setpos butlast :coord.posn
setheading last :coord.posn
if :penf=1 [pd]
end

Make "coord.stack[]
--------------------

to main ; et_mask
3d_frame
pu draw 0 -.9
end

to draw :x :y
setxy :x+8 :y+8
setpixel distance[0 0]
draw 17-:y-abs :x :x
end

to procs
ed[main draw procs]
end
--------------------

to main ; Fence 
3d_frame
setpensize[3 3] setpc 4 draw 10 3
setpensize[1 1] setpc 7 draw 10 3
erall
end 

to draw :size :level 
if :level<1[stop] 
repeat 3[lt 60 shape rt 180] 
end 

to shape
fd :size lt 60 fd :size rt 60 
fd :size lt 60 fd :size
draw :size :level-1   ; recursion
bk :size rt 120 fd :size rt 60 
fd :size lt 60 fd :size
draw :size :level-1   ; recursion
bk :size lt 60 bk :size rt 60
bk :size lt 60 bk :size 
end

to procs
ed[main draw shape procs]
end 
--------------------