Math::PlanePath::Staircase -- integer points in stair-step diagonal stripes
Contents
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.
NStart
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
Formulas
RectangletoNRange
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.
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.
Home Page
License
Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 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/>.
perl v5.32.0 2021-01-23 Math::PlanePath::Staircase(3pm)
Name
Math::PlanePath::Staircase -- integer points in stair-step diagonal stripes
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
Synopsis
use Math::PlanePath::Staircase;
my $path = Math::PlanePath::Staircase->new;
my ($x, $y) = $path->n_to_xy (123);
