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

NAME

       Math::PlanePath::TriangleSpiralSkewed -- integer points drawn around a skewed equilateral
       triangle

SYNOPSIS

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

DESCRIPTION

       This path makes an spiral shaped as an equilateral triangle (each side the same length),
       but skewed to the left to fit on a square grid,

           16                              4
            |\
           17 15                           3
            |   \
           18  4 14                        2
            |  |\  \
           19  5  3 13                     1
            |  |   \  \
           20  6  1--2 12 ...         <- Y=0
            |  |         \  \
           21  7--8--9-10-11 30           -1
            |                  \
           22-23-24-25-26-27-28-29        -2

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

       The properties are the same as the spread-out "TriangleSpiral".  The triangle numbers fall
       on straight lines as they do in the "TriangleSpiral" but the skew means the top corner
       goes up at an angle to the vertical and the left and right downwards are different angles
       plotted (but are symmetric by N count).

   Skew Right
       Option "skew => 'right'" directs the skew towards the right, giving

             4                  16      skew="right"
                               / |
             3               17 15
                            /    |
             2            18  4 14
                         /  / |  |
             1        ...  5  3 13
                         /    |  |
           Y=0 ->       6  1--2 12
                      /          |
            -1       7--8--9-10-11

                           ^
                    -2 -1 X=0 1  2

       This is a shear "X -> X+Y" of the default skew="left" shown above.  The coordinates are
       related by

           Xright = Xleft + Yleft         Xleft = Xright - Yright
           Yright = Yleft                 Yleft = Yright

   Skew Up
             2       16-15-14-13-12-11      skew="up"
                      |            /
             1       17  4--3--2 10
                      |  |   /  /
           Y=0 ->    18  5  1  9
                      |  |   /
            -1      ...  6  8
                         |/
            -2           7

                           ^
                    -2 -1 X=0 1  2

       This is a shear "Y -> X+Y" of the default skew="left" shown above.  The coordinates are
       related by

           Xup = Xleft                 Xleft = Xup
           Yup = Yleft + Xleft         Yleft = Yup - Xup

   Skew Down
             2          ..-18-17-16       skew="down"
                                  |
             1        7--6--5--4 15
                       \       |  |
           Y=0 ->        8  1  3 14
                          \  \ |  |
            -1              9  2 13
                             \    |
            -2                10 12
                                \ |
                                 11

                            ^
                     -2 -1 X=0 1  2

       This is a rotate by -90 degrees of the skew="up" above.  The coordinates are related

           Xdown = Yup          Xup = - Ydown
           Ydown = - Xup        Yup = Xdown

       Or related to the default skew="left" by

           Xdown = Yleft + Xleft        Xleft = - Ydown
           Ydown = - Xleft              Yleft = Xdown + Ydown

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

           15        n_start => 0
            |\
           16 14
            |   \
           17  3 13 ...
            |  |\  \  \
           18  4  2 12 31
            |  |   \  \  \
           19  5  0--1 11 30
            |  |         \  \
           20  6--7--8--9-10 29
            |                  \
           21-22-23-24-25-26-27-28

       With this adjustment for example the X axis N=0,1,11,30,etc is (9X-7)*X/2, the
       hendecagonal numbers (11-gonals).  And South-East N=0,8,25,etc is the hendecagonals of the
       second kind, (9Y-7)*Y/2 with Y negative.

FUNCTIONS

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

       "$path = Math::PlanePath::TriangleSpiralSkewed->new ()"
       "$path = Math::PlanePath::TriangleSpiralSkewed->new (skew => $str, n_start => $n)"
           Create and return a new skewed triangle spiral object.  The "skew" parameter can be

               "left"    (the default)
               "right"
               "up"
               "down"

       "$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 each N in the path as centred in a
           square of side 1, so the entire plane is covered.

FORMULAS

   Rectangle to N Range
       Within each row there's a minimum N and the N values then increase monotonically away from
       that minimum point.  Likewise in each column.  This means in a rectangle the maximum N is
       at one of the four corners of the rectangle.

                     |
           x1,y2 M---|----M x2,y2        maximum N at one of
                 |   |    |              the four corners
              -------O---------          of the rectangle
                 |   |    |
                 |   |    |
           x1,y1 M---|----M x1,y1
                     |

OEIS

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

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

           n_start=1, skew="left" (the defaults)
             A204439     abs(dX)
             A204437     abs(dY)
             A010054     turn 1=left,0=straight, extra initial 1

             A117625     N on X axis
             A064226     N on Y axis, but without initial value=1
             A006137     N on X negative
             A064225     N on Y negative
             A081589     N on X=Y leading diagonal
             A038764     N on X=Y negative South-West diagonal
             A081267     N on X=-Y negative South-East diagonal
             A060544     N on ESE slope dX=+2,dY=-1
             A081272     N on SSE slope dX=+1,dY=-2

             A217010     permutation N values of points in SquareSpiral order
             A217291      inverse
             A214230     sum of 8 surrounding N
             A214231     sum of 4 surrounding N

           n_start=0
             A051682     N on X axis (11-gonal numbers)
             A081268     N on X=1 vertical (next to Y axis)
             A062708     N on Y axis
             A062725     N on Y negative axis
             A081275     N on X=Y+1 North-East diagonal
             A062728     N on South-East diagonal (11-gonal second kind)
             A081266     N on X=Y negative South-West diagonal
             A081270     N on X=1-Y North-West diagonal, starting N=3
             A081271     N on dX=-1,dY=2 NNW slope up from N=1 at X=1,Y=0

           n_start=-1
             A023531     turn 1=left,0=straight, being 1 at N=k*(k+3)/2
             A023532     turn 1=straight,0=left

           n_start=1, skew="right"
             A204435     abs(dX)
             A204437     abs(dY)
             A217011     permutation N values of points in SquareSpiral order
                           but with 90-degree rotation
             A217292     inverse
             A214251     sum of 8 surrounding N

           n_start=1, skew="up"
             A204439     abs(dX)
             A204435     abs(dY)
             A217012     permutation N values of points in SquareSpiral order
                           but with 90-degree rotation
             A217293     inverse
             A214252     sum of 8 surrounding N

           n_start=1, skew="down"
             A204435     abs(dX)
             A204439     abs(dY)

       The square spiral order in A217011,A217012 and their inverses has first step at 90-degrees
       to the first step of the triangle spiral, hence the rotation by 90 degrees when relating
       to the "SquareSpiral" path.  A217010 on the other hand has no such rotation since it
       reckons the square and triangle spirals starting in the same direction.

SEE ALSO

       Math::PlanePath, Math::PlanePath::TriangleSpiral, Math::PlanePath::PyramidSpiral,
       Math::PlanePath::SquareSpiral

HOME PAGE

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

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/>.