The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Math::PlanePath::HexSpiral -- integer points in a diamond shape

SYNOPSIS

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

DESCRIPTION

This path makes a hexagonal spiral, with points spread out horizontally to fit on a square grid.

             28 -- 27 -- 26 -- 25                  3
            /                    \
          29    13 -- 12 -- 11    24               2
         /     /              \     \
       30    14     4 --- 3    10    23            1
      /     /     /         \     \    \
    31    15     5     1 --- 2     9    22    <- y=0
      \     \     \              /     /
       32    16     6 --- 7 --- 8    21           -1
         \     \                    /
          33    17 -- 18 -- 19 -- 20              -2
            \
             34 -- 35 ...                         -3

     ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^
    -6 -5 -4 -3 -2 -1 x=0 1  2  3  4  5  6

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 just 1 across, so n=3 is at x=1,y=1. Each alternate row is offset from the one above or below. The resulting "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.

Wider

An optional wider parameter makes the path wider, stretched along the top and bottom horizontals. For example

    $path = Math::PlanePath::HexSpiral->new (wider => 2);

gives

                                ... 36----35                   3
                                            \
                21----20----19----18----17    34               2
               /                          \     \
             22     8---- 7---- 6---- 5    16    33            1
            /     /                    \     \    \
          23     9     1---- 2---- 3---- 4    15    32    <- y=0
            \     \                          /     /
             24    10----11----12----13----14    31           -1
               \                               /
                25----26----27----28---29----30               -2
             
           ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^
          -7 -6 -5 -4 -3 -2 -1 x=0 1  2  3  4  5  6  7

The centre horizontal 1 to 2 is extended by wider many further places, then the path loops around that shape. The starting point 1 is shifted to the left by wider places to keep the spiral centred on the origin x=0,y=0. Each horizontal gap is still 2.

Each loop is still 6 longer than the previous, since the widening is basically a constant amount added into each loop.

FUNCTIONS

$path = Math::PlanePath::HexSpiral->new ()
$path = Math::PlanePath::HexSpiral->new (wider => $w)

Create and return a new HexSpiral path object. An optional wider parameter widens the spiral path, it defaults to 0 which is no widening.

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

SEE ALSO

Math::PlanePath, Math::PlanePath::HexSpiralSkewed, Math::PlanePath::TriangleSpiral

HOME PAGE

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

LICENSE

Math-PlanePath is Copyright 2010 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/>.