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

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