Provided by: libmath-planepath-perl_129-1_all bug

NAME

       Math::PlanePath::KochSquareflakes -- four-sided Koch snowflakes

SYNOPSIS

        use Math::PlanePath::KochSquareflakes;
        my $path = Math::PlanePath::KochSquareflakes->new (inward => 0);
        my ($x, $y) = $path->n_to_xy (123);

DESCRIPTION

       This is the Koch curve shape arranged as four-sided concentric snowflakes.

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

                                          ^
              -9 -8 -7 -6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5  6  7  8  9 10

       The innermost square N=1 to N=4 is the initial figure.  Its sides expand as the Koch curve
       pattern in subsequent rings.  The initial figure is on X=+/-0.5,Y=+/-0.5 fractions.  The
       points after that are integer X,Y.

Inward

       The "inward=>1" option can direct the sides inward.  The shape and lengths etc are the
       same.  The angles and sizes mean there's no overlaps.

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

                                 ^
           -7 -6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5  6  7

   Level Ranges
       Counting the innermost N=1 to N=4 square as level 0, a given level has

           looplen = 4*4^level

       many points.  The start of a level is N=1 plus the preceding loop lengths so

           Nstart = 1 + 4*[ 1 + 4 + 4^2 + ... + 4^(level-1) ]
                  = 1 + 4*(4^level - 1)/3
                  = (4^(level+1) - 1)/3

       and the end of a level similarly the total loop lengths, or simply one less than the next
       Nstart,

           Nend = 4 * [ 1 + ... + 4^level ]
                = (4^(level+2) - 4) / 3

                = Nstart(level+1) - 1

       For example,

           level  Nstart   Nend                       (A002450,A080674)
             0       1       4
             1       5      20
             2      21      84
             3      85     340

       The Xstart,Ystart position of the Nstart corner is a Lucas sequence,

           Xstart(0) = -0.5
           Xstart(1) = -2
           Xstart(2) = 4*Xstart(1) - 2*Xstart(0) = -7
           Xstart(3) = 4*Xstart(2) - 2*Xstart(1) = -24
           ...
           Xstart(level+1) = 4*Xstart(level) - 2*Xstart(level-1)

           0.5, 2, 7, 24, 82, 280, 956, 3264, ...             (A003480)

       This recurrence occurs because the replications are 4 wide when horizontal but 3 wide when
       diagonal.

FUNCTIONS

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

       "$path = Math::PlanePath::KochSquareflakes->new ()"
       "$path = Math::PlanePath::KochSquareflakes->new (inward => $bool)"
           Create and return a new path object.

   Level Methods
       "($n_lo, $n_hi) = $path->level_to_n_range($level)"
           Return per "Level Ranges" above,

               (  (4**$level - 1)/3,
                4*(4**$level - 1)/3 )

OEIS

       Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include

           <http://oeis.org/A003480> (etc)

           A003480   -X and -Y coordinate first point of each ring
                     likewise A020727
           A007052   X,Y coordinate of axis crossing,
                     and also maximum height of a side
           A072261   N on Y negative axis (half way along first side)
           A206374   N on South-East diagonal (end of first side)

           Also:
             A332204   X coordinate across one side
             A332205   Y coordinate across one side

SEE ALSO

       Math::PlanePath, Math::PlanePath::KochSnowflakes

HOME PAGE

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

LICENSE

       Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Kevin Ryde

       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/>.