1Math::PlanePath::SquareURseeprliCcoantter(i3b)uted PerlMDaotchu:m:ePnltaanteiPoanth::SquareReplicate(3)
2
3
4

NAME

6       Math::PlanePath::SquareReplicate -- replicating squares
7

SYNOPSIS

9        use Math::PlanePath::SquareReplicate;
10        my $path = Math::PlanePath::SquareReplicate->new;
11        my ($x, $y) = $path->n_to_xy (123);
12

DESCRIPTION

14       This path is a self-similar replicating square,
15
16           40--39--38  31--30--29  22--21--20         4
17            |       |   |       |   |       |
18           41  36--37  32  27--28  23  18--19         3
19            |           |           |
20           42--43--44  33--34--35  24--25--26         2
21
22           49--48--47   4-- 3-- 2  13--12--11         1
23            |       |   |       |   |       |
24           50  45--46   5   0-- 1  14   9--10     <- Y=0
25            |           |           |
26           51--52--53   6-- 7-- 8  15--16--17        -1
27
28           58--57--56  67--66--65  76--75--74        -2
29            |       |   |       |   |       |
30           59  54--55  68  63--64  77  72--73        -3
31            |           |           |
32           60--61--62  69--70--71  78--79--80        -4
33
34                            ^
35           -4  -3  -2  -1  X=0  1   2   3   4
36
37       The base shape is the initial N=0 to N=8 section,
38
39          4  3  2
40          5  0  1
41          6  7  8
42
43       It then repeats with 3x3 blocks arranged in the same pattern, then 9x9
44       blocks, etc.
45
46           36 --- 27 --- 18
47            |             |
48            |             |
49           45      0 ---  9
50            |
51            |
52           54 --- 63 --- 72
53
54       The replication means that the values on the X axis are those using
55       only digits 0,1,5 in base 9.  Those to the right have a high 1 digit
56       and those to the left a high 5 digit.  These digits are the values in
57       the initial N=0 to N=8 figure which fall on the X axis.
58
59       Similarly on the Y axis digits 0,3,7 in base 9, or the leading diagonal
60       X=Y 0,2,6 and opposite diagonal 0,4,8.  The opposite diagonal digits
61       0,4,8 are 00,11,22 in base 3, so is all the values in base 3 with
62       doubled digits aabbccdd, etc.
63
64   Level Ranges
65       A given replication extends to
66
67           Nlevel = 9^level - 1
68           - (3^level - 1) <= X <= (3^level - 1)
69           - (3^level - 1) <= Y <= (3^level - 1)
70
71   Complex Base
72       This pattern corresponds to expressing a complex integer X+i*Y with
73       axis powers of base b=3,
74
75           X+Yi = a[n]*b^n + ... + a[2]*b^2 + a[1]*b + a[0]
76
77       using complex digits a[i] encoded in N in integer base 9,
78
79           a[i] digit     N digit
80           ----------     -------
81                 0           0
82                 1           1
83               i+1           2
84               i             3
85               i-1           4
86                -1           5
87              -i-1           6
88              -i             7
89              -i+1           8
90
91   Numbering Rotate-4
92       Parameter "numbering_type => 'rotate-4'" applies a rotation to 4
93       directions E,N,W,S for each sub-part according to its position around
94       the preceding level.
95
96                ^   ^
97                |   |
98              +---+---+---+
99              | 4   3 | 2 |-->
100              +---+---+   +
101           <--| 5 | 0>| 1 |-->
102              +   +---+---+
103           <--| 6 | 7   8 |
104              +---+---+---+
105                    |   |
106                    v   v
107
108       The effect can be illustrated by writing N in base-9.
109
110           42--41  48  32--31  38  24--23--22
111            |   |   |   |   |   |   |       |
112           43  40  47  33  30  37  25  20--21      numbering_type => 'rotate-4'
113            |       |   |       |   |                  N shown in base-9
114           44--45--46  34--35--36  26--27--28
115
116           58--57--56   4---3---2  14--13--12
117                    |   |       |   |       |
118           51--50  55   5   0---1  15  10--11
119            |       |   |           |
120           52--53--54   6---7---8  16--17--18
121
122           68--67--66  76--75--74  86--85--84
123                    |   |       |   |       |
124           61--60  65  77  70  73  87  80  83
125            |       |   |   |   |   |   |   |
126           62--63--64  78  71--72  88  81--82
127
128       Parts 10-18 and 20-28 are the same as the middle 0-8.  Parts 30-38 and
129       40-48 have a rotation by +90 degrees.  Parts 50-58 and 60-68 rotation
130       by +180 degrees, and so on.
131
132       Notice this means in each part the base-9 points 11, 21, 31, points are
133       directed away from the middle in the same way, relative to the sub-part
134       locations.  This gives a reasonably simple way to characterize points
135       on the boundary of a given expansion level.
136
137       Working through the directions and boundary sides gives a state machine
138       for which unit squares are on the boundary.  For level >= 1 a given
139       unit square has one of both of two sides on the boundary.
140
141              B
142           +-----+
143           |     |            unit square with expansion direction,
144           |     |->  A       one or both of sides A,B on the boundary
145           |     |
146           +-----+
147
148       A further low base-9 digit expands the square to a block of 9, with
149       squares then boundary or not.  The result is 4 states, which can be
150       expressed by pairs of digits
151
152           write N in base-9 using level many digits,
153           delete all 2s in 2nd or later digit
154           non-boundary =
155             0 anywhere
156             5 or 6 or 7 in 2nd or later digit
157             pair 13,33,53,73, 14,34,54,74 anywhere
158             pair 43,44, 81,88 at 2nd or later digit
159
160       Pairs 53,73,54,74 can be checked just at the start of the digits, since
161       5 or 7 anywhere later are non-boundary alone irrespective of what (if
162       any) pair they might make.
163
164   Numbering Rotate 8
165       Parameter "numbering_type => 'rotate-8'" applies a rotation to 8
166       directions for each sub-part according to its position around the
167       preceding level.
168
169            ^       ^       ^
170             \      |      /
171              +---+---+---+
172              | 4 | 3 | 2 |
173              +---+---+---+
174           <--| 5 | 0>| 1 |-->
175              +---+---+---+
176              | 6 | 7 | 8 |
177              +---+---+---+
178             /      |      \
179            v       v       v
180
181       The effect can be illustrated again by N in base-9.
182
183           41 48-47 32-31 38 23-22-21
184            |\    |  |  |  |  |   /
185           42 40 46 33 30 37 24 20 28      numbering_type => 'rotate'
186            |     |  |     |  |     |          N shown in base-9
187           43-44-45 34-35-36 25-26-27
188
189           58-57-56  4--3--2 14-13-12
190                  |  |     |  |     |
191           51-50 55  5  0--1 15 10-11
192            |     |  |        |
193           52-53-54  6--7--8 16-17-18
194
195           67-66-65 76-75-74 85-84-83
196            |     |  |     |  |     |
197           68 60 64 77 70 73 86 80 82
198             /    |  |  |  |  |   \ |
199           61-62-63 78 71-72 87-88 81
200
201       Notice this means in each part the 11, 21, 31, etc, points are directed
202       away from the middle in the same way, relative to the sub-part
203       locations.
204

FUNCTIONS

206       See "FUNCTIONS" in Math::PlanePath for behaviour common to all path
207       classes.
208
209       "$path = Math::PlanePath::SquareReplicate->new ()"
210           Create and return a new path object.
211
212       "($x,$y) = $path->n_to_xy ($n)"
213           Return the X,Y coordinates of point number $n on the path.  Points
214           begin at 0 and if "$n < 0" then the return is an empty list.
215
216   Level Methods
217       "($n_lo, $n_hi) = $path->level_to_n_range($level)"
218           Return "(0, 9**$level - 1)".
219

SEE ALSO

221       Math::PlanePath, Math::PlanePath::CornerReplicate,
222       Math::PlanePath::LTiling, Math::PlanePath::GosperReplicate,
223       Math::PlanePath::QuintetReplicate
224

HOME PAGE

226       <http://user42.tuxfamily.org/math-planepath/index.html>
227

LICENSE

229       Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020
230       Kevin Ryde
231
232       This file is part of Math-PlanePath.
233
234       Math-PlanePath is free software; you can redistribute it and/or modify
235       it under the terms of the GNU General Public License as published by
236       the Free Software Foundation; either version 3, or (at your option) any
237       later version.
238
239       Math-PlanePath is distributed in the hope that it will be useful, but
240       WITHOUT ANY WARRANTY; without even the implied warranty of
241       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
242       General Public License for more details.
243
244       You should have received a copy of the GNU General Public License along
245       with Math-PlanePath.  If not, see <http://www.gnu.org/licenses/>.
246
247
248
249perl v5.34.0                      2022-01-21Math::PlanePath::SquareReplicate(3)
Impressum