.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Math::PlanePath::TriangleSpiral 3pm" .TH Math::PlanePath::TriangleSpiral 3pm "2021-01-23" "perl v5.32.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Math::PlanePath::TriangleSpiral \-\- integer points drawn around an equilateral triangle .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 3 \& use Math::PlanePath::TriangleSpiral; \& my $path = Math::PlanePath::TriangleSpiral\->new; \& my ($x, $y) = $path\->n_to_xy (123); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This path makes a spiral shaped as an equilateral triangle (each side the same length). .PP .Vb 10 \& 16 4 \& / \e \& 17 15 3 \& / \e \& 18 4 14 ... 2 \& / / \e \e \e \& 19 5 3 13 32 1 \& / / \e \e \e \& 20 6 1\-\-\-\-\-2 12 31 <\- Y=0 \& / / \e \e \& 21 7\-\-\-\-\-8\-\-\-\-\-9\-\-\-\-10\-\-\-\-11 30 \-1 \& / \e \& 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 .Ve .PP Cells are spread horizontally to fit on a square grid as per \&\*(L"Triangular Lattice\*(R" in Math::PlanePath. The horizontal gaps are 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 offset from the one above or below. .PP This grid is the same as the \f(CW\*(C`HexSpiral\*(C'\fR and the path is like that spiral except instead of a flat top and \s-1SE,SW\s0 sides it extends to triangular peaks. The result is a longer loop and each successive loop is step=9 longer than the previous (whereas the \f(CW\*(C`HexSpiral\*(C'\fR is step=6 more). .PP 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. .IX Xref "Triangular numbers" .PP The 11\-gonal \*(L"hendecagonal\*(R" 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 \*(L"s\*(R" lines up the (s+2)\-gonal numbers.) .SS "N Start" .IX Subsection "N Start" The default is to number points starting N=1 as shown above. An optional \&\f(CW\*(C`n_start\*(C'\fR can give a different start with the same shape etc. For example to start at 0, .PP .Vb 10 \& n_start => 0 15 \& / \e \& 16 14 \& / \e \& 17 3 13 \& / / \e \e \& 18 4 2 12 ... \& / / \e \e \e \& 19 5 0\-\-\-\-\-1 11 30 \& / / \e \e \& 20 6\-\-\-\-\-7\-\-\-\-\-8\-\-\-\-\-9\-\-\-\-10 29 \& / \e \& 21\-\-\-\-22\-\-\-\-23\-\-\-\-24\-\-\-\-25\-\-\-\-26\-\-\-\-27\-\-\-\-28 .Ve .PP With this adjustment the X axis N=0,1,11,30,etc is the hendecagonal numbers (9k\-7)*k/2. And N=0,8,25,etc diagonally South-East is the hendecagonals of the second kind which is (9k\-7)*k/2 for k negative. .SH "FUNCTIONS" .IX Header "FUNCTIONS" See \*(L"\s-1FUNCTIONS\*(R"\s0 in Math::PlanePath for behaviour common to all path classes. .ie n .IP """$path = Math::PlanePath::TriangleSpiral\->new ()""" 4 .el .IP "\f(CW$path = Math::PlanePath::TriangleSpiral\->new ()\fR" 4 .IX Item "$path = Math::PlanePath::TriangleSpiral->new ()" .PD 0 .ie n .IP """$path = Math::PlanePath::TriangleSpiral\->new (n_start => $n)""" 4 .el .IP "\f(CW$path = Math::PlanePath::TriangleSpiral\->new (n_start => $n)\fR" 4 .IX Item "$path = Math::PlanePath::TriangleSpiral->new (n_start => $n)" .PD Create and return a new triangle spiral object. .ie n .IP """($x,$y) = $path\->n_to_xy ($n)""" 4 .el .IP "\f(CW($x,$y) = $path\->n_to_xy ($n)\fR" 4 .IX Item "($x,$y) = $path->n_to_xy ($n)" Return the X,Y coordinates of point number \f(CW$n\fR on the path. .Sp For \f(CW\*(C`$n < 1\*(C'\fR the return is an empty list, it being considered the path starts at 1. .ie n .IP """$n = $path\->xy_to_n ($x,$y)""" 4 .el .IP "\f(CW$n = $path\->xy_to_n ($x,$y)\fR" 4 .IX Item "$n = $path->xy_to_n ($x,$y)" Return the point number for coordinates \f(CW\*(C`$x,$y\*(C'\fR. \f(CW$x\fR and \f(CW$y\fR are each rounded to the nearest integer, which has the effect of treating each \&\f(CW$n\fR in the path as a square of side 1. .Sp Only every second square in the plane has an N. If \f(CW\*(C`$x,$y\*(C'\fR is a position without an N then the return is \f(CW\*(C`undef\*(C'\fR. .SH "OEIS" .IX Header "OEIS" Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include .Sp .RS 4 (etc) .RE .PP .Vb 2 \& n_start=1 (default) \& A010054 turn 1=left,0=straight, extra initial 1 \& \& A117625 N on X axis \& A081272 N on Y axis \& A006137 N on X negative axis \& A064226 N on X=Y leading diagonal, but without initial value=1 \& A064225 N on X=Y negative South\-West diagonal \& A081267 N on X=\-Y negative South\-East diagonal \& A081589 N on ENE slope dX=3,dY=1 \& A038764 N on WSW slope dX=\-3,dY=\-1 \& A060544 N on ESE slope dX=3,dY=\-1 diagonal \& \& A063177 total sum previous row or diagonal \& \& n_start=0 \& A051682 N on X axis (11\-gonal numbers) \& A062741 N on Y axis \& A062708 N on X=Y leading diagonal \& A081268 N on X=Y+2 diagonal (right of leading diagonal) \& A062728 N on South\-East diagonal (11\-gonal second kind) \& A062725 N on South\-West diagonal \& A081275 N on ENE slope from X=2,Y=0 then dX=+3,dY=+1 \& A081266 N on WSW slope dX=\-3,dY=\-1 \& A081271 N on X=2 vertical \& \& n_start=\-1 \& A023531 turn 1=left,0=straight, being 1 at N=k*(k+3)/2 \& A023532 turn 1=straight,0=left .Ve .PP A023531 is \f(CW\*(C`n_start=\-1\*(C'\fR to match its \*(L"offset=0\*(R" for the first turn, being the second point of the path. A010054 which is 1 at triangular numbers k*(k+1)/2 is the same except for an extra initial 1. .SH "SEE ALSO" .IX Header "SEE ALSO" Math::PlanePath, Math::PlanePath::TriangleSpiralSkewed, Math::PlanePath::HexSpiral .SH "HOME PAGE" .IX Header "HOME PAGE" .SH "LICENSE" .IX Header "LICENSE" Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Kevin Ryde .PP This file is part of Math-PlanePath. .PP Math-PlanePath is free software; you can redistribute it and/or modify it under the terms of the \s-1GNU\s0 General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. .PP Math-PlanePath is distributed in the hope that it will be useful, but \&\s-1WITHOUT ANY WARRANTY\s0; without even the implied warranty of \s-1MERCHANTABILITY\s0 or \s-1FITNESS FOR A PARTICULAR PURPOSE.\s0 See the \s-1GNU\s0 General Public License for more details. .PP You should have received a copy of the \s-1GNU\s0 General Public License along with Math-PlanePath. If not, see .