Math::PlanePath::QuadricCurve -- eight segment zig-zag
use Math::PlanePath::QuadricCurve; my $path = Math::PlanePath::QuadricCurve->new; my ($x, $y) = $path->n_to_xy (123);
This is a self-similar zig-zag of eight segments,
18-19 5 | | 16-17 20 23-24 4 | | | | 15-14 21-22 25-26 3 | | 11-12-13 29-28-27 2 | | 2--3 10--9 30-31 58-59 ... 1 | | | | | | | 0--1 4 7--8 32 56-57 60 63-64 <- Y=0 | | | | | | 5--6 33-34 55-54 61-62 -1 | | 37-36-35 51-52-53 -2 | | 38-39 42-43 50-49 -3 | | | | 40-41 44 47-48 -4 | | 45-46 -5 ^ X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
The base figure is the initial N=0 to N=8,
2---3 | | 0---1 4 7---8 | | 5---6
It then repeats, turned to follow edge directions, so N=8 to N=16 is the same shape going upwards, then N=16 to N=24 across, N=24 to N=32 downwards, etc.
The result is the base at ever greater scale extending to the right and with wiggly lines making up the segments. The wiggles don't overlap.
The name QuadricCurve
here is a slight mistake. Mandelbrot ("Fractal Geometry of Nature" 1982 page 50) calls any islands initiated from a square "quadric", only one of which is with sides by this eight segment expansion. This curve expansion also appears (unnamed) in Mandelbrot's "How Long is the Coast of Britain", 1967.
A given replication extends to
Nlevel = 8^level X = 4^level Y = 0 Ymax = 4^0 + 4^1 + ... + 4^level # 11...11 in base 4 = (4^(level+1) - 1) / 3 Ymin = - Ymax
The sequence of turns made by the curve is straightforward. In the base 8 (octal) representation of N, the lowest non-zero digit gives the turn
low digit turn (degrees) --------- -------------- 1 +90 L 2 -90 R 3 -90 R 4 0 5 +90 L 6 +90 L 7 -90 R
When the least significant digit is non-zero it determines the turn, to make the base N=0 to N=8 shape. When the low digit is zero it's instead the next level up, the N=0,8,16,24,etc shape which is in control, applying a turn for the subsequent base part. So for example at N=16 = 20 octal 20 is a turn -90 degrees.
See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.
$path = Math::PlanePath::QuadricCurve->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_lo, $n_hi) = $path->level_to_n_range($level)
Return (0, 8**$level)
.
Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include
http://oeis.org/A133851 (etc)
A133851 Y at N=2^k, being successive powers 2^j at k=1mod4
Math::PlanePath, Math::PlanePath::QuadricIslands, Math::PlanePath::KochCurve
Math::Fractal::Curve -- its examples/generator4.pl is this curve
http://user42.tuxfamily.org/math-planepath/index.html
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 Kevin Ryde
This file is part of Math-PlanePath.
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/>.