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

NAME

       Math::PlanePath::Staircase -- integer points in stair-step diagonal stripes

SYNOPSIS

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

DESCRIPTION

       This path makes a staircase pattern down from the Y axis to the X,

            8      29
                    |
            7      30---31
                         |
            6      16   32---33
                    |         |
            5      17---18   34---35
                         |         |
            4       7   19---20   36---37
                    |         |         |
            3       8--- 9   21---22   38---39
                         |         |         |
            2       2   10---11   23---24   40...
                    |         |         |
            1       3--- 4   12---13   25---26
                         |         |         |
           Y=0 ->   1    5--- 6   14---15   27---28

                    ^
                   X=0   1    2    3    4    5    6

       The 1,6,15,28,etc along the X axis at the end of each run are the hexagonal numbers
       k*(2*k-1).  The diagonal 3,10,21,36,etc up from X=0,Y=1 is the second hexagonal numbers
       k*(2*k+1), formed by extending the hexagonal numbers to negative k.  The two together are
       the triangular numbers k*(k+1)/2.

       Legendre's prime generating polynomial 2*k^2+29 bounces around for some low values then
       makes a steep diagonal upwards from X=19,Y=1, at a slope 3 up for 1 across, but only 2 of
       each 3 drawn.

   N Start
       The default is to number points starting N=1 as shown above.  An optional "n_start" can
       give a different start, in the same pattern.  For example to start at 0,

           n_start => 0

           28
           29 30
           15 31 32
           16 17 33 34
            6 18 19 35 36
            7  8 20 21 37 38
            1  9 10 22 23 ....
            2  3 11 12 24 25
            0  4  5 13 14 26 27

FUNCTIONS

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

       "$path = Math::PlanePath::Staircase->new ()"
       "$path = Math::PlanePath::AztecDiamondRings->new (n_start => $n)"
           Create and return a new staircase path object.

       "$n = $path->xy_to_n ($x,$y)"
           Return the point number for coordinates "$x,$y".  $x and $y are rounded to the nearest
           integers, which has the effect of treating each point $n as a square of side 1, so the
           quadrant x>=-0.5, y>=-0.5 is covered.

       "($n_lo, $n_hi) = $path->rect_to_n_range ($x1,$y1, $x2,$y2)"
           The returned range is exact, meaning $n_lo and $n_hi are the smallest and biggest in
           the rectangle.

FORMULAS

   Rectangle to N Range
       Within each row increasing X is increasing N, and in each column increasing Y is
       increasing pairs of N.  Thus for "rect_to_n_range()" the lower left corner vertical pair
       is the minimum N and the upper right vertical pair is the maximum N.

       A given X,Y is the larger of a vertical pair when ((X^Y)&1)==1.  If that happens at the
       lower left corner then it's X,Y+1 which is the smaller N, as long as Y+1 is in the
       rectangle.  Conversely at the top right if ((X^Y)&1)==0 then it's X,Y-1 which is the
       bigger N, again as long as Y-1 is in the rectangle.

OEIS

       Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include

           <http://oeis.org/A084849> (etc)

           n_start=1 (the default)
             A084849    N on diagonal X=Y

           n_start=0
             A014105    N on diagonal X=Y, second hexagonal numbers

           n_start=2
             A128918    N on X axis, except initial 1,1
             A096376    N on diagonal X=Y

SEE ALSO

       Math::PlanePath, Math::PlanePath::Diagonals, Math::PlanePath::Corner,
       Math::PlanePath::ToothpickSpiral

HOME PAGE

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

LICENSE

       Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 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/>.