NAME
Math::PlanePath::SquareReplicate  replicating squares
SYNOPSIS
use Math::PlanePath::SquareReplicate;
my $path = Math::PlanePath::SquareReplicate>new;
my ($x, $y) = $path>n_to_xy (123);
DESCRIPTION
This path is a selfsimilar replicating square,
403938 313029 222120 4
     
41 3637 32 2728 23 1819 3
  
424344 333435 242526 2
494847 4 3 2 131211 1
     
50 4546 5 0 1 14 910 < Y=0
  
515253 6 7 8 151617 1
585756 676665 767574 2
     
59 5455 68 6364 77 7273 3
  
606162 697071 787980 4
^
4 3 2 1 X=0 1 2 3 4
The base shape is the initial N=0 to N=8 section,
4 3 2
5 0 1
6 7 8
It then repeats with 3x3 blocks arranged in the same pattern, then 9x9 blocks, etc.
36  27  18
 
 
45 0  9


54  63  72
The replication means that the values on the X axis are those using only digits 0,1,5 in base 9. Those to the right have a high 1 digit and those to the left a high 5 digit. These digits are the values in the initial N=0 to N=8 figure which fall on the X axis.
Similarly on the Y axis digits 0,3,7 in base 9, or the leading diagonal X=Y 0,2,6 and opposite diagonal 0,4,8. The opposite diagonal digits 0,4,8 are 00,11,22 in base 3, so is all the values in base 3 with doubled digits aabbccdd, etc.
Level Ranges
A given replication extends to
Nlevel = 9^level  1
 (3^level  1) <= X <= (3^level  1)
 (3^level  1) <= Y <= (3^level  1)
Complex Base
This pattern corresponds to expressing a complex integer X+i*Y with axis powers of base b=3,
X+Yi = a[n]*b^n + ... + a[2]*b^2 + a[1]*b + a[0]
using complex digits a[i] encoded in N in integer base 9,
a[i] digit N digit
 
0 0
1 1
i+1 2
i 3
i1 4
1 5
i1 6
i 7
i+1 8
Numbering Rotate4
Parameter numbering_type => 'rotate4'
applies a rotation to 4 directions E,N,W,S for each subpart according to its position around the preceding level.
^ ^
 
++++
 4 3  2 >
+++ +
< 5  0> 1 >
+ +++
< 6  7 8 
++++
 
v v
The effect can be illustrated by writing N in base9.
4241 48 3231 38 242322
       
43 40 47 33 30 37 25 2021 numbering_type => 'rotate4'
     N shown in base9
444546 343536 262728
585756 432 141312
    
5150 55 5 01 15 1011
   
525354 678 161718
686766 767574 868584
    
6160 65 77 70 73 87 80 83
       
626364 78 7172 88 8182
Parts 1018 and 2028 are the same as the middle 08. Parts 3038 and 4048 have a rotation by +90 degrees. Parts 5058 and 6068 rotation by +180 degrees, and so on.
Notice this means in each part the base9 points 11, 21, 31, points are directed away from the middle in the same way, relative to the subpart locations. This gives a reasonably simple way to characterize points on the boundary of a given expansion level.
Working through the directions and boundary sides gives a state machine for which unit squares are on the boundary. For level >= 1 a given unit square has one of both of two sides on the boundary.
B
++
  unit square with expansion direction,
 > A one or both of sides A,B on the boundary
 
++
A further low base9 digit expands the square to a block of 9, with squares then boundary or not. The result is 4 states, which can be expressed by pairs of digits
write N in base9 using level many digits,
delete all 2s in 2nd or later digit
nonboundary =
0 anywhere
5 or 6 or 7 in 2nd or later digit
pair 13,33,53,73, 14,34,54,74 anywhere
pair 43,44, 81,88 at 2nd or later digit
Pairs 53,73,54,74 can be checked just at the start of the digits, since 5 or 7 anywhere later are nonboundary alone irrespective of what (if any) pair they might make.
Numbering Rotate 8
Parameter numbering_type => 'rotate8'
applies a rotation to 8 directions for each subpart according to its position around the preceding level.
^ ^ ^
\  /
++++
 4  3  2 
++++
< 5  0> 1 >
++++
 6  7  8 
++++
/  \
v v v
The effect can be illustrated again by N in base9.
41 4847 3231 38 232221
\      /
42 40 46 33 30 37 24 20 28 numbering_type => 'rotate'
      N shown in base9
434445 343536 252627
585756 432 141312
    
5150 55 5 01 15 1011
   
525354 678 161718
676665 767574 858483
     
68 60 64 77 70 73 86 80 82
/      \ 
616263 78 7172 8788 81
Notice this means in each part the 11, 21, 31, etc, points are directed away from the middle in the same way, relative to the subpart locations.
FUNCTIONS
See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.
$path = Math::PlanePath::SquareReplicate>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.
Level Methods
SEE ALSO
Math::PlanePath, Math::PlanePath::CornerReplicate, Math::PlanePath::LTiling, Math::PlanePath::GosperReplicate, Math::PlanePath::QuintetReplicate
HOME PAGE
http://user42.tuxfamily.org/mathplanepath/index.html
LICENSE
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Kevin Ryde
This file is part of MathPlanePath.
MathPlanePath 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.
MathPlanePath 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 MathPlanePath. If not, see <http://www.gnu.org/licenses/>.