Provided by: libmath-planepath-perl_113-1_all bug

NAME

       Math::PlanePath::SierpinskiCurveStair -- Sierpinski curve with stair-step diagonals

SYNOPSIS

        use Math::PlanePath::SierpinskiCurveStair;
        my $path = Math::PlanePath::SierpinskiCurveStair->new (arms => 2);
        my ($x, $y) = $path->n_to_xy (123);

DESCRIPTION

       This is a variation on the "SierpinskiCurve" with stair-step diagonal parts.

           10  |                                  52-53
               |                                   |  |
            9  |                               50-51 54-55
               |                                |        |
            8  |                               49-48 57-56
               |                                   |  |
            7  |                         42-43 46-47 58-59 62-63
               |                          |  |  |        |  |  |
            6  |                      40-41 44-45       60-61 64-65
               |                       |                          |
            5  |                      39-38 35-34       71-70 67-66
               |                          |  |  |        |  |  |
            4  |                12-13    37-36 33-32 73-72 69-68    92-93
               |                 |  |              |  |              |  |
            3  |             10-11 14-15       30-31 74-75       90-91 94-95
               |              |        |        |        |        |        |
            2  |              9--8 17-16       29-28 77-76       89-88 97-96
               |                 |  |              |  |              |  |
            1  |        2--3  6--7 18-19 22-23 26-27 78-79 82-83 86-87 98-99
               |        |  |  |        |  |  |  |        |  |  |  |        |
           Y=0 |     0--1  4--5       20-21 24-25       80-81 84-85       ...
               |
               +-------------------------------------------------------------
                  ^
                 X=0 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19

       The tiling is the same as the "SierpinskiCurve", but each diagonal is a stair step
       horizontal and vertical.  The correspondence is

           SierpinskiCurve        SierpinskiCurveStair

                       7--                   12--
                     /                        |
                    6                     10-11
                    |                      |
                    5                      9--8
                     \                        |
              1--2     4             2--3  6--7
            /     \  /               |  |  |
           0        3             0--1  4--5

       So the "SierpinskiCurve" N=0 to N=1 diagonal corresponds to N=0 to N=2 here, and N=2 to
       N=3 corresponds to N=3 to N=5.  The join section N=3 to N=4 gets an extra point at N=6
       here, and later similar N=19, etc.

   Diagonal Length
       The "diagonal_length" option can make longer diagonals, still in stair-step style.  For
       example "diagonal_length => 4",

           10  |                                 36-37
               |                                  |  |
            9  |                              34-35 38-39
               |                               |        |
            8  |                           32-33       40-41
               |                            |              |
            7  |                        30-31             42-43
               |                         |                    |
            6  |                     28-29                   44-45
               |                      |                          |
            5  |                     27-26                   47-46
               |                         |                    |
            4  |                8--9    25-24             49-48    ...
               |                |  |        |              |        |
            3  |             6--7 10-11    23-22       51-50    62-63
               |             |        |        |        |        |
            2  |          4--5       12-13    21-20 53-52    60-61
               |          |              |        |  |        |
            1  |       2--3             14-15 18-19 54-55 58-59
               |       |                    |  |        |  |
           Y=0 |    0--1                   16-17       56-57
               |
               +------------------------------------------------------
                 ^
                X=0 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17

       The length is reckoned from N=0 to the end of the first side N=8, which is X=1 to X=5 for
       length 4 units.

   Arms
       The optional "arms" parameter can give up to eight copies of the curve, each advancing
       successively.  For example "arms => 8",

              98-90 66-58       57-65 89-97            5
                  |  |  |        |  |  |
           99    82-74 50-42 41-49 73-81    96         4
            |              |  |              |
           91-83       26-34 33-25       80-88         3
               |        |        |        |
           67-75       18-10  9-17       72-64         2
            |              |  |              |
           59-51 27-19     2  1    16-24 48-56         1
               |  |  |              |  |  |
              43-35 11--3     .  0--8 32-40       <- Y=0

              44-36 12--4        7-15 39-47           -1
               |  |  |              |  |  |
           60-52 28-20     5  6    23-31 55-63        -2
            |              |  |              |
           68-76       21-13 14-22       79-71        -3
               |        |        |        |
           92-84       29-37 38-30       87-95        -4
                           |  |
                 85-77 53-45 46-54 78-86              -5
                  |  |  |        |  |  |
                 93 69-61       62-70 94              -6

                              ^
           -6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5  6

       The multiplies of 8 (or however many arms) N=0,8,16,etc is the original curve, and the
       further mod 8 parts are the copies.

       The middle "." shown is the origin X=0,Y=0.  It would be more symmetrical to have the
       origin the middle of the eight arms, which would be X=-0.5,Y=-0.5 in the above, but that
       would give fractional X,Y values.  Apply an offset X+0.5,Y+0.5 to centre if desired.

   Level Ranges
       For "diagonal_length" = L and reckoning the first diagonal side N=0 to N=2L as level 0, a
       level extends out to a triangle

           Nlevel = ((6L+4)*4^level - 4) / 3
           Xlevel = (L+2)*2^level - 1

       For example level 2 in the default L=1 goes to N=((6*1+4)*4^2-4)/3=52 and
       Xlevel=(1+2)*2^2-1=11.  Or in the L=4 sample above level 1 is N=((6*4+4)*4^1-4)/3=36 and
       Xlevel=(4+2)*2^1-1=11.

       The power-of-4 in Nlevel is per the plain "SierpinskiCurve", with factor 2L+1 for the
       points making the diagonal stair.  The "/3" arises from the extra points between
       replications.  They become a power-of-4 series

           Nextras = 1+4+4^2+...+4^(level-1) = (4^level-1)/3

       For example level 1 is Nextras=(4^1-1)/3=1, being point N=6 in the default L=1.  Or for
       level 2 Nextras=(4^2-1)/3=5 at N=6 and N=19,26,33,46.

       The curve doesn't visit all the points in the eighth of the plane below the X=Y diagonal.
       In general Nlevel+1 many points of the triangular area Xlevel*(Xlevel-1)/2 are visited,
       for a filled fraction which approaches a constant

           FillFrac = Nlevel / (Xlevel*(Xlevel-1)/2)
                   -> 4/3 * (3L+2)/(L+2)^2

       For example the default L=1 has FillFrac=20/27=0.74.  Or L=2 FillFrac=2/3=0.66.  As the
       diagonal length increases the fraction decreases due to the growing holes in the pattern.

FUNCTIONS

       See "FUNCTIONS" in Math::PlanePath for the behaviour common to all path classes.

       "$path = Math::PlanePath::SierpinskiCurveStair->new ()"
       "$path = Math::PlanePath::SierpinskiCurveStair->new (diagonal_length => $L, arms => $A)"
           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::SierpinskiCurve

HOME PAGE

       <http://user42.tuxfamily.org/math-planepath/index.html>

LICENSE

       Copyright 2011, 2012, 2013 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/>.