NAME
Math::PlanePath::Staircase  integer points in stairstep 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 3031

6 16 3233
 
5 1718 3435
 
4 7 1920 3637
  
3 8 9 2122 3839
  
2 2 1011 2324 40...
  
1 3 4 1213 2526
  
Y=0 > 1 5 6 1415 2728
^
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*k1). 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,Y1 which is the bigger N, again as long as Y1 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
A210521 permutation N by diagonals, upwards
A199855 inverse
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/mathplanepath/index.html
LICENSE
Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Kevin Ryde
This file is part of MathPlanePath.
MathPlanePath 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.
MathPlanePath 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 MathPlanePath. If not, see <http://www.gnu.org/licenses/>.