NAME
Math::PlanePath::MathImageSierpinskiCurve -- Sierpinski curve
SYNOPSIS
use Math::PlanePath::MathImageSierpinskiCurve;
my $path = Math::PlanePath::MathImageSierpinskiCurve->new (arms => 2);
my ($x, $y) = $path->n_to_xy (123);
DESCRIPTION
In progress.
This is an integer version of the self-similar curve by Sierpinski tiling with right triangles. The default is a single arm of the curve in an eighth of the plane.
31-32 10
/ \
30 33 9
| |
29 34 8
\ /
25-26 28 35 37-38 7
/ \ / \ / \
24 27 36 39 6
| |
23 20 43 40 5
\ / \ / \ /
7--8 22-21 19 44 42-41 55-.. 4
/ \ / \ /
6 9 18 45 54 3
| | | | |
5 10 17 46 53 2
\ / \ / \
1--2 4 11 13-14 16 47 49-50 52 1
/ \ / \ / \ / \ / \ /
0 3 12 15 48 51 <- Y=0
^
X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
The tiling it represents is
/
/|\
/ | \
/ | \
/ 7| 8 \
/ \ | / \
/ \ | / \
/ 6 \|/ 9 \
/-------|-------\
/|\ 5 /|\ 10 /|\
/ | \ / | \ / | \
/ | \ / | \ / | \
/ 1| 2 X 4 |11 X 13|14 \
/ \ | / \ | / \ | / \ ...
/ \ | / \ | / \ | / \
/ 0 \|/ 3 \|/ 12 \|/ 15 \
--------------------------------
The points are on a square grid with integer X,Y. 4 points in each 3x3 block are used. In general a point is used if
X%3==1 or Y%3==1, but not both
((X%3)+(Y%3)) % 2 == 1
Level Ranges
Counting the N=0 to N=3 as level=1, N=0 to N=15 as level 2, etc, the end of each level, back at the X axis, is
Nlevel = 4^level - 1
Xlevel = 3*2^level - 2
Ylevel = 0
For example level=2 is Nend = 2^(2*2)-1 = 15 at X=3*2^2-2 = 10.
The top of each level is half way along,
Ntop = (4^level)/2 - 1
Xtop = 3*2^(level-1)-1
Ytop = 3*2^(level-1)-2
For example level=3 is Ntop = 2^(2*3-1)-1 = 31 at X=3*2^(3-1)-1 = 10 and Y=3*2^(3-1)-1 = 11.
The factor of 3 arises because there's a gap between each level, increasing each level by a fixed extra each time,
length(level) = 2*length(level-1) + 2
= 2^level + 2^level + 2^(level-1) + ... + 2
= 2^level + 2^(level+1)-1 - 1
= 3*2^level - 2
Arms
The optional arms
parameter can draw multiple curves, each advancing successively. For example arms => 2
,
...
|
33 39 57 63 11
/ \ / \ / \ /
31 35-37 41 55 59-61 62-.. 10
\ / \ /
29 43 53 60 9
| | | |
27 45 51 58 8
/ \ / \
25 21-19 47-49 50-52 56 7
\ / \ / \ /
23 17 48 54 6
| |
9 15 46 40 5
/ \ / \ / \
7 11-13 14-16 44-42 38 4
\ / \ /
5 12 18 36 3
| | | |
3 10 20 34 2
/ \ / \
1 2--4 8 22 26-28 32 1
/ \ / \ / \ /
0 6 24 30 <- Y=0
^
X=0 1 2 3 4 5 6 7 8 9 10 11
The N=0 point is at X=1,Y=0 (in all arms forms) so that the second arm is within the first quadrant.
Anywhere between 1 and 8 arms can be done this way. arms=>8
is as follows (the middle "." is the origin X=0,Y=0).
... ... 6
| |
58 34 33 57 5
\ / \ / \ /
...-59 50-42 26 25 41-49 56-... 4
\ / \ /
51 18 17 48 3
| | | |
43 10 9 40 2
/ \ / \
35 19-11 2 1 8-16 32 1
\ / \ / \ /
27 3 . 0 24 <- Y=0
28 4 7 31 -1
/ \ / \ / \
36 20-12 5 6 15-23 39 -2
\ / \ /
44 13 14 47 -3
| | | |
52 21 22 55 -4
/ \ / \
...-60 53-45 29 30 46-54 63-... -5
/ \ / \ / \
61 37 38 62 -6
| |
... ... -7
^
-7 -6 -5 -4 -3 -2 -1 X=0 1 2 3 4 5 6
Closed Curve
Sierpinki's original conception was a closed curve filling a unit square by ever greater self-similar detail,
/\_/\ /\_/\ /\_/\ /\_/\
\ / \ / \ / \ /
| | | | | | | |
/ _ \_/ _ \ / _ \_/ _ \
\/ \ / \/ \/ \ / \/
| | | |
/\_/ _ \_/\ /\_/ _ \_/\
\ / \ / \ / \ /
| | | | | | | |
/ _ \ / _ \_/ _ \ / _ \
\/ \/ \/ \ / \/ \/ \/
| |
/\_/\ /\_/ _ \_/\ /\_/\
\ / \ / \ / \ /
| | | | | | | |
/ _ \_/ _ \ / _ \_/ _ \
\/ \ / \/ \/ \ / \/
| | | |
/\_/ _ \_/\ /\_/ _ \_/\
\ / \ / \ / \ /
| | | | | | | |
/ _ \ / _ \ / _ \ / _ \
\/ \/ \/ \/ \/ \/ \/ \/
The code here might be pressed into use for this by drawing a mirror image of the curve (N=0 through Nlevel above), or using the arms=>2
form (N=0 to N=4^level, inclusive), and joining up the ends.
FUNCTIONS
See "FUNCTIONS" in Math::PlanePath for the behaviour common to all path classes.
$path = Math::PlanePath::MathImageSierpinskiCurve->new ()
$path = Math::PlanePath::MathImageSierpinskiCurve->new (arms => 8)
-
Create and return a new path object.
($x,$y) = $path->n_to_xy ($n)
-
Return the X,Y coordinates of point number
$n
on 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.
SEE ALSO
Math::PlanePath, Math::PlanePath::SierpinskiArrowhead, Math::PlanePath::KochCurve