NAME¶
Math::PlanePath::WunderlichSerpentine -- transpose parts of Peano curve,
including coil order
SYNOPSIS¶
use Math::PlanePath::WunderlichSerpentine;
my $path = Math::PlanePath::WunderlichSerpentine->new (serpentine_type => '111_000_111');
my ($x, $y) = $path->n_to_xy (123);
# or another radix digits ...
my $path5 = Math::PlanePath::WunderlichSerpentine->new (radix => 5);
DESCRIPTION¶
This is an integer version of Walter Wunderlich's variations on the
"PeanoCurve". A "serpentine type" controls transposing of
selected 3x3 sub-parts. The default is "alternating" 010,101,010
which transposes every second sub-part,
8 | 60--61--62--63 68--69 78--79--80--81
| | | | | | |
7 | 59--58--57 64 67 70 77--76--75 ...
| | | | | |
6 | 54--55--56 65--66 71--72--73--74
| |
5 | 53 48--47 38--37--36--35 30--29
| | | | | | | |
4 | 52 49 46 39--40--41 34 31 28
| | | | | | | |
3 | 51--50 45--44--43--42 33--32 27
| |
2 | 6-- 7-- 8-- 9 14--15 24--25--26
| | | | | |
1 | 5-- 4-- 3 10 13 16 23--22--21
| | | | | |
Y=0 | 0-- 1-- 2 11--12 17--18--19--20
|
+-------------------------------------
X=0 1 2 3 4 5 6 7 8
"serpentine_type" can be a string of 0s and 1s, with optional space,
comma or _ separators at each group of 3,
"011111011" 0/1 string
"011,111,011"
"011_111_011"
"011 111 011"
or special values
"alternating" 01010101.. the default
"coil" 11111... all 1s described below
"Peano" 00000... all 0s, gives PeanoCurve
Each "1" sub-part is transposed. The string is applied in order of the
N parts, irrespective of what net reversals and transposes are in force on a
particular part.
When no parts are transposed, which is a string of all 0s, the result is the
same as the "PeanoCurve". The special "serpentine_type =>
"Peano"" gives that.
Coil Order¶
"serpentine_type => "coil"" means "111 111 111"
to transpose all parts. The result is like a coil viewed side-on,
8 24--25--26--27--28--29 78--79--80--81--...
| | |
7 23--22--21 32--31--30 77--76--75
| | |
6 18--19--20 33--34--35 72--73--74
| | |
5 17--16--15 38--37--36 71--70--69
| | |
4 12--13--14 39--40--41 66--67--68
| | |
3 11--10-- 9 44--43--42 65--64--63
| | |
2 6-- 7-- 8 45--46--47 60--61--62
| | |
1 5-- 4-- 3 50--49--48 59--58--57
| | |
Y=0 0-- 1-- 2 51--52--53--54--55--56
X=0 1 2 3 4 5 6 7 8
Whenever "serpentine_type" begins with a "1" the initial
sub-part is transposed at each level. The first step N=0 to N=1 is kept fixed
along the X axis, then the higher levels are transposed. For example in the
coil above The N=9 to N=17 part is upwards, and then the N=81 to N=161 part is
to the right, and so on.
Radix¶
The optional "radix" parameter gives the size of the sub-parts,
similar to the "PeanoCurve" "radix" parameter (see
"Radix" in Math::PlanePath::PeanoCurve). For example radix 5 gives
radix => 5
4 | 20-21-22-23-24-25 34-35 44-45 70-71-72-73-74-75 84-85
| | | | | | | | | | |
3 | 19-18-17-16-15 26 33 36 43 46 69-68-67-66-65 76 83 86
| | | | | | | | | | |
2 | 10-11-12-13-14 27 32 37 42 47 60-61-62-63-64 77 82 87
| | | | | | | | | | |
1 | 9--8--7--6--5 28 31 38 41 48 59-58-57-56-55 78 81 88
| | | | | | | | | | |
Y=0 | 0--1--2--3--4 29-30 39-40 49-50-51-52-53-54 79-80 89-..
+---------------------------------------------------------
X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Like the "PeanoCurve" if the radix is even then the ends of each
sub-part don't join up. For example in radix 4 N=15 isn't next to N=16, nor
N=31 to N=32, etc.
| |
3 | 15--14--13--12 16 23--24 31 47--46--45--44 48 55--56 63
| | | | | | | | | | |
2 | 8-- 9--10--11 17 22 25 30 40--41--42--43 49 54 57 62
| | | | | | | | | | |
1 | 7-- 6-- 5-- 4 18 21 26 29 39--38--37--36 50 53 58 61
| | | | | | | | | | |
Y=0 | 0-- 1-- 2-- 3 19--20 27--28 32--33--34--35 51--52 59--60
+----------------------------------------------------------------
X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
In the "serpentine_type" 0,1 form, any space, comma, etc, separators
should group "radix" many values, so for example
serpentine_type => "00000_11111_00000_00000_11111"
The intention is to do something friendly if the separators are not on such
boundaries, so that say 000_111_000 can have a sensible meaning in a radix
higher than 3. But exactly what is not settled, so always give a full string
of desired 0,1 for now.
FUNCTIONS¶
See "FUNCTIONS" in Math::PlanePath for the behaviour common to all
path classes.
- "$path = Math::PlanePath::WunderlichSerpentine->new ()"
- "$path = Math::PlanePath::WunderlichSerpentine->new
(serpentine_type => $str, radix => $r)"
- Create and return a new path object.
The optional "radix" parameter gives the base for digit splitting.
The default is ternary, radix 3. The radix should be an odd number, 3, 5,
7, 9 etc.
SEE ALSO¶
Math::PlanePath, Math::PlanePath::PeanoCurve
Walter Wunderlich "Uber Peano-Kurven", Elemente der Mathematik,
28(1):1-10, 1973.
<
http://sodwana.uni-ak.ac.at/geom/mitarbeiter/wallner/wunderlich/>
<
http://sodwana.uni-ak.ac.at/geom/mitarbeiter/wallner/wunderlich/pdf/125.pdf>
HOME PAGE¶
<
http://user42.tuxfamily.org/math-planepath/index.html>
LICENSE¶
Copyright 2011, 2012, 2013, 2014 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/>.