User:Gustavb/regular polygon.pl
Jump to navigation
Jump to search
Usage
[edit]$ perl regular_polygon.pl [number-of-edges]
Source
[edit]#!/usr/bin/perl
# Command line argument
$n = $ARGV[0];
# Presentation parameters
$dim = 400;
$vdim = 200;
$margin = 4;
$stroke = 2.5;
# Constants
$pi = 3.14159265358979323846264338327950288419717;
@names_special =
('', '', '', 'triangle', 'quadrilateral', 'pentagon', 'hexagon',
'heptagon', 'octagon', 'nonagon', 'decagon', 'hendecagon',
'dodecagon', 'tridecagon', 'tetradecagon', 'pentadecagon',
'hexadecagon', 'heptadecagon', 'octadecagon', 'enneadecagon');
@names_tens =
('', 'deca', 'icosa', 'triaconta', 'tetraconta', 'pentaconta',
'hexaconta', 'heptaconta', 'octaconta', 'enneaconta');
@names_ones =
('', 'hena', 'di', 'tri', 'tetra', 'penta', 'hexa', 'hepta',
'octa', 'ennea');
# Derived meassures
$d = 2*$pi/$n;
$a = ($pi - $d) / 2;
$r = $vdim/2 - $margin;
$o = $r + $margin;
# Determine max/min y-coordinate in order to center polygon
$min_y = $max_y = 0;
for($v=$a; $v<2*$pi+$a; $v+=$d) {
$y = sin($v);
if($y < $min_y) { $min_y = $y; }
if($y > $max_y) { $max_y = $y; }
}
$o_y = $o - ($r/2)*($max_y + $min_y);
# Determine polygon name
if($n < 20) { $name = $names_special[$n]; }
else {
$name = $names_tens[$n/10];
if ($n%10 != 0) { $name .= "kai".$names_ones[$n%10]; }
$name .= "gon";
}
$name = "Regular_$name.svg";
# Write SVG
open(FD, "> $name");
print FD <<ENDL;
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
ENDL
print FD ' <svg width="'.$dim.'px" height="'.$dim.'px" viewBox="0 0 '.$vdim.' '.$vdim.'"'."\n";
print FD ' xmlns="http://www.w3.org/2000/svg" version="1.1">'."\n";
print FD ' <polygon style="fill:none;stroke:#000000;stroke-width:'.$stroke.'px"'."\n";
print FD ' points="';
for($v=$a; $v<2*$pi+$a-$d; $v+=$d) {
$x = $o + $r*cos($v); $y = $o_y + $r*sin($v);
print FD $x . "," . $y . " ";
}
$v+=d; $x = $o + $r*cos($v); $y = $o_y + $r*sin($v);
print FD $x . "," . $y.'" />'."\n";
print FD '</svg>'."\n";
close FD;