Math::PlanePath::KochPeaks -- Koch curve peaks
use Math::PlanePath::KochPeaks; my $path = Math::PlanePath::KochPeaks->new; my ($x, $y) = $path->n_to_xy (123);
This path traces out concentric peaks made from integer versions of the self-similar Koch curve at successively greater iteration levels.
29 9 / \ 27----28 30----31 8 \ / 23 26 32 35 7 / \ / \ / \ 21----22 24----25 33----34 36----37 6 \ / 20 38 5 / \ 19----18 40----39 4 \ / 17 8 41 3 / / \ \ 15----16 6---- 7 9----10 42----43 2 \ \ / / 14 5 2 11 44 1 / / / \ \ \ 13 4 1 3 12 45 <- Y=0 ^ -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 peak N=1,2,3 then for the next level each straight side expands to 3x longer with a notch like N=4 through N=8,
* / \ *---* becomes *---* *---*
The angle is maintained in each replacement,
* / *---* \ * * / becomes / * *
So the segment N=1 to N=2 becomes N=4 to N=8, or in the next level N=5 to N=6 becomes N=17 to N=21.
The X,Y coordinates are arranged as integers on a square grid. Each horizontal segment is X=+/-2 apart and the diagonals are X=+/-1,Y=+/-1. The result is flattened triangular segments with diagonals at a 45 degree angle. To get 60 degree equilateral triangles of side length 1 use X/2 and Y*sqrt(3)/2, or just Y*sqrt(3) for side length 2.
Counting the innermost peak as level 0, each peak is
Nstart = level + (2*4^level + 1)/3 length = 2*4^level + 1 including endpoints
For example the outer ring shown above is level 2 starting at N=2+(2*4^2+1)/3=13 and having length=2*4^2+1=9 many points through to N=12 (inclusive). The X range at a given level is the endpoints at
Xlo = -(3^level) Xhi = +(3^level)
For example the level 2 above runs from X=-9 to X=+9. The highest Y is the centre peak at
Ypeak = 3^level Npeak = level + (5*4^level + 1)/3
Notice that for each level the extents grow by a factor of 3. But the new triangular notch in each segment is not big enough to go past the X start and end points. They can equal the ends, such as N=6 or N=19, but not beyond.
$path = Math::PlanePath::KochPeaks->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.
$n
$n < 0
Fractional $n gives an X,Y position along a straight line between the integer positions.
As noted above ("Level Ranges"), for a given level
-(3^level) <= X <= 3^level
So the maximum X in a rectangle gives a level,
level = ceil (log3 (max(x1,x2)))
and the endpoint in that level is simply 1 before the start of the next, so
Nlast = Nstart(level+1) - 1 = (level+1) + (2*4^(level+1) + 1)/3 - 1 = level + (8*4^level + 1)/3
Using this Nlast is an over-estimate of the N range needed, but an easy calculation. It's not too difficult to work down for an exact range.
Math::PlanePath, Math::PlanePath::KochCurve, Math::PlanePath::PeanoCurve, Math::PlanePath::HilbertCurve, Math::PlanePath::KochCurve, Math::PlanePath::KochSnowflakes
http://user42.tuxfamily.org/math-planepath/index.html
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/>.
To install Math::PlanePath, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Math::PlanePath
CPAN shell
perl -MCPAN -e shell install Math::PlanePath
For more information on module installation, please visit the detailed CPAN module installation guide.