/sqrt34 .75 sqrt def /min { 2 copy gt { exch } if pop } bind def /max { 2 copy lt { exch } if pop } bind def /mapxy { % x y dup 2 div 3 -1 roll add % y newx exch sqrt34 mul % newx newy } bind def /M { mapxy moveto } bind def /L { mapxy lineto stroke } bind def /orientdirs 12 array def /orientbest 4 array def /orientbbox 4 array def /orient { % dir0 dir1 dir2 ... dir11 orientdirs astore pop % orientbest 0 0 put setuporient 0 tryorient 1 tryorient 2 tryorient 6 tryorient 7 tryorient 8 tryorient % orientbbox orientdirs orientbest pstack 3 { pop } repeat orientbest 1 get orientbest 2 get translate orientbest 3 get rotate orientbest 0 get dup scale } bind def /setuporient { gsave newpath clippath flattenpath pathbbox grestore 36 sub 4 1 roll 36 sub 4 1 roll 36 add 4 1 roll 36 add 4 1 roll orientbbox astore pop } bind def /orientrots [ 0 60 120 null null null 90 150 210 ] def /tryorient { % dir dup dup dup % dir dir dir dir orientrots exch get 4 1 roll % angle dir dir dir orientdirs exch get 3 1 roll % angle dright dir dir orientdirs exch 3 add get exch % angle dright dleft dir dup 6 ge { 6 sub dup 3 add } { 9 add dup 3 sub } ifelse % angle dright dleft dupinx ddowninx orientdirs exch get exch % angle dright dleft ddown dupinx orientdirs exch get % angle dright dleft ddown dup orientbbox 2 get orientbbox 0 get sub % angle dright dleft ddown dup clip-dx 4 index 4 index add div % angle dright dleft ddown dup x-scale orientbbox 3 get orientbbox 1 get sub % angle dright dleft ddown dup x-scale clip-dy 3 index 3 index add div % angle dright dleft ddown dup x-scale y-scale min % angle dright dleft ddown dup scale dup orientbest 0 get le % angle dright dleft ddown dup scale nogood { % angle dright dleft ddown dup scale pop pop pop pop pop pop } { % angle dright dleft ddown dup scale orientbest 0 3 -1 roll put % angle dright dleft ddown dup orientbest 3 7 -1 roll put % dright dleft ddown dup orientbest 0 get % dright dleft ddown dup scale 4 { dup 3 1 roll mul 5 1 roll } repeat pop % dright*scale dleft*scale ddown*scale dup*scale orientbbox 3 get orientbbox 1 get sub % dright*scale dleft*scale ddown*scale dup*scale clip-dy exch 2 index add sub 2 div add orientbbox 1 get add % dright*scale dleft*scale ytranslate orientbest 2 3 -1 roll put % dright*scale dleft*scale orientbbox 2 get orientbbox 0 get sub % dright*scale dleft*scale clip-dx 3 -1 roll 2 index add sub 2 div add orientbbox 0 get add % xtranslate orientbest 1 3 -1 roll put % } ifelse % } bind def /zerospot { gsave newpath 0 0 mapxy .2 0 360 arc fill grestore } bind def /label { pop % XXX FIX THIS } bind def /startdir { % slanted-x slanted-y gsave % slanted-x slanted-y mapxy % x y 0 0 mapxy % x y x0 y0 exch 4 1 roll sub % x0 x y-y0 exch 3 -1 roll sub % y-y0 x-x0 atan % angle rotate % newpath .7 0 moveto .2 .1 lineto .2 -.1 lineto closepath fill grestore } bind def .02 setlinewidth 1 setlinecap