and 1 contributors

# 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). Cells are spread horizontally to fit on a square grid.

``````                      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``````

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 diagonals are 1 across and 1 up or down, so n=3 is at x=1,y=1. Each alternate row is thus offset from the one above or below. The resulting little triangles between the points are flatter than they ought to be. Drawn on a square grid the angle up is 45 degrees making an isosceles right triangle instead of 60 for an equilateral triangle, but at least the two sides slope down at the same angle.

This grid is the same as the HexSpiral and the path is like that spiral except instead of a flat top it extends to a triangular peak and the lower left and right extend out similarly. The result is a longer loop, and each successive cycle is 9 longer than the previous (whereas the HexSpiral takes 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.)

# FUNCTIONS

`\$path = Math::PlanePath::TriangleSpiral->new ()`

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