#! /usr/local/bin/perl -w use strict; use POSIX; my $pixels; my $inchespercm = 0.39370087; my $dpi = 600; my @npa = ( pel( 0.6 ), pel( 0.5 ) ); my $width = pel( 29.7 ); my $height = pel( 21.0 ); # ------------------------------------------------- my $offset = $shiftright + ($shiftdown * $width); sub pel { my($cm) = @_; return floor( ( $cm * $inchespercm * $dpi ) + 0.5 ); } sub makepixels { print STDERR "Making pixels..\n"; $pixels = '0' x ($width * $height); print STDERR "Done.\n"; } sub setpixel { my($i) = @_; substr($pixels, $i + $offset, 1) = '1'; } sub writepixels { print STDERR "Writing pixels..\n"; print "P1\n"; print "$width $height\n"; my $i = 0; while($i < ($width * $height)) { print substr($pixels, $i, 60) . "\n"; $i+= 60; } } sub hline { my ($sx, $ex, $y) = @_; my $i = ($sx + ($width * $y)); my $j = ($ex + ($width * $y)); while($i < $j) { setpixel($i); $i++; } } sub vline { my ($sy, $ey, $x) = @_; my $i = ($sy * $width) + $x; my $j = ($ey * $width) + $x; while($i < $j) { setpixel($i); $i += $width; } } sub box { my ($tx, $ty, $bx, $by) = @_; hline($tx, $bx, $ty); hline($tx, $bx, $by); vline($ty, $by, $tx); vline($ty, $by, $bx); } sub donpa { my($npa) = @_; my $centre = floor((($width / 2.0) + 0.5)); box($npa, $npa, $centre-$npa, $height-$npa); box($centre+$npa, $npa, $width-$npa, $height-$npa); } sub main { makepixels(); box( 0, 0, $width-$shiftright-1, $height-$shiftdown-1); foreach my $npa(@npa) { donpa($npa); } writepixels(); } &main();