NAME
Math::PlanePath::DragonRounded -- dragon curve with rounded corners
SYNOPSIS
use Math::PlanePath::DragonRounded;
my $path = Math::PlanePath::DragonRounded->new;
my ($x, $y) = $path->n_to_xy (123);
DESCRIPTION
This is a version of the dragon curve by Heighway, Harter, et al, done with two points per edge and skipping vertices so as to make rounded-off corners,
17-16 9--8 6
/ \ / \
18 15 10 7 5
| | | |
19 14 11 6 4
\ \ / \
20-21 13-12 5--4 3
\ \
22 3 2
| |
23 2 1
/ /
33-32 25-24 . 0--1 Y=0
/ \ /
34 31 26 -1
| | |
35 30 27 -2
\ \ /
36-37 29-28 44-45 -3
\ / \
38 43 46 -4
| | |
39 42 47 -5
\ / /
40-41 49-48 -6
/
50 -7
|
...
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
-15-14-13-12-11-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 X=0 1 2 3 ...
The two points on an edge have one of X or Y a multiple of 3, and the other Y or X at 1 mod 3 or 2 mod 3. For example the N=19 and N=20 are on the X=-9 edge (a multiple of 3), and at Y=4 and Y=5 (1 and 2 mod 3).
The "rounding" of the corners ensures that for example N=13 and N=21 don't touch as they approach X=-6,Y=3. The curve never crosses itself.
Arms
The dragon curve fills a quarter of the plane and four copies mesh together rotated by 90, 180 and 270 degrees. The arms
parameter can choose 1 to 4 curve arms, successively advancing. For example arms => 4
gives
36-32 59-... 6
/ \ /
... 40 28 55 5
| | | |
56 44 24 51 4
\ / \ \
52-48 13--9 20-16 47-43 3
/ \ \ \
17 5 12 39 2
| | | |
21 1 8 35 1
/ / /
29-25 6--2 0--4 27-31 <- Y=0
/ / /
33 10 3 23 -1
| | | |
37 14 7 19 -2
\ \ \ /
41-45 18-22 11-15 50-54 -3
\ \ / \
49 26 46 58 -4
| | | |
53 30 42 ... -5
/ \ /
...-57 34-38 -6
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
-6 -5 -4 -3 -2 -1 X=0 1 2 3 4 5 6
With 4 arms all 3x3 blocks are visited, using 4 out of 9 points in each.
FUNCTIONS
See "FUNCTIONS" in Math::PlanePath for the behaviour common to all path classes.
$path = Math::PlanePath::DragonRounded->new ()
$path = Math::PlanePath::DragonRounded->new (arms => $aa)
-
Create and return a new path object.
The optional
arms
parameter makes a multi-arm curve. The default is 1 for just one arm. ($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. $n = $path->n_start()
-
Return 0, the first N in the path.
SEE ALSO
Math::PlanePath, Math::PlanePath::DragonCurve, Math::PlanePath::DragonMidpoint
HOME PAGE
http://user42.tuxfamily.org/math-planepath/index.html
LICENSE
Copyright 2011 Kevin Ryde
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/>.