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

NAME

       Math::PlanePath::TriangleSpiral -- integer points drawn around an equilateral triangle

SYNOPSIS

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

DESCRIPTION

       This path makes a spiral shaped as an equilateral triangle (each side the same length).

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

                              ^
           -6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5  6  7  8

       Cells are spread horizontally to fit on a square grid as per "Triangular Lattice" in
       Math::PlanePath.  The horizontal gaps are 2, so for instance n=1 is at x=0,y=0 then n=2 is
       at x=2,y=0.  The diagonals are 1 across and 1 up or down, so n=3 is at x=1,y=1.  Each
       alternate row is offset from the one above or below.

       This grid is the same as the "HexSpiral" and the path is like that spiral except instead
       of a flat top and SE,SW sides it extends to triangular peaks.  The result is a longer loop
       and each successive loop is step=9 longer than the previous (whereas the "HexSpiral" is
       step=6 more).

       The triangular numbers 1, 3, 6, 10, 15, 21, 28, 36 etc, k*(k+1)/2, fall one before the
       successive corners of the triangle, so when plotted make three lines going vertically and
       angled down left and right.

       The 11-gonal "hendecagonal" numbers 11, 30, 58, etc, k*(9k-7)/2 fall on a straight line
       horizontally to the right.  (As per the general rule that a step "s" lines up the
       (s+2)-gonal numbers.)

   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,

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

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

FUNCTIONS

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

       "$path = Math::PlanePath::TriangleSpiral->new ()"
       "$path = Math::PlanePath::TriangleSpiral->new (n_start => $n)"
           Create and return a new triangle spiral object.

       "($x,$y) = $path->n_to_xy ($n)"
           Return the X,Y coordinates of point number $n on the path.

           For "$n < 1" the return is an empty list, it being considered the path starts at 1.

       "$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 a square of
           side 1.

           Only every second square in the plane has an N.  If "$x,$y" is a position without an N
           then the return is "undef".

OEIS

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

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

           n_start=1 (default)
             A010054     turn 1=left,0=straight, extra initial 1

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

             A063177     total sum previous row or diagonal

           n_start=0
             A051682     N on X axis (11-gonal numbers)
             A062741     N on Y axis
             A062708     N on X=Y leading diagonal
             A081268     N on X=Y+2 diagonal (right of leading diagonal)
             A062728     N on South-East diagonal (11-gonal second kind)
             A062725     N on South-West diagonal
             A081275     N on ENE slope from X=2,Y=0 then dX=+3,dY=+1
             A081266     N on WSW slope dX=-3,dY=-1
             A081271     N on X=2 vertical

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

       A023531 is "n_start=-1" to match its "offset=0" for the first turn, being the second point
       of the path.  A010054 which is 1 at triangular numbers k*(k+1)/2 is the same except for an
       extra initial 1.

SEE ALSO

       Math::PlanePath, Math::PlanePath::TriangleSpiralSkewed, Math::PlanePath::HexSpiral

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