1Math::PlanePath::QuinteUtsCeurrvCeo(n3t)ributed Perl DocMuamtehn:t:aPtliaonnePath::QuintetCurve(3)
2
3
4
6 Math::PlanePath::QuintetCurve -- self-similar "plus" shaped curve
7
9 use Math::PlanePath::QuintetCurve;
10 my $path = Math::PlanePath::QuintetCurve->new;
11 my ($x, $y) = $path->n_to_xy (123);
12
14 This path is Mandelbrot's "quartet" trace of spiralling self-similar
15 "+" shape.
16
17 Benoit B. Mandelbrot, "The Fractal Geometry of Nature", W. H.
18 Freeman and Co., 1983, ISBN 0-7167-1186-9, section 7, "Harnessing
19 the Peano Monster Curves", pages 72-73.
20
21 125--... 93--92 11
22 | | |
23 123-124 94 91--90--89--88 10
24 | | |
25 122-121-120 103-102 95 82--83 86--87 9
26 | | | | | | |
27 115-116 119 104 101-100--99 96 81 84--85 8
28 | | | | | | |
29 113-114 117-118 105 32--33 98--97 80--79--78 7
30 | | | | |
31 112-111-110-109 106 31 34--35--36--37 76--77 6
32 | | | | |
33 108-107 30 43--42 39--38 75 5
34 | | | | |
35 25--26 29 44 41--40 73--74 4
36 | | | | |
37 23--24 27--28 45--46--47 72--71--70--69--68 3
38 | | |
39 22--21--20--19--18 49--48 55--56--57 66--67 2
40 | | | | |
41 5---6---7 16--17 50--51 54 59--58 65 1
42 | | | | | | |
43 0---1 4 9---8 15 52--53 60--61 64 <- Y=0
44 | | | | | |
45 2---3 10--11 14 62--63 -1
46 | |
47 12--13 -2
48
49 ^
50 X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
51
52 Mandelbrot calls this a "quartet", taken as 4 parts around a further
53 middle part (like 4 players around a table). The module name "quintet"
54 here is a mistake, though it does suggest the base-5 nature of the
55 curve.
56
57 The base figure is the initial N=0 to N=5.
58
59 5
60 |
61 |
62 0---1 4 base figure
63 | |
64 | |
65 2---3
66
67 It corresponds to a traversal of the following "+" shape,
68
69 .... 5
70 . ^
71 . <|
72 |
73 0--->1 .. 4 ....
74 v ^ | .
75 . |> |> .
76 . | v .
77 .... 2--->3 ....
78 . v .
79 . .
80 . .
81 . .. .
82
83 The "v" and ">" notches are the side the figure is directed at the
84 higher replications. The 0, 2 and 3 sub-curves are the right hand side
85 of the line and are a plain repetition of the base figure. The 1 and 4
86 parts are to the left and are a reversal (rotate the base figure 180
87 degrees). The first such reversal is seen in the sample above as N=5
88 to N=10.
89
90 .....
91 . .
92
93 5---6---7 ...
94 . . | .
95 . | . reversed figure
96 ... 9---8 ...
97 | .
98 | .
99 10 ...
100
101 Mandelbrot gives the expansion without designating start and end. The
102 start is chosen here so the expansion has sub-curve 0 forward (not
103 reverse). This ensures the next expansion has the curve the same up to
104 the preceding level, and extending from there.
105
106 In the base figure it can be seen the N=5 endpoint is rotated up around
107 from the N=0 to N=1 direction. This makes successive higher levels
108 slowly spiral around.
109
110 base b = 2 + i
111 N = 5^level
112 angle = level * arg(b) = level*atan(1/2)
113 = level * 26.56 degrees
114
115 In the sample shown above N=125 is level=3 and has spiralled around to
116 angle 3*26.56=79.7 degrees. The next level goes to X negative in the
117 second quadrant. A full circle around the plane is approximately level
118 14.
119
120 Arms
121 The optional "arms => $a" parameter can give 1 to 4 copies of the
122 curve, each advancing successively. For example "arms=>4" is as
123 follows. N=4*k points are the plain curve, and N=4*k+1, N=4*k+2 and
124 N=4*k+3 are rotated copies of it.
125
126 69--65 ...
127 | | |
128 ..-117-113-109 73 61--57--53--49 120
129 | | | |
130 101-105 77 25--29 41--45 100-104 116
131 | | | | | | | |
132 97--93 81 21 33--37 92--96 108-112
133 | | | |
134 50--46 89--85 17--13-- 9 88--84--80--76--72
135 | | | |
136 54 42--38 10-- 6 1-- 5 20--24--28 64--68
137 | | | | | | |
138 58 30--34 14 2 0-- 4 16 36--32 60
139 | | | | | | |
140 66--62 26--22--18 7-- 3 8--12 40--44 56
141 | | | |
142 70--74--78--82--86 11--15--19 87--91 48--52
143 | | | |
144 110-106 94--90 39--35 23 83 95--99
145 | | | | | | | |
146 114 102--98 47--43 31--27 79 107-103
147 | | | |
148 118 51--55--59--63 75 111-115-119-..
149 | | |
150 ... 67--71
151
152 The curve is essentially an ever expanding "+" shape with one corner at
153 the origin. Four such shapes pack as follows. O is the origin and
154 each * is the end of the part on its right.
155
156 +---+
157 | |
158 +---*--- +---+
159 | | B |
160 +---+ +---+ +---*
161 | C | | |
162 +---+ +---O---+ +---+
163 | | | A |
164 *---+ +---+ +---+
165 | D | |
166 +---+ +---*---+
167 | |
168 +---+
169
170 At higher replication levels the sides are wiggly and spiralling and
171 the centres of each rotate around, but their sides are symmetric and
172 mesh together perfectly to fill the plane.
173
175 See "FUNCTIONS" in Math::PlanePath for behaviour common to all path
176 classes.
177
178 "$path = Math::PlanePath::QuintetCurve->new ()"
179 "$path = Math::PlanePath::QuintetCurve->new (arms => $a)"
180 Create and return a new path object.
181
182 "($x,$y) = $path->n_to_xy ($n)"
183 Return the X,Y coordinates of point number $n on the path. Points
184 begin at 0 and if "$n < 0" then the return is an empty list.
185
186 Fractional positions give an X,Y position along a straight line
187 between the integer positions.
188
189 "$n = $path->n_start()"
190 Return 0, the first N in the path.
191
192 "($n_lo, $n_hi) = $path->rect_to_n_range ($x1,$y1, $x2,$y2)"
193 In the current code the returned range is exact, meaning $n_lo and
194 $n_hi are the smallest and biggest in the rectangle, but don't rely
195 on that yet since finding the exact range is a touch on the slow
196 side. (The advantage of which though is that it helps avoid very
197 big ranges from a simple over-estimate.)
198
199 Level Methods
200 "($n_lo, $n_hi) = $path->level_to_n_range($level)"
201 Return "(0, 5**$level)", or for multiple arms return "(0, $arms *
202 5**$level)".
203
204 There are 5^level + 1 points in a level, numbered starting from 0.
205 On the second and subsequent arms the origin is omitted (so as not
206 to repeat that point) and so just 5^level for them, giving
207 5^level+1 + (arms-1)*5^level = arms*5^level + 1 many points
208 starting from 0.
209
211 Various properties are in my R5 Dragon mathematical write-up in section
212 "Quartet Curve",
213
214 <http://user42.tuxfamily.org/r5dragon/index.html>
215
216 X,Y to N
217 The current approach uses the "QuintetCentres" xy_to_n(). Because the
218 tiling in "QuintetCurve" and "QuintetCentres" is the same, the X,Y
219 coordinates for a given N are no more than 1 away in the grid.
220
221 The way the two lowest shapes are arranged in fact means that for a
222 "QuintetCurve" N at X,Y then the same N on the "QuintetCentres" is at
223 one of three locations
224
225 X, Y same
226 X, Y+1 up
227 X-1, Y+1 up and left
228 X-1, Y left
229
230 This is so even when the "arms" multiple paths are in use (the same
231 arms in both coordinates).
232
233 Is there an easy way to know which of the four offsets is right? The
234 current approach is to give each to "QuintetCentres" to make an N, put
235 that N back through n_to_xy() to see if it's the target $n.
236
238 Math::PlanePath, Math::PlanePath::QuintetCentres,
239 Math::PlanePath::QuintetReplicate, Math::PlanePath::Flowsnake
240
242 <http://user42.tuxfamily.org/math-planepath/index.html>
243
245 Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020
246 Kevin Ryde
247
248 This file is part of Math-PlanePath.
249
250 Math-PlanePath is free software; you can redistribute it and/or modify
251 it under the terms of the GNU General Public License as published by
252 the Free Software Foundation; either version 3, or (at your option) any
253 later version.
254
255 Math-PlanePath is distributed in the hope that it will be useful, but
256 WITHOUT ANY WARRANTY; without even the implied warranty of
257 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
258 General Public License for more details.
259
260 You should have received a copy of the GNU General Public License along
261 with Math-PlanePath. If not, see <http://www.gnu.org/licenses/>.
262
263
264
265perl v5.38.0 2023-07-20 Math::PlanePath::QuintetCurve(3)