Math::...Spiral(3pm)
β¨ Math::PlanePath::HilbertSpiral β¨
okay so bestie, welcome to a 3pm page from the User Contributed Perl Documentation corner of the universe π it's giving math, it's giving spiral, it's giving "let me explain this to you like you're my group chat."
πΈ NAME πΈ
Math::PlanePath::HilbertSpiral β a 2x2 self-similar spiral, no cap π
π SYNOPSIS π
use Math::PlanePath::HilbertSpiral;
my $path = Math::PlanePath::HilbertSpiral->new;
my ($x, $y) = $path->n_to_xy (123);
literally three lines and you're in β¨
π¦ DESCRIPTION π¦
so this is a Hilbert curve variation, and the whole vibe is that it fills the plane by spiralling around into negative X,Y on every second replication level. like, it goes out, then it goes down-left, and it keeps doing that. iconic behavior fr fr π
..--63--62 49--48--47 44--43--42 5
| | | | |
60--61 50--51 46--45 40--41 4
| | |
59 56--55 52 33--34 39--38 3
| | | | | | |
58--57 54--53 32 35--36--37 2
|
5-- 4-- 3-- 2 31 28--27--26 1
| | | | |
6-- 7 0-- 1 30--29 24--25 <- Y=0
| |
9-- 8 13--14 17--18 23--22 -1
| | | | | |
10--11--12 15--16 19--20--21 -2
-2 -1 X=0 1 2 3 4 5
The curve starts with the same N=0 to N=3 as the "HilbertCurve", and then the following 2x2 blocks N=4 to N=15 go around in negative X,Y. The top-left corner for this negative direction is at Ntopleft=4^level-1 for an odd numbered level.
The parts of the curve in the X,Y negative parts are the same as the plain "HilbertCurve", just mirrored along the anti-diagonal. For example, N=4 to N=15:
HilbertSpiral HilbertCurve
\ 5---6 9--10
\ | | | |
\ 4 7---8 11
\ |
5-- 4 \ 13--12
| \ |
6-- 7 \ 14--15
| \
9-- 8 13--14 \
| | | \
10--11--12 15
This mirroring has the effect of mapping
HilbertCurve X,Y -> -Y,-X for HilbertSpiral
Notice the coordinate difference (-Y)-(-X) = X-Y so that difference, representing a projection onto the X=-Y opposite diagonal, is the same in both paths. cute little invariant, honestly obsessed π₯°
π Level Ranges π
Reckoning the initial N=0 to N=3 as level 1, a replication level extends to
Nstart = 0
Nlevel = 4^level - 1 (inclusive)
Xmin = Ymin = - (4^floor(level/2) - 1) * 2 / 3
= binary 1010...10
Xmax = Ymax = (4^ceil(level/2) - 1) / 3
= binary 10101...01
width = height = Xmax - Xmin
= Ymax - Ymin
= 2^level - 1
The X,Y range doubles alternately above and below, so the result is a 1 bit going alternately to the max or min, starting with the max for level 1. it's giving alternating bit pattern and honestly? slay π
level X,Ymin binary X,Ymax binary
----- --------------- --------------
0 0 0
1 0 0 1 = 1
2 -2 = -10 1 = 01
3 -2 = -010 5 = 101
4 -10 = -1010 5 = 0101
5 -10 = -01010 21 = 10101
6 -42 = -101010 21 = 010101
7 -42 = -0101010 85 = 1010101
The power-of-4 formulas above for Ymin/Ymax have the effect of producing alternating bit patterns like this.
This is the same sort of level range as "BetaOmega" has on its Y coordinate, but on this "HilbertSpiral" it applies to both X and Y. double the chaos, double the fun π
π₯ FUNCTIONS π₯
See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes. (the shared lore, iykyk)
$path = Math::PlanePath::HilbertSpiral->new ()β Create and return a new path object. your main character moment starts here π($x,$y) = $path->n_to_xy ($n)β Return the X,Y coordinates of point number$non the path. Points begin at0and if"$n < 0"then the return is an empty list. no points for negativity bestie, literally π«($n_lo, $n_hi) = $path->rect_to_n_range ($x1,$y1, $x2,$y2)β The returned range is exact, meaning$n_loand$n_hiare the smallest and biggest in the rectangle. precise queen behavior β¨
π Level Methods π
($n_lo, $n_hi) = $path->level_to_n_range($level)β Return(0, 4**$level - 1). that's it. that's the whole method. and it ATE π
π OEIS π
Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include
<http://oeis.org/A059285> (etc)
A059285 X-Y coordinate diff
The difference X-Y is the same as the "HilbertCurve", since the "negative" spiral parts are mirrored across the X=-Y anti-diagonal, which means coordinates (-Y,-X) and -Y-(-X) = X-Y. math really said "same energy" π
π SEE ALSO π
Math::PlanePathMath::PlanePath::HilbertCurveMath::PlanePath::BetaOmega
π 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/>.
fr fr: that warranty disclaimer is not a vibe killer, it's just the truth. no cap, read your licenses bestie π
and that's the whole page, bestie π this was perl v5.32.0, dated 2021-01-23, serving you Math::...Spiral(3pm) realness. go spiral into the negatives, you've earned it π
β¨π¦
π¦ 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