The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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 the "Fibonacci word" sequence, sometimes called the "golden string".

    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, starting in the up direction. The path moves in the current direction and then turns or goes straight according to the Fibonacci word,

    Fib word
    --------
       0      turn left if even index, right if odd index
       1      straight ahead

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, values 0,1
    A005614  - Fibonacci word, values 1,0
    A003842  - Fibonacci word, values 1,2
    A014675  - Fibonacci word, values 2,1

SEE ALSO

Math::PlanePath, Math::PlanePath::DragonCurve, Math::PlanePath::WythoffArray

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

HOME PAGE

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

LICENSE

Copyright 2011, 2012 Kevin Ryde

This file is part of Math-PlanePath.

Math-PlanePath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

Math-PlanePath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Math-PlanePath. If not, see <http://www.gnu.org/licenses/>.