Fibonacci word/fractal: Difference between revisions
Content added Content deleted
(Created page with "{{draft task}} The Fibonacci word may be represented as a fratal as described [http://hal.archives-ouvertes.fr/docs/00/36/79/72/PDF/The_Fibonacci_word_fractal.pdf here]: ...") |
No edit summary |
||
Line 10: | Line 10: | ||
For this task create and display a fractal similar to [http://hal.archives-ouvertes.fr/docs/00/36/79/72/PDF/The_Fibonacci_word_fractal.pdf Fig 1]. |
For this task create and display a fractal similar to [http://hal.archives-ouvertes.fr/docs/00/36/79/72/PDF/The_Fibonacci_word_fractal.pdf Fig 1]. |
||
=={{header|Icon}} and {{header|Unicon}}== |
|||
This probably only works in Unicon. It also defaults to showing the factal for F_word<sub>24</sub> as |
|||
larger fractals quickly exceed the size of window I can display, even with a line segment length of |
|||
a single pixel. |
|||
<lang unicon>global width, height |
|||
procedure main(A) |
|||
n := integer(A[1]) | 24 # F_word to use |
|||
sl := integer(A[2]) | 1 # Segment length |
|||
width := integer(A[3]) | 1050 # Width of plot area |
|||
height := integer(A[4]) | 450 # 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) |
|||
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 n := 1 to *w do { |
|||
p := draw(p,d,sl) |
|||
if w[n] == "0" then d := turn(d,n%2) |
|||
} |
|||
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 |
|||
procedure turn(d,n) |
|||
return if n = 0 then turnLeft(d) else turnRight(d) |
|||
end |
|||
procedure turnLeft(d) |
|||
return case d of { |
|||
"north": "west" |
|||
"west": "south" |
|||
"south": "east" |
|||
"east": "north" |
|||
} |
|||
end |
|||
procedure turnRight(d) |
|||
return case d of { |
|||
"north": "east" |
|||
"east": "south" |
|||
"south": "west" |
|||
"west": "north" |
|||
} |
|||
end</lang> |
Revision as of 02:23, 16 July 2013
Fibonacci word/fractal is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
The Fibonacci word may be represented as a fratal as described here:
- For F_word37 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
For this task create and display a fractal similar to Fig 1.
Icon and Unicon
This probably only works in Unicon. It also defaults to showing the factal for F_word24 as larger fractals quickly exceed the size of window I can display, even with a line segment length of a single pixel.
<lang unicon>global width, height
procedure main(A)
n := integer(A[1]) | 24 # F_word to use sl := integer(A[2]) | 1 # Segment length width := integer(A[3]) | 1050 # Width of plot area height := integer(A[4]) | 450 # 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)
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 n := 1 to *w do { p := draw(p,d,sl) if w[n] == "0" then d := turn(d,n%2) } 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
procedure turn(d,n)
return if n = 0 then turnLeft(d) else turnRight(d)
end
procedure turnLeft(d)
return case d of { "north": "west" "west": "south" "south": "east" "east": "north" }
end
procedure turnRight(d)
return case d of { "north": "east" "east": "south" "south": "west" "west": "north" }
end</lang>