logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Math::PlanePath::PyramidSides -- points along the sides of pyramid

Description

       This path puts points in layers along the sides of a pyramid growing upwards.

                               21                        4
                           20  13  22                    3
                       19  12   7  14  23                2
                   18  11   6   3   8  15  24            1
               17  10   5   2   1   4   9  16  25    <- Y=0
              ------------------------------------
                                ^
           ... -4  -3  -2  -1  X=0  1   2   3   4 ...

       N=1,4,9,16,etc along the positive X axis is the perfect squares.  N=2,6,12,20,etc in the X=-1 vertical is
       the pronic numbers k*(k+1) half way between those successive squares.

       The pattern is the same as the "Corner" path but turned and spread so the single quadrant in the "Corner"
       becomes a half-plane here.

       The pattern is similar to "PyramidRows" (with its default step=2), just with the columns dropped down
       vertically to start at the X axis.  Any pattern occurring within a column is unchanged, but what was a
       row becomes a diagonal and vice versa.

   LuckyNumbersofEuler
       An interesting sequence for this path is Euler's k^2+k+41.  The low values are spread around a bit, but
       from N=1763 (k=41) they're the vertical at X=40.  There's quite a few primes in this quadratic and when
       plotting primes that vertical stands out a little denser than its surrounds (at least for up to the first
       2500 or so values).  The line shows in other step==2 paths too, but not as clearly.  In the "PyramidRows"
       for instance the beginning is up at Y=40, and in the "Corner" path it's a diagonal.

   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 pyramid pattern.  For example to start at 0,

           n_start => 0

                       20                    4
                    19 12 21                 3
                 18 11  6 13 22              2
              17 10  5  2  7 14 23           1
           16  9  4  1  0  3  8 15 24    <- Y=0
           --------------------------
           -4 -3 -2 -1 X=0 1  2  3  4

Formulas

RectangletoNRange
       For "rect_to_n_range()", in each column N increases so the biggest N  is  in  the  topmost  row  and  and
       smallest N in the bottom row.

       In  each  row  N  increases  along the sequence X=0,-1,1,-2,2,-3,3, etc.  So the biggest N is at the X of
       biggest absolute value and preferring the positive X=k over the negative X=-k.

       The smallest N conversely is at the X of smallest absolute value.  If the X range crosses 0, ie. $x1  and
       $x2 have different signs, then X=0 is the smallest.

Functions

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

       "$path = Math::PlanePath::PyramidSides->new ()"
       "$path = Math::PlanePath::PyramidSides->new (n_start => $n)"
           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.

           For  "$n  < 0.5" the return is an empty list, it being considered there are no negative points in the
           pyramid.

       "$n = $path->xy_to_n ($x,$y)"
           Return the point number for coordinates "$x,$y".  $x and $y are each rounded to the  nearest  integer
           which  has  the  effect  of  treating points in the pyramid as a squares of side 1, so the half-plane
           y>=-0.5 is entirely 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 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::PyramidSides(3pm)

Name

       Math::PlanePath::PyramidSides -- points along the sides of pyramid

Oeis

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

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

           n_start=1 (the default)
             A049240    abs(dY), being 0=horizontal step at N=square
             A002522    N on X negative axis, x^2+1
             A033951    N on X=Y diagonal, 4d^2+3d+1
             A004201    N for which X>=0, ie. right hand half
             A020703    permutation N at -X,Y

          n_start=0
             A196199    X coordinate, runs -n to +n
             A053615    abs(X), runs n to 0 to n
             A000196    abs(X)+abs(Y), being floor(sqrt(N)),
                          k repeated 2k+1 times starting 0

See Also

       Math::PlanePath,  Math::PlanePath::PyramidRows,  Math::PlanePath::Corner, Math::PlanePath::DiamondSpiral,
       Math::PlanePath::SacksSpiral, Math::PlanePath::MPeaks

Synopsis

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

See Also