Postscript Code to Create the Rotor Puzzle Image

Copyright 2000, Neal R. Wagner

Here is code in the Postscript language to generate the figure shown above. Exactly this code will produce the figure if it is sent to a Postscript printer.


%!PS-Adobe-2.0 %%BoundingBox: 0 0 320 320 %%EndComments /size 320 def /r {size 2 div 0.9 mul} def /depth 0 def /maxdepth 1 def /down {/depth depth 1 add def} def /up {/depth depth 1 sub def} def /eps {.03} def % width of the narrow part of rotor arm /del {.12} def % gap between rotors and puzzle /x1 {3 sqrt 3 div r mul} def /y1 {1 3 div r mul} def /y2 {2 3 div r mul} def /thirdminuseps {1 3 div eps sub r mul} def /thirdpluseps {1 3 div eps add r mul} def /oneminusdel {1 del sub r mul} def /y3 {oneminusdel dup mul thirdminuseps dup mul sub sqrt} def /theta {thirdminuseps y3 atan} def /wheel { % draw rotor -- assumes center at 0 0 newpath rand 2147483647 div 6 mul round 60 mul rotate 0 0 r 0 360 arc 1 setgray gsave fill grestore 0 setgray stroke 0 setgray newpath 0 1 2 { x1 y1 thirdminuseps -60 -150 arcn 0 0 thirdpluseps 30 90 arc 0 y2 thirdminuseps -90 -180 arcn 0 0 oneminusdel 90 theta add 150 theta sub arc 120 rotate } for closepath fill newpath % white dot r 0.785 mul 0 r 0.065 mul 0 360 arc 1 setgray fill 0 setgray } def /logo { gsave 1 3 div eps sub 1 3 div eps sub scale down depth maxdepth le { % add six smaller wheels gsave x1 1 3 div eps sub div y1 1 3 div eps sub div translate wheel logo grestore gsave 0 y2 1 3 div eps sub div translate wheel logo grestore gsave x1 1 3 div eps sub div neg y1 1 3 div eps sub div translate wheel logo grestore gsave x1 1 3 div eps sub div neg y1 1 3 div eps sub div neg translate wheel logo grestore gsave 0 y2 1 3 div eps sub div neg translate wheel logo grestore gsave x1 1 3 div eps sub div y1 1 3 div eps sub div neg translate wheel logo grestore } if up grestore } def 3 setlinewidth 31459 srand size 2 div dup translate wheel logo showpage
Replacing just a few lines gives the more complicated picture:


Old line number 2: %%BoundingBox: 0 0 320 320 New line number 2: %%BoundingBox: 0 0 600 600 Old line number 4: /size 320 def New line number 4: /size 600 def Old line number 7: /maxdepth 1 def New line number 7: /maxdepth 2 def Old next-to-last line: 3 setlinewidth New next-to-last line: 5 setlinewidth