NAME
Math::PlanePath::PentSpiral  integer points in a pentagonal shape
SYNOPSIS
use Math::PlanePath::PentSpiral;
my $path = Math::PlanePath::PentSpiral>new;
my ($x, $y) = $path>n_to_xy (123);
DESCRIPTION
This path makes a pentagonal (fivesided) spiral with points spread out to fit on a square grid.
22 3
23 10 21 2
24 11 3 9 20 1
25 12 4 1 2 8 19 < Y=0
26 13 5 6 7 18 ... 1
27 14 15 16 17 33 2
28 29 30 31 32 2
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
6 5 4 3 2 1 X=0 1 2 3 4 5 6 7
Each horizontal gap is 2, so for instance n=1 is at x=0,y=0 then n=2 is at x=2,y=0. The lower diagonals are 1 across and 1 down, so n=17 is at x=4,y=2 and n=18 is x=5,y=1. But the upper angles go 2 across and 1 up, so n=20 is x=4,y=1 then n=21 is x=2,y=2.
The effect is to make the sides equal length, except for a kink at the lower right corner. Only every second square in the plane is used. In the top half (y>=0) those points line up, in the lower half (y<0) they're offset on alternate rows.
N Start
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 38
39 21 37
...
40 22 9 20 36 57
41 23 10 2 8 19 35 56
42 24 11 3 0 1 7 18 34 55
43 25 12 4 5 6 17 33 54
44 26 13 14 15 16 32 53
45 27 28 29 30 31 52
46 47 48 49 50 51
FUNCTIONS
See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.
$path = Math::PlanePath::PentSpiral>new ()
$path = Math::PlanePath::PentSpiral>new (n_start => $n)

Create and return a new pentagon spiral object.
$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 point in the path as a square of side 1.
FORMULAS
N to X,Y
It's convenient to work in terms of Nstart=0 and to take each loop as beginning on the SouthWest diagonal,
21 loop d=3
 
22 20
 
23 19
 
24 0 18
\ /
25 . 17
\ /
26 13141516
\
.
The SW diagonal is N=0,4,13,27,46,etc which is
N = (5d7)*d/2 + 1 # starting d=1 first loop
This can be inverted to get d from N
d = floor( (sqrt(40*N + 9) + 7) / 10 )
Each side is length d, except the lower right diagonal slope which is d1. For the very first loop that lower right is length 0.
OEIS
Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include
http://oeis.org/A140066 (etc)
n_start=1 (the default)
A192136 N on X axis, (5*n^2  3*n + 2)/2
A140066 N on Y axis
A116668 N on X negative axis
A005891 N on SouthEast diagonal, centred pentagonals
A134238 N on SouthWest diagonal
n_start=0
A000566 N on X axis, heptagonal numbers
A005476 N on Y axis
A028895 N on SouthEast diagonal
SEE ALSO
Math::PlanePath, Math::PlanePath::PentSpiralSkewed, 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/>.