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 12 12 31 < Y=0
/ / \ \
21 7891011 30 1
/ \
2223242526272829 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 11gonal "hendecagonal" numbers 11, 30, 58, etc, k*(9k7)/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 01 11 30
/ / \ \
20 678910 29
/ \
2122232425262728
With this adjustment the X axis N=0,1,11,30,etc is the hendecagonal numbers (9k7)*k/2. And N=0,8,25,etc diagonally SouthEast is the hendecagonals of the second kind which is (9k7)*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 isundef
.
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 SouthWest diagonal
A081267 N on X=Y negative SouthEast 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 (11gonal 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 SouthEast diagonal (11gonal second kind)
A062725 N on SouthWest 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/mathplanepath/index.html
LICENSE
Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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/>.