++ed by:

2 PAUSE users

Kevin Ryde
and 1 contributors


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


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


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


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


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




Math-PlanePath is Copyright 2010, 2011 Kevin Ryde

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