++ed by:
Kevin Ryde
and 1 contributors

# NAME

Math::PlanePath::FibonacciWordFractal -- turns by Fibonacci word bits

# SYNOPSIS

`````` use Math::PlanePath::FibonacciWordFractal;
my \$path = Math::PlanePath::FibonacciWordFractal->new;
my (\$x, \$y) = \$path->n_to_xy (123);``````

# DESCRIPTION

This is an integer version of the Fibonacci word fractal by Alexis Monnerot-Dumaine. It makes turns controlled by by the "Fibonacci word" sequence, sometimes called the "golden string" too.

``````    11  | 27-28-29    33-34-35          53-54-55    59-60-61
|  |     |     |     |           |     |     |     |
10  | 26    30-31-32    36          52    56-57-58    62
|  |                 |           |                 |
9  | 25-24          38-37          51-50          64-63
|     |           |                 |           |
8  |    23          39    43-44-45    49          65
|     |           |     |     |     |           |
7  | 21-22          40-41-42    46-47-48          66-67
|  |                                               |
6  | 20    16-15-14                      74-73-72    68
|  |     |     |                       |     |     |
5  | 19-18-17    13                      75    71-70-69
|              |                       |
4  |          11-12                      76-77
|           |                             |
3  |          10                            78
|           |                             |
2  |           9--8                      80-79
|              |                       |
1  |  1--2--3     7                      81    85-86-87
|  |     |     |                       |     |     |
Y=0 |  0     4--5--6                      82-83-84    88-89-...
+-------------------------------------------------------
X=0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 ``````

A current direction up,down,left,right is maintained, initially up. The path moves in that direction and then a possible turn according to the Fibonacci word,

``````    Fib word
--------
0      turn left if even index, right if odd index

In this form the Fibonacci word is reckoned as starting from index=1, so for example at N=0 draw a line upwards to N=1 and the first Fibonacci word value is 0 and index=1 odd so change direction to the right.

``````     N     Fibonacci word
---    --------------
0       0    turn right
1       1
2       0    turn right
3       0    turn left
4       1
5       0    turn left
6       1``````

The result is self-similar blocks within the first quadrant (X>=0,Y>=0). New blocks extend from N values which are Fibonacci numbers. For example at N=21 begins a new block above, then N=34 a new block across, N=55 down, N=89 across again, etc.

The new blocks are a copy of the shape starting N=0 rotated and/or transposed according to the replication level mod 6,

``````    level mod 6      new block
-----------      ---------
0              transpose
1                         rotate -90
2              transpose, rotate -90
3              transpose
4                         rotate +90
5              transpose, rotate +90``````

# FUNCTIONS

See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.

`\$path = Math::PlanePath::FibonacciWordFractal->new ()`

Create and return a new path object.

`(\$x,\$y) = \$path->n_to_xy (\$n)`

Return the X,Y coordinates of point number `\$n` on the path. Points begin at 0 and if `\$n < 0` then the return is an empty list.

Fractional positions give an X,Y position along a straight line between the integer positions.

`\$n = \$path->xy_to_n (\$x,\$y)`

Return the point number for coordinates `\$x,\$y`. If there's nothing at `\$x,\$y` then return `undef`.

The curve visits an `\$x,\$y` twice for various points (all the "inside" points). In the current code the smaller of the two N values is returned. Is that the best way?

`\$n = \$path->n_start()`

Return 0, the first N in the path.

# OEIS

The Fibonacci word sequence itself is in Sloane's OEIS as sequence A003849, and A156596 is the odd/even 0s turned into turns 1 or 2 to give the turn sequence directly

``````    http://oeis.org/A156596

A156596  - turn sequence, 0=straight, 1=right, 2=left
A003849  - Fibonacci word sequence 0,1``````

Alexis Monnerot-Dumaine "The Fibonacci Word Fractal", February 2009

``````    http://hal.archives-ouvertes.fr/hal-00367972_v1/
http://hal.archives-ouvertes.fr/docs/00/36/79/72/PDF/The_Fibonacci_word_fractal.pdf``````

Math::NumSeq::FibonacciWord

http://user42.tuxfamily.org/math-planepath/index.html