DOKK / manpages / debian 12 / libmath-planepath-perl / Math::PlanePath::KochSquareflakes.3pm.en
Math::PlanePath::KochSquareflakes(3pm) User Contributed Perl Documentation Math::PlanePath::KochSquareflakes(3pm)

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

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

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.

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

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.

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.

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

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

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

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

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

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

2021-01-23 perl v5.32.0