++ed by:
EGOR BHANN

2 PAUSE users

Kevin Ryde
and 1 contributors

NAME

Math::PlanePath::KochSnowflakes -- Koch snowflakes as concentric rings

SYNOPSIS

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

DESCRIPTION

This path traces out concentric integer versions of the Koch snowflake at successively greater iteration levels.

                               48                                6
                              /  \
                      50----49    47----46                       5
                        \              /
             54          51          45          42              4
            /  \        /              \        /  \
    56----55    53----52                44----43    41----40     3
      \                                                  /
       57                      12                      39        2
      /                       /  \                       \
    58----59          14----13    11----10          37----38     1
            \           \       3      /           /
             60          15  1----2   9          36         <- Y=0
            /                          \           \
    62----61           4---- 5    7---- 8           35----34    -1
      \                       \  /                       /
       63                       6                      33       -2
                                                         \
    16----17    19----20                28----29    31----32    -3
            \  /        \              /        \  /
             18          21          27          30             -4
                        /              \
                      22----23    25----26                      -5
                              \  /
                               24                               -6

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

The initial figure is the triangle N=1,2,3 then for the next level each straight side expands to 3x longer and a notch like N=4 through N=8,

      *---*     becomes     *---*   *---*
                                 \ /
                                  *

The angle is maintained in each replacement, for example the segment N=5 to N=6 becomes N=20 to N=24 at the next level.

Triangular Coordinates

The X,Y coordinates are arranged as integers on a square grid per "Triangular Lattice" in Math::PlanePath, except for the Y coordinates of the innermost triangle which is

                    N=3
                X=0, Y=+0.666
              /                \
         N=1                     N=2    
    X=-1, Y=-0.333  ------   X=1, Y=-0.333

These values are consistent with the centring and scaling of the higher levels. Rounding to an integer gives Y=0 or Y=1 and doesn't overlap the subsequent points if all-integer is desired.

Level Ranges

Counting the innermost triangle as level 0, each ring is

    Nstart = 4^level
    length = 3*(4^level)   many points

For example the outer ring shown above is level 2 starting N=4^2=16 and having length=3*4^2=48 points (through to N=63 inclusive).

The X range at a given level is the initial triangle baseline iterated out. Each level expands the sides by a factor of 3 so

     Xlo = -(3^level)
     Xhi = +(3^level)

For example level 2 above runs from X=-9 to X=+9. The Y range is the points N=6 and N=12 iterated out

    Ylo = -(2/3)*3^level
    Yhi = +(2/3)*3^level

except for the initial triangle which doesn't have a downward notch and is only Y=-1/3 not Y=-2/3.

Notice that for each level the extents grow by a factor of 3 but the notch introduced in each segment is not big enough to go past the corner positions. At level 1 they equal the corners horizontally, ie. N=14 is at X=-3 the same as N=4, and on the right N=10 at X=+3 the same as N=8, but no more than that.

The snowflake is an example of a fractal curve with ever finer structure. The code here can be used for that by going from N=Nstart to N=Nstart+length-1 and scaling X/3^level Y/3^level for a 2-wide 1-high figure of desired fineness. See examples/koch-svg.pl for an complete program doing that as an SVG image file.

FUNCTIONS

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

$path = Math::PlanePath::KochSnowflakes->new ()

Create and return a new path object.

FORMULAS

Rectangle to N Range

As noted in "Level Ranges" above, for a given level

    -(3^level)   <= X <= 3^level
    -2*(3^level) <= Y <= 2*(3^level)

So the maximum X,Y in a rectangle gives a level,

    level = ceil(log3(max(x1, x2, y1/2, y2/2)))

and the last point in that level is

     N = 4^(level+1) - 1

Using that as an N range is an over-estimate, but an easy calculation. It's not too difficult to trace down for an exact range

SEE ALSO

Math::PlanePath, Math::PlanePath::PeanoCurve, Math::PlanePath::HilbertCurve, Math::PlanePath::KochCurve, Math::PlanePath::KochPeaks

HOME PAGE

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

LICENSE

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