#!/lusr/bin/perl # Author: V. B. Balayoghan (vbb@cs.utexas.edu) # Given sizes of 2 squares, generate their dissection into a single square $areaUsed= 0.85; $lineWidthFigure= 1.3; $lineWidthCuts= 0.7; die("Usage:\n\t$0 ") if ($#ARGV < 1); $a= shift; $b= shift; die("Sizes cannot be negative") if ($a < 0 || $b < 0); die("At least one size must be non-zero") if (($s= $a+$b) == 0); if ($a < $b) {$a= $b; $b= $s-$a;} $scale= 792*$areaUsed/(3*$a+$b); $dash= 2.0/$scale; $flw= $lineWidthFigure/$scale; $clw= $lineWidthCuts/$scale; $xmargin= (612/$scale-(1.5*$a+$b))/2; $ymargin= (792/$scale-($a>2*$b ? 2.5*$a+$b : 2*$a+2*$b))/3; # ps preamble and some macros print "%!PS-Adobe-2.0\n%%Pages: 1\n%%BoundingBox: 0 0 612 792\n", "/slw {setlinewidth} bind def /n {newpath} bind def /m {moveto} bind def\n", "/l {lineto} bind def /s {stroke} bind def\n", "/sl {[] 0 setdash} bind def /dl {[$dash] 0 setdash} bind def\n\n"; print "%%Page: 1 1\n$scale $scale scale\n"; # 3+2 dissection (bottom of the page) printf "%g %g translate\n", $xmargin, $ymargin; print "$flw slw n $a 0 m $a $a l 0 $a l 0 0 l $s 0 l $s $b l $a $b l s\n"; print "$clw slw n 0 $a m $b 0 l $s $b l s dl n $s $b m $a $s l 0 $a l s\n"; printf "n $a $a m $a $s l s n %g %g m %g %g l s sl\n", $a, 2*$b, $a+$b*($a-$b)/$a, 2*$b; # 4+1 dissection (top of the page) printf "%g %g translate\n", 0, $ymargin+1.5*$a+$b; print "$flw slw n $a 0 m $a $a l 0 $a l 0 0 l $s 0 l $s $b l $a $b l s\n"; printf "%g slw n %g %g m %g %g l s n %g %g m %g %g l s\n", $clw, 0, .5*$a-.5*$b, $a, .5*$s, .5*$a-.5*$b, $a, .5*$s, 0; printf "dl n %g %g m %g %g l %g %g l %g %g l %g %g l s\n", .5*$s, 0, .5*$a+$b, -.5*$a, 1.5*$a+$b, -.5*$a+$b, 1.5*$a, .5*$a+$b, $a, .5*$s; printf "n %g %g m %g %g l s\n", $s, $b, 1.5*$a+.5*$b, $b; printf "n %g %g m %g %g l s\n", $s, 0, $s, -.5*$a+.5*$b; print "showpage clear\n";