use strict; use GD; my $width = 500; my $height = 500; my $image = GD::Image->new($width, $height); my $white = $image->colorAllocate(255, 255, 255); my $black = $image->colorAllocate(0, 0, 0); $image->transparent($white); my $ltpt = {x => 0, y => 0}; my $rbpt = {x => $width-1, y => $height-1}; do { ($ltpt, $rbpt) = &innersquare($ltpt, $rbpt); } while ($ltpt != -1); binmode STDOUT; print $image->png; close STDOUT; sub innersquare { my $lt = shift; my $rb = shift; my $rate = 100; my $borderlt = {x => ($lt->{'x'}+$rb->{'x'})/$rate+$lt->{'x'}, y => ($lt->{'y'}+$rb->{'y'})/$rate+$lt->{'y'}}; my $borderrb = {x => $rb->{'x'}-($lt->{'x'}+$rb->{'x'})/$rate, y => $rb->{'y'}-($lt->{'y'}+$rb->{'y'})/$rate}; my $newlt = {x => rand($borderlt->{'x'}-$lt->{'x'})+$lt->{'x'}, y => rand($borderlt->{'y'}-$lt->{'y'})+$lt->{'y'}}; my $newrb = {x => rand($rb->{'x'}-$borderrb->{'x'})+$borderrb->{'x'}, y => rand($rb->{'y'}-$borderrb->{'y'})+$borderrb->{'y'}}; return -1 if $newlt->{'x'} >= $newrb->{'x'} or $newlt->{'y'} >= $newrb->{'y'}; $image->rectangle($newlt->{'x'}, $newlt->{'y'}, $newrb->{'x'}, $newrb->{'y'}, $black); return ($newlt, $newrb); }