Math::...etCurve(3pm)
β¨ Math::PlanePath::QuintetCurve π
okay so bestie, this is a page from the User Contributed Perl Documentation β we're talking about Math::PlanePath::QuintetCurve, the self-similar "plus" shaped curve β¨ it's lowkey iconic and we're gonna go through every single bit of it together, no cap π«Ά
πΈ NAME πΈ
Math::PlanePath::QuintetCurve β self-similar "plus" shaped curve π
π¦ SYNOPSIS π¦
use Math::PlanePath::QuintetCurve;
my $path = Math::PlanePath::QuintetCurve->new;
my ($x, $y) = $path->n_to_xy (123);
π DESCRIPTION π
So this path? It's Mandelbrot's "quartet" trace of a spiralling self-similar "+" shape. Literally the main character of fractal geometry π
Benoit B. Mandelbrot, "The Fractal Geometry of Nature", W. H. Freeman and Co., 1983, ISBN 0-7167-1186-9, section 7, "Harnessing the Peano Monster Curves", pages 72-73.
And here's the whole vibe laid out, like the entire curve in one glow-up:
125--... 93--92 11
| | |
123-124 94 91--90--89--88 10
| | |
122-121-120 103-102 95 82--83 86--87 9
| | | | | | |
115-116 119 104 101-100--99 96 81 84--85 8
| | | | | | |
113-114 117-118 105 32--33 98--97 80--79--78 7
| | | | |
112-111-110-109 106 31 34--35--36--37 76--77 6
| | | | |
108-107 30 43--42 39--38 75 5
| | | | |
25--26 29 44 41--40 73--74 4
| | | | |
23--24 27--28 45--46--47 72--71--70--69--68 3
| | |
22--21--20--19--18 49--48 55--56--57 66--67 2
| | | | |
5---6---7 16--17 50--51 54 59--58 65 1
| | | | | | |
0---1 4 9---8 15 52--53 60--61 64 <- Y=0
| | | | | |
2---3 10--11 14 62--63 -1
| |
12--13 -2
^
X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
Mandelbrot calls this a "quartet" β taken as 4 parts around a further middle part (like 4 players around a table, cute right? π). The module name "quintet" here is a mistake, ngl, though it does suggest the base-5 nature of the curve π
The base figure is the initial N=0 to N=5. Here she is:
5
|
|
0---1 4 base figure
| |
| |
2---3
It corresponds to a traversal of the following "+" shape:
.... 5
. ^
. <|
|
0--->1 .. 4 ....
v ^ | .
. |> |> .
. | v .
.... 2--->3 ....
. v .
. .
. .
. .. .
The "v" and ">" notches are the side the figure is directed at the higher replications. The 0, 2 and 3 sub-curves are the right hand side of the line and are a plain repetition of the base figure. The 1 and 4 parts are to the left and are a reversal (rotate the base figure 180 degrees). The first such reversal is seen in the sample above as N=5 to N=10. β¨
.....
. .
5---6---7 ...
. . | .
. | . reversed figure
... 9---8 ...
| .
| .
10 ...
Mandelbrot gives the expansion without designating start and end. The start is chosen here so the expansion has sub-curve 0 forward (not reverse). This ensures the next expansion has the curve the same up to the preceding level, and extending from there. π
In the base figure it can be seen the N=5 endpoint is rotated up around from the N=0 to N=1 direction. This makes successive higher levels slowly spiral around. π
base b = 2 + i
N = 5^level
angle = level * arg(b) = level*atan(1/2)
= level * 26.56 degrees
In the sample shown above N=125 is level=3 and has spiralled around to angle 3*26.56=79.7 degrees. The next level goes to X negative in the second quadrant. A full circle around the plane is approximately level 14. π
π Arms π
The optional arms => $a parameter can give 1 to 4 copies of the curve, each advancing successively. For example arms=>4 is as follows. N=4*k points are the plain curve, and N=4*k+1, N=4*k+2 and N=4*k+3 are rotated copies of it. π
69--65 ...
| | |
..-117-113-109 73 61--57--53--49 120
| | | |
101-105 77 25--29 41--45 100-104 116
| | | | | | | |
97--93 81 21 33--37 92--96 108-112
| | | |
50--46 89--85 17--13-- 9 88--84--80--76--72
| | | |
54 42--38 10-- 6 1-- 5 20--24--28 64--68
| | | | | | |
58 30--34 14 2 0-- 4 16 36--32 60
| | | | | | |
66--62 26--22--18 7-- 3 8--12 40--44 56
| | | |
70--74--78--82--86 11--15--19 87--91 48--52
| | | |
110-106 94--90 39--35 23 83 95--99
| | | | | | | |
114 102--98 47--43 31--27 79 107-103
| | | |
118 51--55--59--63 75 111-115-119-..
| | |
... 67--71
The curve is essentially an ever expanding "+" shape with one corner at the origin. Four such shapes pack as follows. O is the origin and each * is the end of the part on its right. π«Ά
+---+
| |
+---*--- +---+
| | B |
+---+ +---+ +---*
| C | | |
+---+ +---O---+ +---+
| | | A |
*---+ +---+ +---+
| D | |
+---+ +---*---+
| |
+---+
At higher replication levels the sides are wiggly and spiralling and the centres of each rotate around, but their sides are symmetric and mesh together perfectly to fill the plane. slay π
β FUNCTIONS β
See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.
$path = Math::PlanePath::QuintetCurve->new ()$path = Math::PlanePath::QuintetCurve->new (arms => $a)β Create and return a new path object. π($x,$y) = $path->n_to_xy ($n)β Return the X,Y coordinates of point number$non the path. Points begin at 0 and if"$n < 0"then the return is an empty list. π
Fractional positions give an X,Y position along a straight line between the integer positions.
$n = $path->n_start()β Return 0, the first N in the path.($n_lo, $n_hi) = $path->rect_to_n_range ($x1,$y1, $x2,$y2)β In the current code the returned range is exact, meaning$n_loand$n_hiare the smallest and biggest in the rectangle, but don't rely on that yet since finding the exact range is a touch on the slow side. (The advantage of which though is that it helps avoid very big ranges from a simple over-estimate.) π
π§ Level Methods π§
($n_lo, $n_hi) = $path->level_to_n_range($level)β Return"(0, 5**$level)", or for multiple arms return"(0, $arms * 5**$level)".
There are 5^level + 1 points in a level, numbered starting from 0. On the second and subsequent arms the origin is omitted (so as not to repeat that point) and so just 5^level for them, giving 5^level+1 + (arms-1)*5^level = arms*5^level + 1 many points starting from 0. πΈ
π FORMULAS π
Various properties are in my R5 Dragon mathematical write-up in section "Quartet Curve",
<http://user42.tuxfamily.org/r5dragon/index.html>
π X,Y to N π
The current approach uses the "QuintetCentres" "xy_to_n()". Because the tiling in "QuintetCurve" and "QuintetCentres" is the same, the X,Y coordinates for a given N are no more than 1 away in the grid.
The way the two lowest shapes are arranged in fact means that for a "QuintetCurve" N at X,Y then the same N on the "QuintetCentres" is at one of three locations
X, Y same
X, Y+1 up
X-1, Y+1 up and left
X-1, Y left
This is so even when the "arms" multiple paths are in use (the same arms in both coordinates). π
Is there an easy way to know which of the four offsets is right? The current approach is to give each to "QuintetCentres" to make an N, put that N back through "n_to_xy()" to see if it's the target $n. π¦
π SEE ALSO π
Math::PlanePath, Math::PlanePath::QuintetCentres, Math::PlanePath::QuintetReplicate, Math::PlanePath::Flowsnake
π HOME PAGE π
<http://user42.tuxfamily.org/math-planepath/index.html>
π LICENSE π
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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/>.
ok bestie that's literally the whole thing, every flag, every formula, every ASCII spiral, all of it π don't skip the license bit, that's the law fr fr π«Ά
and that's a wrap on this page, queen β it's from perl v5.32.0, dated 2021-01-23, and the file itself is Math::...etCurve(3pm) β¨ go forth and spiral, you ate π
π
π¦ where this page comes from
- debian bookworm: libmath-planepath-perl 129-1 Β· GPL-3.0-or-later
- debian trixie: libmath-planepath-perl 129-1 Β· GPL-3.0-or-later
- ubuntu jammy: libmath-planepath-perl 129-1 Β· GPL-3.0-or-later
- ubuntu noble: libmath-planepath-perl 129-1 Β· GPL-3.0-or-later
- ubuntu resolute: libmath-planepath-perl 129-1 Β· GPL-3.0-or-later
- ubuntu stonking: libmath-planepath-perl 129-1 Β· GPL-3.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms