++ed by:
Kevin Ryde
and 1 contributors

NAME

Math::PlanePath::KochCurve -- horizontal Koch curve

SYNOPSIS

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

DESCRIPTION

This path is an integer version of the self-similar curve by Helge von Koch going along the X axis and making triangular excursions.

``````                               8                                   3
/  \
6---- 7     9----10                19-...    2
\              /                    \
2           5          11          14          18     1
/  \        /              \        /  \        /
0----1     3---- 4                12----13    15----16    <- Y=0
^
X=0   2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19``````

The replicating shape is the initial N=0 to N=4,

``````            *
/ \
*---*   *---*``````

which is rotated and repeated 3 times in the same shape to give sections N=4 to N=8, N=8 to N=12, and N=12 to N=16. Then that N=0 to N=16 is itself replicated three times at the angles of the base pattern, and so on infinitely.

The X,Y coordinates are arranged on a square grid using every second point, per "Triangular Lattice" in Math::PlanePath. The result is flattened triangular segments with diagonals at a 45 degree angle.

Level Ranges

Each replication adds 3 copies of the existing points and is thus 4 times bigger, so if N=0 to N=4 is reckoned as level 1 then a given replication level goes from

``````    Nstart = 0
Nlevel = 4^level   (inclusive)``````

Each replication is 3 times the width. The initial N=0 to N=4 figure is 6 wide, so in general a level runs from

``````    Xstart = 0
Xlevel = 2*3^level   (at Nlevel)``````

The highest Y is 3 times greater at each level similarly. The peak is at the midpoint of each level,

``````    Npeak = (4^level)/2
Ypeak = 3^level
Xpeak = 3^level``````

It can be seen that the N=6 point backtracks horizontally to the same X as the start of its section N=4 to N=8. This happens in the further replications too and is the maximum extent of the backtracking.

The Nlevel is multiplied by 4 to get the end of the next higher level. The same 4*N can be applied to all points N=0 to N=Nlevel to get the same shape but a factor of 3 bigger X,Y coordinates. The in-between points 4*N+1, 4*N+2 and 4*N+3 are then new finer structure in the higher level.

Fractal

Koch conceived the curve as having a fixed length and infinitely fine structure, making it continuous everywhere but differentiable nowhere. The code here can be pressed into use for that sort of construction to a given level of granularity by scaling

``````    X/3^level
Y/3^level``````

to make it a fixed 2 wide by 1 high. Or for unit-side equilateral triangles then further factors 1/2 and sqrt(3)/2, as noted in "Triangular Lattice" in Math::PlanePath.

``````    (X/2) / 3^level
(Y*sqrt(3)/2) / 3^level``````

FUNCTIONS

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

`\$path = Math::PlanePath::KochCurve->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->n_start()`

Return 0, the first N in the path.

Math::Fractal::Curve