NAME
Math::Spiral - Perl extension to return an endless stream of X, Y offset coordinates which represent a spiral shape
SYNOPSIS
#!/usr/bin/perl -w
use Math::Spiral;
my $s = new Math::Spiral();
my($xo,$yo)=$s->Next();
# perl -MMath::Spiral -e '$s=new Math::Spiral(); foreach(0..9) { ($xo,$yo)=$s->Next(); $chart[2+$xo][2+$yo]=$_; } foreach $y (0..4){foreach $x(0..4){if(defined($chart[$x][$y])){print $chart[$x][$y]} else {print " ";} } print "\n"}'
DESCRIPTION
This module outputs an infinite sequence of coordinate offsets, which you can use to plot things in a spiral shape. The numbers return "clockwise"; negate one if you want to go anti-clockwise instead.
It is useful for charting things where you need to concentrate something around the center of the chart.
METHODS
new
Usage is
my $s = new Math::Spiral();
Next
Returns the next x and y offsets (note that these start at 0,0 and will go negative to circle around this origin)
Usage is
my($xo,$yo)=$s->Next();
# Returns a sequence like (0,0) (1,0) (1,1) (0,1) (-1,1) (-1,0) (-1,-1) (0,-1) (1,-1) (2,-1) ... etc (i.e. the x,y coordinates for a spiral)
EXAMPLE
#!/usr/bin/perl -w
use Math::Spiral;
my $s = new Math::Spiral(); # Optional - for non-square output, add an aspect ration here. e.g. new Math::Spiral(1024/768);
foreach(0..9) {
($xo,$yo)=$s->Next(); # Returns a sequence like (0,0) (1,0) (1,1) (0,1) (-1,1) (-1,0) (-1,-1) (0,-1) (1,-1) (2,-1) ... etc
$chart[2+$xo][2+$yo]=$_;
}
foreach $y (0..4) {
foreach $x(0..4) {
if(defined($chart[$x][$y])) {
print $chart[$x][$y]
} else {
print " ";
}
}
print "\n"
}
Prints
6789
501
432
Aspect Ratio feature
perl -MMath::Spiral -e '$mx=30;@c=("a".."z","0".."9","A".."Z");$s=new Math::Spiral(220/1024); foreach(0..162) { $c=$c[$_%62]; ($xo,$yo)=$s->Next($c); warn "\033[31;1m Overwrite \033[0m ",$chart[$mx/2+$xo][$mx/2+$yo],"(",$xo,",",$yo,")" if(defined $chart[$mx/2+$xo][$mx/2+$yo]); $chart[$mx/2+$xo][$mx/2+$yo]=$c; &prt() if 0; } sub prt{foreach $y (0..$mx){foreach $x(0..$mx){if(defined($chart[$x][$y])){print $chart[$x][$y]} else {print " ";} } print "\n"}} &prt();'
Math::Spiral() Spiral(220/1024) Spiral(1024/480)
6789ABC 6789AB mnopqrstuvwxyz0123
5MNOPQRSTUVWX uvwxyz lGqrstuvwxyz0123H4
4LklmnopqrstY ijklmn kFpSABCDEFGHIJT4I5
3KjGHIJKLMNuZ CDEFGH jEoR9uoghijpvKU5J6
2JiFuvwxyzOva BklmnI iDnQ8tnfabkqwLV6K7
1IhEtghij0Pwb AcdefJ hCmP7smedclrxMW7L8
0HgDsfabk1Qxc 9UVWXK gBlO6543210zyNX8M9
zGfCredcl2Ryd 8ABCDL fAkjihgfedcbaZY9NA
yFeBqponm3Sze 79uvEM CedcbaZYXWVUTSRQPOB
xEdA987654T0f 68qrFN
wDcbaZYXWVU1g 57mnGO
vCBA98765432h 46ijHP
utsrqponmlkji 35efIQ
24abJR
13dcKS
02hgLT
z1lkMU
y0poNV
xztsOW
wyxwPX
vTSRQY
ubaZYZ
tjihga
srqpob
hgfedc
tsrqpo
543210
C
perl -MMath::Spiral -e '$s=new Math::Spiral(); foreach(0..25) { ($xo,$yo)=$s->Next(); $chart[3+$xo][3+$yo]=$_; } foreach $y (0..6){foreach $x(0..6){if(defined($chart[$x][$y])){print chr(97+$chart[$x][$y])} else {print " ";} } print "\n"}'
uvwxyz
tghij
sfabk
redcl
qponm
EXPORT
None by default.
AUTHOR
This module was written by Chris Drake cdrake@cpan.org
COPYRIGHT AND LICENSE
Copyright (c) 2019 Chris Drake. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.18.2 or, at your option, any later version of Perl 5 you may have available.