Kevin Ryde > Math-PlanePath-114 > Math::PlanePath::TriangleSpiral

Math-PlanePath-114.tar.gz

Dependencies

Annotate this POD

Website

# CPAN RT

 Open 2
View/Report Bugs
Module Version: 114   Source   Latest Release: Math-PlanePath-115

# 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

```    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     N position of turns (to the left)
1 at N=k*(k+3)/2```

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.

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