++ed by:
Kevin Ryde
and 1 contributors

# NAME

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

# SYNOPSIS

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

# DESCRIPTION

This path makes a hexagonal spiral with points skewed so as to fit a square grid and fully cover the plane.

``````    13--12--11   ...              2
|         \   \
14   4---3  10  23            1
|   |     \   \   \
15   5   1---2   9  22    <- y=0
\   \          |   |
16   6---7---8  21       -1
\              |
17--18--19--20       -2

^   ^  ^   ^   ^   ^
-2  -1 x=0  1   2   3  ...``````

The sequence is the same as the plain HexSpiral, but this arrangement fits more points on a square grid. The skew pushes the top horizontal to the left, as illustrated by the following portion from the two. The bottom horizontal is similarly skewed but to the right.

``````    HexSpiralSkewed               HexSpiral

13--12--11                   13--12--11
|         \                /          \
14          10            14            10
|             \         /                \
15               9     15                  9``````

# Corners

HexSpiralSkeweed is similar to the SquareSpiral but cuts off the top right and bottom left two corners so that each loop is 6 steps longer than the previous whereas for the SquareSpiral it's 8. See "Corners" in Math::PlanePath::SquareSpiral for other corner cutting.

# FUNCTIONS

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

Create and return a new HexSpiral 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 point in the path as a square of side 1.