---
name: "Math::PlanePath::TriangleSpiralSkewed"
section: "3pm"
platform: "linux"
package: "libmath-planepath-perl"
version: "129-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Math::PlanePath::TriangleSpiralSkewed"
---

# Math::PlanePath::TriangleSpiralSkewed(3pm)

## NAME

Math::PlanePath::TriangleSpiralSkewed -- integer points drawn around a skewed equilateral triangle

## SYNOPSIS

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

## DESCRIPTION

This path makes an spiral shaped as an equilateral triangle (each side the same length), but skewed to the left to fit on a square grid,

```
    16                              4
     |\
    17 15                           3
     |   \
    18  4 14                        2
     |  |\  \
    19  5  3 13                     1
     |  |   \  \
    20  6  1--2 12 ...         <- Y=0
     |  |         \  \
    21  7--8--9-10-11 30           -1
     |                  \
    22-23-24-25-26-27-28-29        -2
           ^
    -2 -1 X=0 1  2  3  4  5
```

The properties are the same as the spread-out `"TriangleSpiral"`.  The triangle numbers fall on straight lines as they do in the `"TriangleSpiral"` but the skew means the top corner goes up at an angle to the vertical and the left and right downwards are different angles plotted (but are symmetric by N count).

### Skew Right

Option `"skew => 'right'"` directs the skew towards the right, giving

```
      4                  16      skew="right"
                        / |
      3               17 15
                     /    |
      2            18  4 14
                  /  / |  |
      1        ...  5  3 13
                  /    |  |
    Y=0 ->       6  1--2 12
               /          |
     -1       7--8--9-10-11
                    ^
             -2 -1 X=0 1  2
```

This is a shear "X -\> X+Y" of the default skew="left" shown above.  The coordinates are related by

```
    Xright = Xleft + Yleft         Xleft = Xright - Yright
    Yright = Yleft                 Yleft = Yright
```

### Skew Up

```
      2       16-15-14-13-12-11      skew="up"
               |            /
      1       17  4--3--2 10
               |  |   /  /
    Y=0 ->    18  5  1  9
               |  |   /
     -1      ...  6  8
                  |/
     -2           7
                    ^
             -2 -1 X=0 1  2
```

This is a shear "Y -\> X+Y" of the default skew="left" shown above.  The coordinates are related by

```
    Xup = Xleft                 Xleft = Xup
    Yup = Yleft + Xleft         Yleft = Yup - Xup
```

### Skew Down

```
      2          ..-18-17-16       skew="down"
                           |
      1        7--6--5--4 15
                \       |  |
    Y=0 ->        8  1  3 14
                   \  \ |  |
     -1              9  2 13
                      \    |
     -2                10 12
                         \ |
                          11
                     ^
              -2 -1 X=0 1  2
```

This is a rotate by -90 degrees of the skew="up" above.  The coordinates are related

```
    Xdown = Yup          Xup = - Ydown
    Ydown = - Xup        Yup = Xdown
```

Or related to the default skew="left" by

```
    Xdown = Yleft + Xleft        Xleft = - Ydown
    Ydown = - Xleft              Yleft = Xdown + Ydown
```

### 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,

```
    15        n_start => 0
     |\
    16 14
     |   \
    17  3 13 ...
     |  |\  \  \
    18  4  2 12 31
     |  |   \  \  \
    19  5  0--1 11 30
     |  |         \  \
    20  6--7--8--9-10 29
     |                  \
    21-22-23-24-25-26-27-28
```

With this adjustment for example the X axis N=0,1,11,30,etc is (9X-7)\*X/2, the hendecagonal numbers (11-gonals).  And South-East N=0,8,25,etc is the hendecagonals of the second kind, (9Y-7)\*Y/2 with Y negative.

## FUNCTIONS

See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.

- "$path = Math::PlanePath::TriangleSpiralSkewed-\>new ()"

  - "$path = Math::PlanePath::TriangleSpiralSkewed-\>new (skew =\> $str, n\_start =\> $n)"

  Create and return a new skewed triangle spiral object.  The `"skew"` parameter can be

  ```
      "left"    (the default)
      "right"
      "up"
      "down"
  ```

- "$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 centred in a square of side 1, so the entire plane is covered.

## FORMULAS

### Rectangle to N Range

Within each row there's a minimum N and the N values then increase monotonically away from that minimum point.  Likewise in each column.  This means in a rectangle the maximum N is at one of the four corners of the rectangle.

```
              |
    x1,y2 M---|----M x2,y2        maximum N at one of
          |   |    |              the four corners
       -------O---------          of the rectangle
          |   |    |
          |   |    |
    x1,y1 M---|----M x1,y1
              |
```

## OEIS

Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include

\<http://oeis.org/A117625\> (etc)

```
    n_start=1, skew="left" (the defaults)
      A204439     abs(dX)
      A204437     abs(dY)
      A010054     turn 1=left,0=straight, extra initial 1
      A117625     N on X axis
      A064226     N on Y axis, but without initial value=1
      A006137     N on X negative
      A064225     N on Y negative
      A081589     N on X=Y leading diagonal
      A038764     N on X=Y negative South-West diagonal
      A081267     N on X=-Y negative South-East diagonal
      A060544     N on ESE slope dX=+2,dY=-1
      A081272     N on SSE slope dX=+1,dY=-2
      A217010     permutation N values of points in SquareSpiral order
      A217291      inverse
      A214230     sum of 8 surrounding N
      A214231     sum of 4 surrounding N
    n_start=0
      A051682     N on X axis (11-gonal numbers)
      A081268     N on X=1 vertical (next to Y axis)
      A062708     N on Y axis
      A062725     N on Y negative axis
      A081275     N on X=Y+1 North-East diagonal
      A062728     N on South-East diagonal (11-gonal second kind)
      A081266     N on X=Y negative South-West diagonal
      A081270     N on X=1-Y North-West diagonal, starting N=3
      A081271     N on dX=-1,dY=2 NNW slope up from N=1 at X=1,Y=0
    n_start=-1
      A023531     turn 1=left,0=straight, being 1 at N=k*(k+3)/2
      A023532     turn 1=straight,0=left
    n_start=1, skew="right"
      A204435     abs(dX)
      A204437     abs(dY)
      A217011     permutation N values of points in SquareSpiral order
                    but with 90-degree rotation
      A217292     inverse
      A214251     sum of 8 surrounding N
    n_start=1, skew="up"
      A204439     abs(dX)
      A204435     abs(dY)
      A217012     permutation N values of points in SquareSpiral order
                    but with 90-degree rotation
      A217293     inverse
      A214252     sum of 8 surrounding N
    n_start=1, skew="down"
      A204435     abs(dX)
      A204439     abs(dY)
```

The square spiral order in A217011,A217012 and their inverses has first step at 90-degrees to the first step of the triangle spiral, hence the rotation by 90 degrees when relating to the `"SquareSpiral"` path.  A217010 on the other hand has no such rotation since it reckons the square and triangle spirals starting in the same direction.

## SEE ALSO

Math::PlanePath, Math::PlanePath::TriangleSpiral, Math::PlanePath::PyramidSpiral, Math::PlanePath::SquareSpiral

## HOME PAGE

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

## LICENSE

Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Kevin Ryde

This file is part of Math-PlanePath.

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