#!/usr/bin/perl my $level = shift; my $dist = shift || 2 ** ($level + 1); my $filename = shift; if ($filename) { open SVG, '>', $filename; } else { *SVG = *STDOUT; } print SVG qq| Hilbert curve of level $level |; sub HilbertA { my $level = shift; return if ($level == 0); HilbertB($level - 1); lineRel(0, $dist); HilbertA($level - 1); lineRel($dist, 0); HilbertA($level - 1); lineRel(0, -$dist); HilbertC($level - 1); } sub HilbertB { my $level = shift; return if ($level == 0); HilbertA($level - 1); lineRel($dist, 0); HilbertB($level - 1); lineRel(0, $dist); HilbertB($level - 1); lineRel(-$dist, 0); HilbertD($level - 1); } sub HilbertC { my $level = shift; return if ($level == 0); HilbertD($level - 1); lineRel(-$dist, 0); HilbertC($level - 1); lineRel(0, -$dist); HilbertC($level - 1); lineRel($dist, 0); HilbertA($level - 1); } sub HilbertD { my $level = shift; return if ($level == 0); HilbertC($level - 1); lineRel(0, -$dist); HilbertD($level - 1); lineRel(-$dist, 0); HilbertD($level - 1); lineRel(0, $dist); HilbertB($level - 1); } sub goToXY { my ($x, $y) = @_; print SVG "M $x $y "; } sub lineRel { my ($dX, $dY) = @_; if ($dY == 0) { print SVG "h $dX "; } elsif ($dX == 0) { print SVG "v $dY "; } else { print SVG "l $dX $dY "; } }