Math::PlanePath::OctagramSpiral -- integer points drawn around an octagram
Contents
Description
This path makes a spiral around an octagram (8-pointed star),
29 25 4
| \ / |
30 28 26 24 ...56-55 3
| \ / | /
33-32-31 7 27 5 23-22-21 54 2
\ |\ / | / /
34 9- 8 6 4- 3 20 53 1
\ \ / / /
35 10 1--2 19 52 <- Y=0
/ / \ \
36 11-12 14 16-17-18 51 -1
/ |/ \ | \
37-38-39 13 43 15 47-48-49-50 -2
| / \ |
40 42 44 46 -3
|/ \ |
41 45 -4
^
-4 -3 -2 -1 X=0 1 2 3 4 5 ...
Each loop is 16 longer than the previous. The 18-gonal numbers 18,51,100,etc fall on the horizontal at
Y=-1.
The inner corners like 23, 31, 39, 47 are similar to the "SquareSpiral" path, but instead of going
directly between them the octagram takes a detour out to make the points of the star. Those excursions
make each loops 8 longer (1 per excursion), hence a step of 16 here as compared to 8 for the
"SquareSpiral".
NStart
The default is to number points starting N=1 as shown above. An optional "n_start" can give a different
start, in the same pattern. For example to start at 0,
n_start => 0
28 24
29 27 25 23 ... 55 54
32 31 30 6 26 4 22 21 20 53
33 8 7 5 3 2 19 52
34 9 0 1 18 51
35 10 11 13 15 16 17 50
36 37 38 12 42 14 46 47 48 49
39 41 43 45
40 44
Formulas
X,YtoN
The symmetry of the octagram can be used by rotating a given X,Y back to the first star excursion such as
N=19 to N=23. If Y is negative then rotate back by 180 degrees, then if X is negative rotate back by 90,
and if Y>=X then by a further 45 degrees. Each such rotation, if needed, is counted as a multiple of the
side-length to be added to the final N. For example at N=19 the side length is 2. Rotating by 180
degrees is 8 side lengths, by 90 degrees 4 sides, and by 45 degrees is 2 sides.
Functions
See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.
"$path = Math::PlanePath::OctagramSpiral->new ()"
Create and return a new octagram 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 centred in a square of side 1, so the entire
plane is covered.
Home Page
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/>.
perl v5.32.0 2021-01-23 Math::PlanePath::OctagramSpiral(3pm)
Name
Math::PlanePath::OctagramSpiral -- integer points drawn around an octagram
Oeis
Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include
<http://oeis.org/A125201> (etc)
n_start=1 (the default)
A125201 N on X axis, from X=1 onwards, 18-gonals + 1
A194268 N on diagonal South-East
n_start=0
A051870 N on X axis, 18-gonal numbers
A139273 N on Y axis
A139275 N on X negative axis
A139277 N on Y negative axis
A139272 N on diagonal X=Y
A139274 N on diagonal North-West
A139276 N on diagonal South-West
A139278 N on diagonal South-East, second 18-gonals
See Also
Math::PlanePath, Math::PlanePath::SquareSpiral, Math::PlanePath::PyramidSpiral
Synopsis
use Math::PlanePath::OctagramSpiral;
my $path = Math::PlanePath::OctagramSpiral->new;
my ($x, $y) = $path->n_to_xy (123);
