
The Fibonacci word may be represented as a fractal as described here:


(Clicking on the above website   (hal.archives-ouvertes.fr)    will leave a cookie.)



For F_wordm start with F_wordCharn=1
Draw a segment forward
If current F_wordChar is 0
Turn left if n is even
Turn right if n is odd
next n and iterate until end of F_word


Task

Create and display a fractal similar to Fig 1.


(Clicking on the above website   (hal.archives-ouvertes.fr)    will leave a cookie.)

global width, height
 
procedure main(A)
    n := integer(A[1]) | 25			    # F_word to use
    sl := integer(A[2]) | 1             # Segment length
    width := integer(A[3]) | 1050       # Width of plot area
    height := integer(A[4]) | 1050      # Height of plot area
    w := fword(n)
    drawFractal(n,w,sl)
end
 
procedure fword(n)
    static fcache
    initial fcache := table()
    /fcache[n] := case n of {
                     1: "1"
                     2: "0"
                     default: fword(n-1)||fword(n-2)
                     }
    return fcache[n]
end
 
record loc(x,y)
 
procedure drawFractal(n,w,sl)
    static lTurn, rTurn
    initial {
        every (lTurn|rTurn) := table()
        lTurn["north"] := "west"; lTurn["west"] := "south"
        lTurn["south"] := "east"; lTurn["east"] := "north"
        rTurn["north"] := "east"; rTurn["east"] := "south"
        rTurn["south"] := "west"; rTurn["west"] := "north"
        }
 
    wparms := ["FibFractal "||n,"g","bg=white","canvas=normal",
               "fg=black","size="||width||","||height,"dx=10","dy=10"]
    &window := open!wparms | stop("Unable to open window")
    p := loc(10,10)
    d := "north"
    every i := 1 to *w do {
       p := draw(p,d,sl)
       if w[i] == "0" then d := if i%2 = 0 then lTurn[d] else rTurn[d]
       }
 
    until Event() == &lpress
    WriteImage("FibFract"||n||".png")
    close(&window)
end
 
procedure draw(p,d,sl)
    if d == "north"      then p1 := loc(p.x,p.y+sl)
    else if d == "south" then p1 := loc(p.x,p.y-sl)
    else if d == "east"  then p1 := loc(p.x+sl,p.y)
    else                      p1 := loc(p.x-sl,p.y)
    DrawLine(p.x,p.y, p1.x,p1.y)
    return p1
end