blob: 8b76f5858ad0e328d583dde03c6f3f2de8b79a79 [file] [log] [blame]
%%BeginResource: procset LoutFigPrependGraphic
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% PostScript @SysPrependGraphic file for @Diag Jeffrey H. Kingston %
% Version 2.0 (includes CIRCUM label) September 1996 %
% %
% To assist in avoiding name clashes, the names of all symbols %
% defined here begin with "ldiag". However, this is not feasible %
% with user-defined labels and some labels used by users. %
% %
% <point> is two numbers, a point. %
% <length> is one number, a length %
% <angle> is one number, an angle in degrees %
% <dashlength> is one number, the preferred length of a dash %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
errordict begin
/handleerror
{
{ /Times-Roman findfont 8 pt scalefont setfont
0 setgray 4 pt 4 pt moveto
$error /errorname get
dup ldiagdict exch known
{ ldiagdict exch get }
{ 50 string cvs } ifelse
show
( Command: ) show
$error /command get 50 string cvs show
} stopped {} if
showpage stop
} def
end
% begin diagram: <maxlabels> ldiagbegin -
% must be defined outside ldiagdict since it loads it
/ldiagbegin
{ xsize 0 0 ysize ldiagdict begin
5 -1 roll /ldiagmaxlabels exch def
(@Diag) ldiagpushtagdict
/OOY ldiagpointdef /OOX ldiagpointdef 0 0 /OOO ldiagpointdef
} def
% end diagram: - ldiagend -
/ldiagend
{ ldiagpoptagdict end
} def
% concat strings: <string> <string> ldiagconcat <string>
% must be defined outside ldiagdict since used in ldiagpromotelabels
/ldiagconcat
{ 2 copy length exch length add string
dup 0 4 index putinterval
dup 3 index length 3 index putinterval
3 1 roll pop pop
} def
/ldiagdebugposy 432 def
/ldiagdebugposx 72 def
% <string> <int> ldiagdebugprint -
% must be defined outside ldiagdict since used in arbitrary places
% print count or <int> stack entries, which ever is the smaller
/ldiagdebugprint
{
exch
gsave
initgraphics
ldiagdebugposy 72 lt
{ /ldiagdebugposx ldiagdebugposx 144 add store
/ldiagdebugposy 432 store
}
{
/ldiagdebugposy ldiagdebugposy 12 sub store
} ifelse
ldiagdebugposx ldiagdebugposy moveto
/Times-Roman findfont 10 scalefont setfont
0 setgray show
count 1 sub 2 copy lt { pop } { exch pop } ifelse 1 sub
0 exch 1 exch
{
/ldiagdebugposy ldiagdebugposy 12 sub store
ldiagdebugposx 12 add ldiagdebugposy moveto
index 50 string cvs show
} for
grestore
} def
/ldiagdict 200 dict def
ldiagdict begin
% error messages
/dictfull (dictfull error: too many labels?) def
/dictstackoverflow (dictstackoverflow error: labels nested too deeply?) def
/execstackoverflow (execstackoverflow error: figure nested too deeply?) def
/limitcheck (limitcheck error: figure nested too deeply or too large?) def
/syntaxerror (syntaxerror error: syntax error in text of figure?) def
/typecheck (typecheck error: syntax error in text of figure?) def
/undefined (undefined error: unknown or misspelt label?) def
/VMError (VMError error: run out of memory?) def
% push pi onto stack: - ldiagpi <num>
/ldiagpi 3.14159 def
% push e onto stack: - ldiage <num>
/ldiage 2.71828 def
% arc directions
/clockwise false def
/anticlockwise true def
% test equality between two angles: <angle> <angle> ldiagangleeq <bool>
/ldiagangleeq { ldiagfixangle exch ldiagfixangle eq } def
% test inequality between two angles: <angle> <angle> ldiaganglene <bool>
/ldiaganglene { ldiagangleeq not } def
% maximum of two numbers: <num> <num> ldiagmax <num>
/ldiagmax { 2 copy gt { pop } { exch pop } ifelse } def
% minimum of two numbers: <num> <num> ldiagmin <num>
/ldiagmin { 2 copy lt { pop } { exch pop } ifelse } def
% add two points: <point> <point> ldiagpadd <point>
/ldiagpadd
{
% (Entering padd) 4 ldiagdebugprint
exch 3 1 roll add 3 1 roll add exch
% (Leaving padd) 2 ldiagdebugprint
} def
% subtract first point from second: <point> <point> ldiagpsub <point>
/ldiagpsub { 3 2 roll sub 3 1 roll exch sub exch } def
% max two points: <point> <point> ldiagpmax <point>
/ldiagpmax { exch 3 1 roll ldiagmax 3 1 roll ldiagmax exch } def
% min two points: <point> <point> ldiagpmin <point>
/ldiagpmin { exch 3 1 roll ldiagmin 3 1 roll ldiagmin exch } def
% scalar multiplication: <point> <num> ldiagpmul <point>
/ldiagpmul { dup 3 1 roll mul 3 1 roll mul exch } def
% point at angle and distance: <point> <length> <angle> ldiagatangle <point>
/ldiagatangle { 2 copy cos mul 3 1 roll sin mul ldiagpadd } def
% angle from one point to another: <point> <point> ldiagangleto <angle>
/ldiagangleto { ldiagpsub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def
% distance between two points: <point> <point> ldiagdistance <length>
/ldiagdistance { ldiagpsub dup mul exch dup mul add sqrt } def
% stroke a solid line: <length> <dashlength> ldiagsolid -
/ldiagsolid
{ pop pop [] 0 setdash 1 setlinecap stroke
} def
% stroke a dashed line: <length> <dashlength> ldiagdashed -
/ldiagdashed
{ 2 copy div 2 le 1 index 0 le or
{ exch pop 1 pt ldiagmax [ exch dup ] 0 setdash }
{ dup [ exch 4 2 roll 2 copy div
1 sub 2 div ceiling dup 4 1 roll
1 add mul sub exch div ] 0 setdash
} ifelse 0 setlinecap stroke
} def
% stroke a cdashed line: <length> <dashlength> ldiagcdashed -
/ldiagcdashed
{ % (Entering ldiagcdashed) 2 ldiagdebugprint
2 copy le 1 index 0 le or
{ exch pop 1 pt ldiagmax [ exch dup ] dup 0 get 2 div setdash }
{ dup [ 4 2 roll exch 2 copy exch div
2 div ceiling div 1 index sub
] exch 2 div setdash
} ifelse 0 setlinecap stroke
% (Leaving ldiagcdashed) 0 ldiagdebugprint
} def
% stroke a dotted line: <length> <dashlength> ldiagdotted -
/ldiagdotted
{ 2 copy le 1 index 0 le or
{ exch pop 1 pt ldiagmax [ exch 0 exch ] 0 setdash }
{ 1 index exch div ceiling div
[ 0 3 2 roll ] 0 setdash
} ifelse 1 setlinecap stroke
} def
% stroke a noline line: <length> <dashlength> ldiagnoline -
/ldiagnoline
{ pop pop
} def
% painting (i.e. filling): - ldiagwhite - (etc.)
/ldiagnopaint { } def
/ldiagnochange { fill } def
/ldiagdarkblue { 0.0 0.0 0.5 setrgbcolor fill } def
/ldiagblue { 0.0 0.0 1.0 setrgbcolor fill } def
/ldiaglightblue { 0.5 0.5 1.0 setrgbcolor fill } def
/ldiagdarkgreen { 0.0 0.5 0.0 setrgbcolor fill } def
/ldiaggreen { 0.0 1.0 0.0 setrgbcolor fill } def
/ldiaglightgreen { 0.5 1.0 0.5 setrgbcolor fill } def
/ldiagdarkred { 0.5 0.0 0.0 setrgbcolor fill } def
/ldiagred { 1.0 0.0 0.0 setrgbcolor fill } def
/ldiaglightred { 1.0 0.5 0.5 setrgbcolor fill } def
/ldiagdarkcyan { 0.0 0.5 0.5 setrgbcolor fill } def
/ldiagcyan { 0.0 1.0 1.0 setrgbcolor fill } def
/ldiaglightcyan { 0.5 1.0 1.0 setrgbcolor fill } def
/ldiagdarkmagenta { 0.5 0.0 0.5 setrgbcolor fill } def
/ldiagmagenta { 1.0 0.0 1.0 setrgbcolor fill } def
/ldiaglightmagenta { 1.0 0.5 1.0 setrgbcolor fill } def
/ldiagdarkyellow { 0.5 0.5 0.0 setrgbcolor fill } def
/ldiagyellow { 1.0 1.0 0.0 setrgbcolor fill } def
/ldiaglightyellow { 1.0 1.0 0.5 setrgbcolor fill } def
/ldiagdarkgray { 0.2 0.2 0.2 setrgbcolor fill } def
/ldiaggray { 0.5 0.5 0.5 setrgbcolor fill } def
/ldiaglightgray { 0.8 0.8 0.8 setrgbcolor fill } def
/ldiagdarkgrey { 0.2 0.2 0.2 setrgbcolor fill } def
/ldiaggrey { 0.5 0.5 0.5 setrgbcolor fill } def
/ldiaglightgrey { 0.8 0.8 0.8 setrgbcolor fill } def
/ldiagblack { 0.0 0.0 0.0 setrgbcolor fill } def
/ldiagwhite { 1.0 1.0 1.0 setrgbcolor fill } def
% shape and labels of the @Box symbol
/ldiagbox
{
0 0 /SW ldiagpointdef
xsize 0 /SE ldiagpointdef
xsize ysize /NE ldiagpointdef
0 ysize /NW ldiagpointdef
SE 0.5 ldiagpmul /S ldiagpointdef
NW 0.5 ldiagpmul /W ldiagpointdef
W SE ldiagpadd /E ldiagpointdef
S NW ldiagpadd /N ldiagpointdef
NE 0.5 ldiagpmul /CTR ldiagpointdef
0 dg /S@ANGLE ldiagangledef
45 dg /SE@ANGLE ldiagangledef
90 dg /E@ANGLE ldiagangledef
135 dg /NE@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
225 dg /NW@ANGLE ldiagangledef
270 dg /W@ANGLE ldiagangledef
315 dg /SW@ANGLE ldiagangledef
[ CTR NE ldiagpsub /ldiagboxcircum cvx ] ldiagcircumdef
SW SE NE NW SW
} def
% shape and labels of the @CurveBox symbol
% <margin> ldiagcurvebox <shape>
/ldiagcurvebox
{
% (Entering ldiagcurvebox) 1 ldiagdebugprint
ldiagdecodelength /cbmgn exch def
xsize 0.5 mul ysize 0.5 mul /CTR ldiagpointdef
xsize 0.5 mul 0 /S ldiagpointdef
xsize ysize 0.5 mul /E ldiagpointdef
xsize 0.5 mul ysize /N ldiagpointdef
0 ysize 0.5 mul /W ldiagpointdef
cbmgn 0.293 mul cbmgn 0.293 mul /SW ldiagpointdef
xsize cbmgn 0.293 mul sub cbmgn 0.293 mul /SE ldiagpointdef
xsize cbmgn 0.293 mul sub ysize cbmgn 0.293 mul sub /NE ldiagpointdef
cbmgn 0.293 mul ysize cbmgn 0.293 mul sub /NW ldiagpointdef
0 dg /S@ANGLE ldiagangledef
45 dg /SE@ANGLE ldiagangledef
90 dg /E@ANGLE ldiagangledef
135 dg /NE@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
225 dg /NW@ANGLE ldiagangledef
270 dg /W@ANGLE ldiagangledef
315 dg /SW@ANGLE ldiagangledef
[ xsize ysize 0.5 ldiagpmul cbmgn /ldiagcurveboxcircum cvx ] ldiagcircumdef
cbmgn 0
xsize cbmgn sub 0
[ xsize cbmgn sub cbmgn ]
xsize cbmgn
xsize ysize cbmgn sub
[ xsize cbmgn sub ysize cbmgn sub ]
xsize cbmgn sub ysize
cbmgn ysize
[ cbmgn ysize cbmgn sub ]
0 ysize cbmgn sub
0 cbmgn
[ cbmgn cbmgn ]
cbmgn 0
% (Leaving ldiagcurvebox) 0 ldiagdebugprint
} def
% shadow of the @ShadowBox symbol
% its shape and labels are done, somewhat inaccurately, with ldiagbox
% <shadowmargin> ldiagshadow -
/ldiagshadow
{
/lfshm exch def
lfshm 0 moveto
0 lfshm neg rlineto
xsize 0 rlineto
0 ysize rlineto
lfshm neg 0 rlineto
xsize 0 lineto
closepath fill
} def
% shape and labels of the @Square symbol
/ldiagsquare
{
xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef
CTR xsize xsize ysize ysize ldiagpmax 0.5 ldiagpmul ldiagpadd /NE ldiagpointdef
CTR 0 0 CTR NE ldiagdistance 135 ldiagatangle ldiagpadd /NW ldiagpointdef
CTR 0 0 CTR NE ldiagdistance 225 ldiagatangle ldiagpadd /SW ldiagpointdef
CTR 0 0 CTR NE ldiagdistance 315 ldiagatangle ldiagpadd /SE ldiagpointdef
SW 0.5 ldiagpmul SE 0.5 ldiagpmul ldiagpadd /S ldiagpointdef
NW 0.5 ldiagpmul NE 0.5 ldiagpmul ldiagpadd /N ldiagpointdef
SW 0.5 ldiagpmul NW 0.5 ldiagpmul ldiagpadd /W ldiagpointdef
SE 0.5 ldiagpmul NE 0.5 ldiagpmul ldiagpadd /E ldiagpointdef
0 dg /S@ANGLE ldiagangledef
45 dg /SE@ANGLE ldiagangledef
90 dg /E@ANGLE ldiagangledef
135 dg /NE@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
225 dg /NW@ANGLE ldiagangledef
270 dg /W@ANGLE ldiagangledef
315 dg /SW@ANGLE ldiagangledef
[ CTR NE ldiagpsub /ldiagboxcircum cvx ] ldiagcircumdef
SW SE NE NW SW
} def
% shape and labels of the @Diamond symbol
/ldiagdiamond
{
xsize 0 0.5 ldiagpmul /S ldiagpointdef
0 ysize 0.5 ldiagpmul /W ldiagpointdef
S W ldiagpadd /CTR ldiagpointdef
CTR W ldiagpadd /N ldiagpointdef
CTR S ldiagpadd /E ldiagpointdef
E N ldiagpadd 0.5 ldiagpmul /NE ldiagpointdef
N W ldiagpadd 0.5 ldiagpmul /NW ldiagpointdef
S W ldiagpadd 0.5 ldiagpmul /SW ldiagpointdef
S E ldiagpadd 0.5 ldiagpmul /SE ldiagpointdef
0 dg /S@ANGLE ldiagangledef
90 dg /E@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
270 dg /W@ANGLE ldiagangledef
S E ldiagangleto /SE@ANGLE ldiagangledef
E N ldiagangleto /NE@ANGLE ldiagangledef
N W ldiagangleto /NW@ANGLE ldiagangledef
W S ldiagangleto /SW@ANGLE ldiagangledef
[ xsize ysize 0.5 ldiagpmul /ldiagdiamondcircum cvx ] ldiagcircumdef
S E N W S
} def
% shape and labels of the @Ellipse symbol
/ldiagellipse
{
xsize 0 0.5 ldiagpmul /S ldiagpointdef
0 ysize 0.5 ldiagpmul /W ldiagpointdef
S W ldiagpadd /CTR ldiagpointdef
CTR W ldiagpadd /N ldiagpointdef
CTR S ldiagpadd /E ldiagpointdef
CTR xsize 0 0.3536 ldiagpmul ldiagpadd 0 ysize 0.3536 ldiagpmul ldiagpadd /NE ldiagpointdef
0 ysize 0.3536 ldiagpmul CTR xsize 0 0.3536 ldiagpmul ldiagpadd ldiagpsub /SE ldiagpointdef
xsize 0 0.3536 ldiagpmul CTR ldiagpsub 0 ysize 0.3536 ldiagpmul ldiagpadd /NW ldiagpointdef
0 ysize 0.3536 ldiagpmul xsize 0 0.3536 ldiagpmul CTR ldiagpsub ldiagpsub /SW ldiagpointdef
[ xsize ysize 0.5 ldiagpmul /ldiagellipsecircum cvx ] ldiagcircumdef
0 dg /S@ANGLE ldiagangledef
90 dg /E@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
270 dg /W@ANGLE ldiagangledef
S E ldiagangleto /SE@ANGLE ldiagangledef
E N ldiagangleto /NE@ANGLE ldiagangledef
N W ldiagangleto /NW@ANGLE ldiagangledef
W S ldiagangleto /SW@ANGLE ldiagangledef
S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S
} def
% shape and labels of the @Circle symbol
/ldiagcircle
{
xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef
CTR xsize 0 ysize 0 ldiagpmax 0.5 ldiagpmul ldiagpadd /E ldiagpointdef
CTR 0 0 CTR E ldiagdistance 45 ldiagatangle ldiagpadd /NE ldiagpointdef
CTR 0 0 CTR E ldiagdistance 90 ldiagatangle ldiagpadd /N ldiagpointdef
CTR 0 0 CTR E ldiagdistance 135 ldiagatangle ldiagpadd /NW ldiagpointdef
CTR 0 0 CTR E ldiagdistance 180 ldiagatangle ldiagpadd /W ldiagpointdef
CTR 0 0 CTR E ldiagdistance 225 ldiagatangle ldiagpadd /SW ldiagpointdef
CTR 0 0 CTR E ldiagdistance 270 ldiagatangle ldiagpadd /S ldiagpointdef
CTR 0 0 CTR E ldiagdistance 315 ldiagatangle ldiagpadd /SE ldiagpointdef
[ S E ldiagpsub /ldiagellipsecircum cvx ] ldiagcircumdef
0 dg /S@ANGLE ldiagangledef
45 dg /SE@ANGLE ldiagangledef
90 dg /E@ANGLE ldiagangledef
135 dg /NE@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
225 dg /NW@ANGLE ldiagangledef
270 dg /W@ANGLE ldiagangledef
315 dg /SW@ANGLE ldiagangledef
S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S
} def
% shape and labels of the @VLine and @VArrow symbols
/ldiagvline
{
xmark ysize ldiagprevious /FROM ldiagpointdef
xmark 0 ldiagprevious /TO ldiagpointdef
} def
% points of a polygon around base with given no of sides, vert init angle:
% <sides> <angle> ldiagpolygon <point> ... <point>
/ldiagpolygon
{ exch round cvi exch
xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef
90 sub CTR 2 copy ldiagmax 5 3 roll
[ 4 copy pop /ldiagpolycircum cvx ] ldiagcircumdef
exch dup 360 exch div exch
1 1 3 2 roll
{ 4 string cvs (P) exch ldiagconcat
3 copy exch pop (@ANGLE) ldiagconcat cvn exch 90 add exch ldiagangledef
cvn 6 copy pop pop ldiagatangle 2 copy 10 2 roll
3 2 roll ldiagpointdef
dup 3 1 roll add exch
} for
pop ldiagatangle
} def
% shape and labels of the @Isosceles triangle symbol
/ldiagisosceles
{
xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef
0 0 /SW ldiagpointdef
xsize 0 /SE ldiagpointdef
xsize 0.5 mul ysize /N ldiagpointdef
xsize 0.5 mul 0 /S ldiagpointdef
SE 0.5 ldiagpmul N 0.5 ldiagpmul ldiagpadd /NE ldiagpointdef
SW 0.5 ldiagpmul N 0.5 ldiagpmul ldiagpadd /NW ldiagpointdef
[ xsize ysize /ldiagisoscelescircum cvx ] ldiagcircumdef
0 dg /SW@ANGLE ldiagangledef
0 dg /SE@ANGLE ldiagangledef
180 dg /N@ANGLE ldiagangledef
0 dg /S@ANGLE ldiagangledef
SE N ldiagangleto /NE@ANGLE ldiagangledef
N SW ldiagangleto /NW@ANGLE ldiagangledef
SW SE N SW
} def
% next array element: <array> <index> ldiaggetnext <array> <index> <any> true
% or <array> <index> false
/ldiaggetnext
{ 2 copy exch length ge
{ false }
{ 2 copy get exch 1 add exch true } ifelse
} def
% check whether thing is number: <any> ldiagisnumbertype <any> <bool>
/ldiagisnumbertype
{ dup type dup
/integertype eq exch /realtype eq or
} def
% check whether thing is an array: <any> ldiagisarraytype <any> <bool>
/ldiagisarraytype { dup type /arraytype eq } def
% check whether thing is an array: <any> ldiagisnametype <any> <bool>
/ldiagisnametype { dup type /nametype eq } def
% get next item: <array> <index> ldiaggetnextitem <array> <index> 0
% or <array> <index> <array> 1
% or <array> <index> <point> 2
/ldiaggetnextitem
{ ldiaggetnext
{ ldiagisarraytype
{ 1
}
{ ldiagisnumbertype
{ 3 1 roll
ldiaggetnext
{ ldiagisnumbertype
{ 4 3 roll exch 2
}
{ pop 3 2 roll pop 0
} ifelse
}
{ 3 2 roll pop 0
} ifelse
}
{ pop 0
} ifelse
} ifelse
}
{ 0
} ifelse
} def
% approximate equality: num1 num2 approxeq <boolean>
/approxeq
{ dup 0 eq
{ pop 0 eq
}
{ dup 3 1 roll sub exch div abs 0.001 lt
} ifelse
} def
% set arc path: bool x1 y1 x2 y2 x0 y0 ldiagsetarc <angle> <angle> <dist>
% the path goes from x1 y1 to x2 y2 about centre x0 y0,
% anticlockwise if bool is true else clockwise.
% The orientations of backwards pointing and forwards pointing
% arrowheads are returned in the two angles, and
% the length of the arc is returned in <dist>.
/ldiagsetarc
{
% (Entering ldiagsetarc) 7 ldiagdebugprint
20 dict begin
matrix currentmatrix 8 1 roll
2 copy translate 2 copy 8 2 roll
4 2 roll ldiagpsub 6 2 roll ldiagpsub
dup /y1 exch def dup mul /y1s exch def
dup /x1 exch def dup mul /x1s exch def
dup /y2 exch def dup mul /y2s exch def
dup /x2 exch def dup mul /x2s exch def
/dist1 0 0 x1 y1 ldiagdistance def
/dist2 0 0 x2 y2 ldiagdistance def
y1s y2s approxeq
{ -1
}
{ y1s x2s mul y2s x1s mul sub y1s y2s sub div
} ifelse
/da exch def
x1s x2s approxeq
{ -1
}
{ x1s y2s mul x2s y1s mul sub x1s x2s sub div
} ifelse
/db exch def
da 0 gt db 0 gt and
{
% ( case 1, ellipse) 0 ldiagdebugprint
/LMax da sqrt db sqrt ldiagmax def
/scalex da sqrt LMax div def
/scaley db sqrt LMax div def
scalex scaley scale
0 0 LMax
0 0 x1 scalex mul y1 scaley mul ldiagangleto
0 0 x2 scalex mul y2 scaley mul ldiagangleto
2 copy eq { 360 add } if
2 copy 8 2 roll
5 index { arc } { arcn } ifelse
2 index 1 index
{ 90 sub } { 90 add } ifelse
dup sin scaley mul exch cos scalex mul atan
2 index 2 index
{ 90 add } { 90 sub } ifelse
dup sin scaley mul exch cos scalex mul atan
5 2 roll % res1 res2 ang1 ang2 anticlockwise
{ exch sub } { sub } ifelse
dup 0 le { 360 add } if ldiagpi mul LMax mul 180 div
}
{
dist1 dist2 approxeq
% x1 y1 dist1 ( x1 y1, d) 3 ldiagdebugprint pop pop pop
% x2 y2 dist2 ( x2 y2, d) 3 ldiagdebugprint pop pop pop
{
% ( case 2, circle) 0 ldiagdebugprint
0 0
dist1
0 0 x1 y1 ldiagangleto
0 0 x2 y2 ldiagangleto
2 copy eq { 360 add } if
2 copy 8 2 roll
5 index { arc } { arcn } ifelse
2 index 1 index
{ 90 sub } { 90 add } ifelse
2 index 2 index
{ 90 add } { 90 sub } ifelse
5 2 roll % res1 res2 ang1 ang2 clockwise
{ exch sub } { sub } ifelse
dup 0 le { 360 add } if
ldiagpi mul dist1 mul 180 div
}
{
% ( case 3, line) 0 ldiagdebugprint
x2 y2 lineto pop
x2 y2 x1 y1 ldiagangleto
x1 y1 x2 y2 ldiagangleto
x1 y1 x2 y2 ldiagdistance
} ifelse
} ifelse
4 -1 roll setmatrix
end
% (Leaving ldiagsetarc) 3 ldiagdebugprint
} def
% ldiagsetcurve: set up a Bezier curve from x0 y0 to x3 y3
% and return arrowhead angles and length of curve (actually 0)
% x0 y0 x1 y1 x2 y2 x3 y3 ldiagsetcurve <angle> <angle> <length>
/ldiagsetcurve
{ 8 copy curveto pop pop
ldiagangleto
5 1 roll
4 2 roll ldiagangleto
exch
0
} def
% ldiagsetpath: convert a Diag path into a PostScript path
% [ shape ] ldiagsetpath
/ldiagsetpath
{
10 dict begin
0 newpath
/prevseen false def
/curveseen false def
{ ldiaggetnextitem
dup 0 eq { pop exit }
{ 1 eq
{ /curveseen true def
/curve exch def
curve length 0 eq { /curveseen false def } if
}
{ /ycurr exch def
/xcurr exch def
prevseen
{ curveseen
{ curve length 4 eq
{ xprev yprev
curve 0 get curve 1 get
curve 2 get curve 3 get
xcurr ycurr
ldiagsetcurve pop pop pop
}
{ xprev yprev xcurr ycurr
curve length 1 ge { curve 0 get } { 0 } ifelse
curve length 2 ge { curve 1 get } { 0 } ifelse
curve length 3 ge { curve 2 get } { true } ifelse
7 1 roll
ldiagsetarc pop pop pop
} ifelse
}
{ xcurr ycurr lineto
} ifelse
}
{ xcurr ycurr moveto
} ifelse
/xprev xcurr def
/yprev ycurr def
/prevseen true def
/curveseen false def
} ifelse
} ifelse
} loop pop pop
end
} def
% ldiagpaintpath: paint a path of the given shape
% /paint [ shape ] ldiagpaintpath -
/ldiagpaintpath
{
ldiagsetpath cvx exec
} def
% stroke a path of the given shape in the given linestyle and dash length.
% Return the origin and angle of the backward and forward arrow heads.
% dashlength /linestyle [shape] ldiagdopath [<point> <angle>] [<point> <angle>]
/ldiagdopath
{
10 dict begin
0
/prevseen false def
/curveseen false def
/backarrow [] def
/fwdarrow [] def
{
ldiaggetnextitem
dup 0 eq { pop exit }
{
1 eq
{ /curveseen true def
/curve exch def
curve length 0 eq { /prevseen false def } if
}
{ /ycurr exch def
/xcurr exch def
prevseen
{ newpath xprev yprev moveto
curveseen
{ curve length 4 eq
{ xprev yprev
curve 0 get curve 1 get
curve 2 get curve 3 get
xcurr ycurr ldiagsetcurve
}
{ xprev yprev xcurr ycurr
curve length 1 ge { curve 0 get } { 0 } ifelse
curve length 2 ge { curve 1 get } { 0 } ifelse
curve length 3 ge { curve 2 get } { true } ifelse
7 1 roll
ldiagsetarc
} ifelse
}
{ xcurr ycurr lineto
xcurr ycurr xprev yprev ldiagangleto dup 180 sub
xprev yprev xcurr ycurr ldiagdistance
} ifelse
6 index 6 index cvx exec
[ xprev yprev 5 -1 roll ]
backarrow length 0 eq
{ /backarrow exch def }
{ pop } ifelse
[ xcurr ycurr 4 -1 roll ] /fwdarrow exch def
} if
/xprev xcurr def
/yprev ycurr def
/prevseen true def
/curveseen false def
} ifelse
} ifelse
} loop
pop pop pop pop
backarrow length 0 eq { [ 0 0 0 ] } { backarrow } ifelse
fwdarrow length 0 eq { [ 0 0 0 ] } { fwdarrow } ifelse
end
} def
% stroke a path of the given shape in the given linestyle and dash length.
% dashlength [ /linestyle ] [shape] ldiagdosegpath -
/ldiagdosegpath
{
12 dict begin
1 index /seg exch def
1 index length /seglength exch def
0 /segcount exch def
0
/prevseen false def
/curveseen false def
/backarrow [] def
/fwdarrow [] def
{
ldiaggetnextitem
dup 0 eq { pop exit }
{
1 eq
{ /curveseen true def
/curve exch def
curve length 0 eq { /prevseen false def } if
}
{ /ycurr exch def
/xcurr exch def
prevseen
{ newpath xprev yprev moveto
curveseen
{ curve length 4 eq
{ xprev yprev
curve 0 get curve 1 get
curve 2 get curve 3 get
xcurr ycurr ldiagsetcurve
}
{ xprev yprev xcurr ycurr
curve length 1 ge { curve 0 get } { 0 } ifelse
curve length 2 ge { curve 1 get } { 0 } ifelse
curve length 3 ge { curve 2 get } { true } ifelse
7 1 roll
ldiagsetarc
} ifelse
}
{ xcurr ycurr lineto
xcurr ycurr xprev yprev ldiagangleto dup 180 sub
xprev yprev xcurr ycurr ldiagdistance
} ifelse
6 index seg segcount seglength mod get cvx exec
/segcount segcount 1 add def
[ xprev yprev 5 -1 roll ]
backarrow length 0 eq
{ /backarrow exch def }
{ pop } ifelse
[ xcurr ycurr 4 -1 roll ] /fwdarrow exch def
} if
/xprev xcurr def
/yprev ycurr def
/prevseen true def
/curveseen false def
} ifelse
} ifelse
} loop
pop pop pop pop
end
} def
% ldiagnodebegin: start of node parameters
% ldiagnodebegin -
/ldiagnodebegin
{ % (Entering ldiagnodebegin) 0 ldiagdebugprint
ldiagmaxlabels dict begin
} def
% ldiagnodeend: end of node parameters (so do the node)
% <outline> <dashlength> <style> <linewidth> <paint> ldiagnodeend -
/ldiagnodeend
{
% (Entering ldiagnodeend) 0 ldiagdebugprint
end % matches begin in ldiagnodebegin
4 index gsave ldiagpaintpath grestore
3 index ldiagsetpath clip newpath
2 mul setlinewidth
3 -1 roll ldiagdosegpath
% (Leaving ldiagnodeend) 0 ldiagdebugprint
} def
% ldiaglinkbegin: start of link parameters
% <direct> ldiaglinkbegin -
/ldiaglinkbegin
{ ldiagmaxlabels dict begin
1 eq /direct exch def
} def
% ldiaglinkend: end of link parameters (so do the link)
% <outline> <dashlength> <style> <linewidth> ldiaglinkend -
/ldiaglinkend
{
end % matches begin in ldiaglinkbegin
setlinewidth
3 -1 roll ldiagdosegpath
} def
% ldiagdoarrow: draw an arrow head of given form
% dashlength /lstyle /pstyle hfrac height width [ <point> <angle> ] ldiagdoarrow -
/ldiagdoarrow
{ matrix currentmatrix 8 1 roll
dup 0 get 1 index 1 get translate
2 get rotate
[ 2 index neg 2 index 0 0
3 index 3 index neg
1 index 10 index mul 0
7 index 7 index ]
4 1 roll pop pop pop
dup 3 1 roll
gsave ldiagpaintpath grestore ldiagdopath pop pop
setmatrix
} def
% arrow head styles
/ldiagopen 0.0 def
/ldiaghalfopen 0.5 def
/ldiagclosed 1.0 def
% stroke no arrows, forward, back, and both
/ldiagnoarrow { pop pop pop pop pop pop pop pop } def
/ldiagforward { 7 -1 roll ldiagdoarrow pop } def
/ldiagback { 8 -2 roll pop ldiagdoarrow } def
/ldiagboth { 8 -1 roll 7 copy ldiagdoarrow pop 7 -1 roll ldiagdoarrow } def
% ldiagprevious: return previous point on path
/ldiagprevious
{ ldiagisnumbertype
{ 2 copy }
{ ldiagisarraytype
{ 2 index 2 index }
{ 0 0 }
ifelse
} ifelse
} def
% Tag dictionary operators
%
% Diag's tag dictionaries are kept on the same stack as other dictionaries,
% since there is nowhere else to put them. However, they are managed like
% a separate stack using the following operators:
%
% <tag> ldiagpushtagdict - Push a new, empty tag dictionary
% ldiagtoptagdict dict Find the top tag dictionary
% ldiagpoptagdict - Pop and destroy the top tag dictionary
% ldiagpopuptagdict - Pop top tag dict and promote its entries
% ldiagdebugtagdict - Debug print of dictionary stack
%
% They are distinguished from other dictionaries by containing /ldiagtagdict,
% whose value is the <tag> which is used by ldiagpopuptagdict,
% and they are hopefully never the target of any non-tag definition because
% they are never the top dictionary, since push places the new dict second.
/ldiagpushtagdict
{ ldiagmaxlabels dict dup
currentdict end exch begin begin
exch /ldiagtagdict exch put
} def
/ldiagtoptagdict
{ /ldiagtagdict where not
{ (Diag internal error: no tag dictionary) show stop
} if
} def
/ldiagpoptagdict
{
% (Entering poptagdict) 0 ldiagdebugprint
% ldiagdebugtagdict
mark
{ currentdict end
dup /ldiagtagdict known
{ exit
} if
} loop
pop
counttomark
{ begin
} repeat
pop
% (Leaving poptagdict) 0 ldiagdebugprint
% ldiagdebugtagdict
} def
% promote labels from top tag dictionary to second top tag dictionary
% each prefixed by <string>@ if <string> (value of /ldiagtagdict) is not empty
% - ldiagpopuptagdict -
/ldiagpopuptagdict
{
ldiagtagdict
% (Entering ldiagpopuptagdict) 1 ldiagdebugprint
% ldiagdebugtagdict
ldiagtoptagdict ldiagpoptagdict ldiagtoptagdict exch
{ exch 50 string cvs 3 index
dup length 0 ne
{ (@) ldiagconcat
} if
exch ldiagconcat cvn exch 2 index 3 1 roll put
} forall
pop pop
% (Leaving ldiagpopuptagdict) 0 ldiagdebugprint
% ldiagdebugtagdict
} def
% debug tag dictionary stack
/ldiagdebugtagdict
{ (Entering ldiagdebugtagdict) 0 ldiagdebugprint
30 array dictstack
{ dup /ldiagtagdict known
{ dup /ldiagtagdict get 0 ldiagdebugprint
{ pop 50 string cvs ( ) exch ldiagconcat
dup 0 ldiagdebugprint
pop
}
forall
}
{ pop (other) 0 ldiagdebugprint
} ifelse
} forall
(Leaving ldiagdebugtagdict) 0 ldiagdebugprint
} def
% label a point in top tag dictionary: <point> /name ldiagpointdef -
/ldiagpointdef
{
% (Entering ldiagpointdef) 3 ldiagdebugprint
[ 4 2 roll transform /itransform cvx ] cvx
ldiagtoptagdict 3 1 roll put
% (Leaving ldiagpointdef) 0 ldiagdebugprint
} def
% label an angle in top tag dictionary: <angle> /name ldiagangledef -
/ldiagangledef
{
% (Entering ldiagangledef) 2 ldiagdebugprint
exch ldiagfixangle ldiagtoptagdict 3 1 roll put
% (Leaving ldiagangledef) 0 ldiagdebugprint
} def
% add CIRCUM operator with this body: <array> ldiagcircumdef -
/ldiagcircumdef
{ % (Entering ldiagcircumdef) 1 ldiagdebugprint
/CIRCUM exch cvx
ldiagtoptagdict 3 1 roll put
% currentdict end
% 3 1 roll
% def
% begin
% (Leaving ldiagcircumdef) 0 ldiagdebugprint
} def
% show points (except CIRCUM and ANGLE): - ldiagshowpoints -
/ldiagshowpoints
{
% (Entering ldiagshowpoints) 0 ldiagdebugprint
ldiagtoptagdict
{ 1 index 50 string cvs
(ldiagdebugpos) search
{ pop pop pop pop pop }
{
(CIRCUM) search % if CIRCUM in key
{ pop pop pop pop pop }
{
(ANGLE) search % if ANGLE in key
{
pop pop pop pop pop
}
{
(ldiagtagdict) search
{
pop pop pop pop pop
}
{
pop cvx exec
newpath 2.0 pt 0 360 arc 0 setgray fill pop
} ifelse
} ifelse
} ifelse
} ifelse
} forall
% (Leaving ldiagshowpoints) 0 ldiagdebugprint
} def
/ldiagshowtags
{
% (Entering ldiagshowtags) 0 ldiagdebugprint
ldiagtoptagdict
{ 1 index 50 string cvs
% dup 0 ldiagdebugprint
(ldiagdebugpos) search
{ pop pop pop pop pop }
{
(CIRCUM) search % if CIRCUM in key
{ pop pop pop pop pop }
{
(ANGLE) search % if ANGLE in key
{
pop pop pop pop pop
}
{
(ldiagtagdict) search
{
pop pop pop pop pop
}
{
pop cvx exec 2 copy
gsave
newpath 2.0 pt 0 360 arc 0 setgray fill
/Times-Roman findfont 8 pt scalefont setfont
translate 40 rotate 0.2 cm 0.1 cm moveto 20 string cvs show
grestore
} ifelse
} ifelse
} ifelse
} ifelse
} forall
% (Leaving ldiagshowtags) 0 ldiagdebugprint
} def
% show angles: - ldiagshowangles -
/ldiagshowangles
{
% (Entering ldiagshowangles) 0 ldiagdebugprint
ldiagtoptagdict
{ 1 index 20 string cvs
% dup 0 ldiagdebugprint
(ldiagdebugpos) search
{ pop pop pop pop pop }
{
(ldiagtagdict) search
{
pop pop pop pop pop
}
{
(CIRCUM) search % if CIRCUM in key
{ pop pop pop pop pop }
{
(@ANGLE) search % if ANGLE in key, draw the angle at the point
{
% (showing ANGLE) 5 ldiagdebugprint
gsave exch pop exch pop cvx
% (about to execute) 1 ldiagdebugprint
exec translate rotate 0.8 0.8 scale pop
newpath 0 0 2.0 pt 0 360 arc 0 setgray fill
newpath 4 pt 0 moveto 9 pt 0 lineto
9 pt 1.5 pt lineto 11 pt 0 lineto 9 pt -1.5 pt lineto
9 pt 0 lineto [] 0 setdash 4 pt setlinewidth 0 setlinejoin
stroke grestore
% (finished ANGLE) 5 ldiagdebugprint
}
{
% else must be a point, we aren't showing those
pop pop pop
} ifelse
} ifelse
} ifelse
} ifelse
} forall
% (Leaving ldiagshowangles) 0 ldiagdebugprint
} def
% fix an angle to 0 <= res < 360: <angle> ldiagfixangle <angle>
/ldiagfixangle
{
% (Entering ldiagfixangle) 1 ldiagdebugprint
{ dup 0 ge { exit } if
360 add
} loop
{ dup 360 lt { exit } if
360 sub
} loop
% (Leaving ldiagfixangle) 1 ldiagdebugprint
} def
% find point on circumference of box: alpha a b ldiagboxcircum x y
/ldiagboxcircum
{
% (Entering ldiagboxcircum) 3 ldiagdebugprint
4 dict begin
/b exch def
/a exch def
ldiagfixangle /alpha exch def
0 0 a b ldiagangleto /theta exch def
% if alpha <= theta, return (a, a*tan(alpha))
alpha theta le
{ a a alpha sin mul alpha cos div }
{
% else if alpha <= 180 - theta, return (b*cot(alpha), b)
alpha 180 theta sub le
{ b alpha cos mul alpha sin div b }
{
% else if alpha <= 180 + theta, return (-a, -a*tan(alpha))
alpha 180 theta add le
{ a neg a neg alpha sin mul alpha cos div }
{
% else if alpha <= 360 - theta, return (-b*cot(alpha), -b)
alpha 360 theta sub le
{ b neg alpha cos mul alpha sin div b neg }
{
% else 360 - theta <= alpha, return (a, a*tan(alpha))
a a alpha sin mul alpha cos div
} ifelse
} ifelse
} ifelse
} ifelse
end
% (Leaving ldiagboxcircum) 2 ldiagdebugprint
} def
% find quadratic roots (assume a != 0): a b c ldiagqroots x1 x2 2
% or x2 1
% or 0
/ldiagqroots
{
4 dict begin
/c exch def
/b exch def
/a exch def
/disc b b mul 4 a c mul mul sub def
disc 0 lt
{ 0
}
{ disc 0 eq
{ b neg 2 a mul div
1
}
{ b neg disc sqrt add 2 a mul div
b neg disc sqrt sub 2 a mul div
2
}
ifelse
}
ifelse
end
} def
% work our which quadrant: <angle> ldiagquadrant <0-3>
/ldiagquadrant
{ dup 90 lt
{ pop 0
}
{ dup 180 lt
{ pop 1
}
{ 270 lt
{ 2
}
{ 3
} ifelse
} ifelse
} ifelse
} def
% find curvebox circum, assuming upper right quadrant: alpha a b xmk ldiagcb x y
/ldiagcb
{
6 dict begin
/xmk exch def
/b exch def
/a exch def
/alpha exch def
/theta1 0 0 a b xmk sub ldiagangleto def
/theta2 0 0 a xmk sub b ldiagangleto def
alpha theta1 le
{ % if alpha <= theta1, return (a, a*tan(alpha))
a a alpha sin mul alpha cos div
}
{ alpha theta2 ge
{ % else if alpha > theta2, return (b*cot(alpha), b)
b alpha cos mul alpha sin div b
}
{
% else, return the intersection of line and circle
a xmk sub b xmk sub xmk 0 0 alpha ldiagcircleintersect
dup 0 eq
{ % should never happen, just return any reasonable point
pop
a b 0.5 ldiagpmul
}
{ 1 eq
{ % should never happen, just return the point on top of stack
}
{ % the usual case, two points on stack, return the larger
ldiagpmax
} ifelse
} ifelse
} ifelse
} ifelse
end
} def
% find point on circumference of curvebox: alpha a b xmk ldiagcurveboxcircum x y
/ldiagcurveboxcircum
{
% (Entering ldiagcurveboxcircum) 4 ldiagdebugprint
5 dict begin
/xmk exch def
/b exch def
/a exch def
ldiagfixangle /alpha exch def
% work out which quadrant we are in, and reflect accordingly
/quad alpha ldiagquadrant def
quad 0 eq
{ alpha a b xmk ldiagcb
}
{ quad 1 eq
{ 180 alpha sub a b xmk ldiagcb exch neg exch
}
{ quad 2 eq
{ alpha 180 sub a b xmk ldiagcb neg exch neg exch
}
{ 360 alpha sub a b xmk ldiagcb neg
} ifelse
} ifelse
} ifelse
end
% (Leaving ldiagcurveboxcircum) 2 ldiagdebugprint
} def
% find point on circumference of diamond: alpha a b ldiagdiamondcircum x y
/ldiagdiamondcircum
{
% (Entering ldiagdiamondcircum) 3 ldiagdebugprint
4 dict begin
/b exch def
/a exch def
ldiagfixangle /alpha exch def
b alpha cos abs mul a alpha sin abs mul add /denom exch def
a b mul alpha cos mul denom div
a b mul alpha sin mul denom div
end
% (Leaving ldiagdiamondcircum) 2 ldiagdebugprint
} def
% find point on circumference of ellipse: alpha a b ldiagellipsecircum x y
/ldiagellipsecircum
{
% (Entering ldiagellipsecircum) 3 ldiagdebugprint
4 dict begin
/b exch def
/a exch def
ldiagfixangle /alpha exch def
b alpha cos mul dup mul a alpha sin mul dup mul add sqrt /denom exch def
a b mul alpha cos mul denom div
a b mul alpha sin mul denom div
end
% (Leaving ldiagellipsecircum) 2 ldiagdebugprint
} def
% find point on circumference of isosceles: alpha a b ldiagisoscelescircum x y
/ldiagisoscelescircum
{
% (Entering ldiagisoscelescircum) 3 ldiagdebugprint
7 dict begin
/b exch def
/a exch def
/alpha exch ldiagfixangle def
/theta1 90 def
/theta2 a b 0.5 ldiagpmul 0 0 ldiagangleto def
/theta3 a b 0.5 ldiagpmul a 0 ldiagangleto def
alpha theta1 ge alpha theta2 le and
{ 0 0 a 2 div b
}
{ alpha theta2 ge alpha theta3 le and
{ 0 0 a 0
}
{ a 0 a 2 div b
} ifelse
} ifelse
a 2 div b 2 div 2 copy 1 ft alpha ldiagatangle ldiaglineintersect
a 2 div b 2 div 4 2 roll ldiagpsub
end
% (Leaving ldiagisoscelescircum) 2 ldiagdebugprint
} def
% find point of intersection of two lines each defined by two points
% x1 y1 x2 y2 x3 y3 x4 y4 ldiaglineintersect x y
/ldiaglineintersect
{
% (Entering ldiaglineintersect) 8 ldiagdebugprint
13 dict begin
/y4 exch def
/x4 exch def
/y3 exch def
/x3 exch def
/y2 exch def
/x2 exch def
/y1 exch def
/x1 exch def
x2 x1 sub /x21 exch def
x4 x3 sub /x43 exch def
y2 y1 sub /y21 exch def
y4 y3 sub /y43 exch def
y21 x43 mul y43 x21 mul sub /det exch def
% calculate x
y21 x43 mul x1 mul
y43 x21 mul x3 mul sub
y3 y1 sub x21 mul x43 mul add
det div
% calculate y
x21 y43 mul y1 mul
x43 y21 mul y3 mul sub
x3 x1 sub y21 mul y43 mul add
det neg div
end
% (Leaving ldiaglineintersect) 2 ldiagdebugprint
} def
% find point on circumference of polygon
% alpha radius num theta ldiagpolycircum x y
/ldiagpolycircum
{
% (Entering ldiagpolycircum) 4 ldiagdebugprint
13 dict begin
/theta exch def
/num exch def
/radius exch def
/alpha exch def
% calculate delta, the angle from theta to alpha
alpha theta sub ldiagfixangle
% calculate the angle which is the multiple of 360/num closest to delta
360 num div div truncate 360 num div mul theta add /anglea exch def
% calculate the next multiple of 360/num after anglea
anglea 360 num div add /angleb exch def
% intersect the line through these two points with the alpha line
anglea cos anglea sin angleb cos angleb sin
0 0 alpha cos 2 mul alpha sin 2 mul
ldiaglineintersect radius ldiagpmul
end
% (Leaving ldiagpolycircum) 2 ldiagdebugprint
} def
% find point of intersection of a line and a circle
% x0 y0 r x1 y1 theta ldiagcircleintersect xa ya xb yb 2
% or xb yb 1
% or 0
/ldiagcircleintersect
{
% (Entering ldiagcircleintersect) 6 ldiagdebugprint
15 dict begin
/theta exch def
/y1 exch def
/x1 exch def
/r exch def
/y0 exch def
/x0 exch def
% if sin(theta) = 0 then line is horizontal and y must be y1
theta sin abs 0.00001 lt
{
/a 1 def
/b -2 x0 mul def
/c x0 dup mul y1 y0 sub dup mul add r dup mul sub def
a b c ldiagqroots dup
0 eq
{ pop
0
}
{ 1 eq
{ y1 1
}
{ y1 exch y1 2
} ifelse
} ifelse
}
{
/ct theta cos theta sin div def
/a ct ct mul 1 add def
/b ct x1 x0 sub mul y1 add y0 sub 2 mul def
/c x1 x0 sub dup mul y1 y0 sub dup mul add r dup mul sub def
a b c ldiagqroots dup
0 eq
{ pop
0
}
{ 1 eq
{ y1 add /yb exch def
yb y1 sub ct mul x1 add /xb exch def
xb yb 1
}
{ y1 add /ya exch def
ya y1 sub ct mul x1 add /xa exch def
y1 add /yb exch def
yb y1 sub ct mul x1 add /xb exch def
xa ya xb yb 2
} ifelse
} ifelse
} ifelse
end
% (Leaving ldiagcircleintersect) 1 ldiagdebugprint
} def
% find line which is the perpendicular bisector of two points, defined
% by two points
% x1 y1 x2 y2 ldiaglinebetween x3 y3 x4 y4
/ldiaglinebetween
{ % (Entering ldiaglinebetween) 4 ldiagdebugprint
/y2 exch def /x2 exch def
/y1 exch def /x1 exch def
% let x3, y3 be the point halfway between the two points
x1 y1 x2 y2 ldiagpadd 0.5 ldiagpmul
/y3 exch def /x3 exch def
% find a point perpendicular to x3, y3
x3 y3 50 x1 y1 x2 y2 ldiagangleto 90 dg add ldiagatangle
% plus x3 y3 gives the two points
x3 y3
% (Leaving ldiaglinebetween) 4 ldiagdebugprint
} def
% find <proc>@<string>: <proc> <string> ldiagfindlabel <any> true
% <proc> <string> false
/ldiagfindlabel
{
% (Entering ldiagfindlabel) 2 ldiagdebugprint
exch dup length 1 ne
{ exch false
% (Leaving ldiagfindabel (length not 1)) 3 ldiagdebugprint
}
{ dup 0 get type /nametype ne
{ exch false
% (Leaving ldiagfindabel (not a name)) 3 ldiagdebugprint
}
{ dup 0 get 50 string cvs (@) ldiagconcat 2 index ldiagconcat dup where
{ exch get exch pop exch pop cvx exec true
% (Leaving ldiagfindlabel with success) 100 ldiagdebugprint
}
{
pop exch false
% (Leaving ldiagfindabel (concat not sensible)) 3 ldiagdebugprint
} ifelse
} ifelse
} ifelse
} bind def
% execute <proc>@<string> or else default: <proc> <string> ldiagdolabel <various>
/ldiagdolabel
{
% (Entering ldiagdolabel) 2 ldiagdebugprint
ldiagfindlabel not
{
dup (CIRCUM) eq
{ pop pop pop 0 0
}
{
dup (ANGLE) eq
{ pop pop 0
}
{ pop cvx exec
} ifelse
} ifelse
} if
% (Leaving ldiagdolabel) 2 ldiagdebugprint
} bind def
% execute a proc depending on whether number is negative, zero, or positive
% procneg proczero procpos number ldiagsigncase <anything>
/ldiagsigncase
{
% (Entering ldiagsigncase) 4 ldiagdebugprint
dup 0 lt
{ pop pop pop exec
}
{ 0 gt
{ exch pop exch pop exec
}
{ pop exch pop exec
} ifelse
} ifelse
% (Leaving ldiagsigncase) 0 ldiagdebugprint
} bind def
% execute proci if angle is in ith quadrant
% proc45 proc270 proc180 proc90 proc0 proc315 proc225 proc135 angle ldiagquadcase <anything>
/ldiagquadcase
{
% (Entering ldiagquadcase) 9 ldiagdebugprint
round ldiagfixangle cvi dup 90 mod 0 eq
{ 90 idiv 4 add } { 90 idiv } ifelse
8 exch roll pop pop pop pop pop pop pop exec
% (Leaving ldiagquadcase) 0 ldiagdebugprint
} bind def
% decode Lout length into PostScript length
% <string> ldiagdecodelength <number>
/ldiagdecodelength
{
% (Entering ldiagdecodelength) 1 ldiagdebugprint
(f) search
{ exch pop exch pop cvr ft
}
{ (c) search
{ exch pop exch pop cvr cm
}
{ (p) search
{ exch pop exch pop cvr pt
}
{ (m) search
{ exch pop exch pop cvr em
}
{ (s) search
{ exch pop exch pop cvr sp
}
{ (v) search
{ exch pop exch pop cvr vs
}
{ (i) search
{ exch pop exch pop cvr in
}
{ pop 0
} ifelse
} ifelse
} ifelse
} ifelse
} ifelse
} ifelse
} ifelse
% (Leaving ldiagdecodelength) 1 ldiagdebugprint
} def
% implement aabout function
% logical form: <circum> <extra> <centre> aabout <point>
% actual form: { <labelorpoint> } cvlit <length> [ <point> ] cvx aabout <point>
/ldiagaabout
{
/centre exch def
/extra exch def
/circum exch def
/ZXCTR [ centre ] cvx def
/ZFCTR [ circum (CTR) ldiagdolabel ] cvx def
/ZAREF ZFCTR ZXCTR ldiagangleto def
/ZAMIN 0 dg def
/ZPMIN [ circum (CTR) ldiagdolabel ZAREF ZAMIN sub
circum (CIRCUM) ldiagdolabel ldiagpadd
0 0 extra ZAREF ZAMIN sub ldiagatangle
ldiagpadd ] cvx def
/ZAMAX 90 dg def
/ZPMAX [ circum (CTR) ldiagdolabel ZAREF ZAMAX sub
circum (CIRCUM) ldiagdolabel ldiagpadd
0 0 extra ZAREF ZAMAX sub ldiagatangle
ldiagpadd ] cvx def
1 1 20
{ /xval exch def
/ZAMID ZAMIN ZAMAX add 0.5 mul def
/ZPMID [ circum (CTR) ldiagdolabel ZAREF ZAMID sub
circum (CIRCUM) ldiagdolabel ldiagpadd
0 0 extra ZAREF ZAMID sub ldiagatangle
ldiagpadd ] cvx def
ZPMID ZXCTR ldiagdistance ZFCTR ZXCTR ldiagdistance gt
{
/ZAMAX [ ZAMID ] cvx def
/ZPMAX [ ZPMID ] cvx def
}
{
/ZAMIN [ ZAMID ] cvx def
/ZPMIN [ ZPMID ] cvx def
} ifelse
} for
ZPMID
} def
% implement cabout function
% logical form: <circum> <extra> <centre> cabout <point>
% actual form: { <labelorpoint> } cvlit <length> [ <point> ] cvx cabout <point>
/ldiagcabout
{
/centre exch def
/extra exch def
/circum exch def
/ZXCTR [ centre ] cvx def
/ZFCTR [ circum (CTR) ldiagdolabel ] cvx def
/ZAREF ZFCTR ZXCTR ldiagangleto def
/ZAMIN 0 dg def
/ZPMIN [ circum (CTR) ldiagdolabel ZAREF ZAMIN add
circum (CIRCUM) ldiagdolabel ldiagpadd
0 0 extra ZAREF ZAMIN add ldiagatangle
ldiagpadd ] cvx def
/ZAMAX 90 dg def
/ZPMAX [ circum (CTR) ldiagdolabel ZAREF ZAMAX add
circum (CIRCUM) ldiagdolabel ldiagpadd
0 0 extra ZAREF ZAMAX add ldiagatangle
ldiagpadd ] cvx def
1 1 20
{ /xval exch def
/ZAMID ZAMIN ZAMAX add 0.5 mul def
/ZPMID [ circum (CTR) ldiagdolabel ZAREF ZAMID add
circum (CIRCUM) ldiagdolabel ldiagpadd
0 0 extra ZAREF ZAMID add ldiagatangle
ldiagpadd ] cvx def
ZPMID ZXCTR ldiagdistance ZFCTR ZXCTR ldiagdistance gt
{
/ZAMAX [ ZAMID ] cvx def
/ZPMAX [ ZPMID ] cvx def
}
{
/ZAMIN [ ZAMID ] cvx def
/ZPMIN [ ZPMID ] cvx def
} ifelse
} for
ZPMID
} def
% fromarrowlength toarrowlength { from } { to } xindent zindent ldiaglinepath -
/ldiaglinepath
{
% (entering ldiaglinepath) 0 ldiagdebugprint
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagangleto
/FROM@ANGLE ldiagangledef
from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd
/FROM ldiagpointdef
FROM@ANGLE /TO@ANGLE ldiagangledef
to (CTR) ldiagdolabel TO@ANGLE 180 dg sub to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength TO@ANGLE 180 dg sub ldiagatangle ldiagpadd /TO ldiagpointdef
FROM 0.5 ldiagpmul TO 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
FROM@ANGLE /LMID@ANGLE ldiagangledef
/XINDENT xindent FROM LMID ldiagdistance ldiagmin def
FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
/ZINDENT zindent TO LMID ldiagdistance ldiagmin def
0 0 ZINDENT FROM@ANGLE ldiagatangle TO ldiagpsub /LTO ldiagpointdef
FROM@ANGLE /LTO@ANGLE ldiagangledef
direct { FROM TO } { FROM LFROM LMID LTO TO } ifelse
% (leaving ldiaglinepath) 0 ldiagdebugprint
} def
% fromarrowlength toarrowlength { from } { to } xindent zindent pathgap ldiagdoublelinepath -
/ldiagdoublelinepath
{
% (entering ldiagdoublelinepath) 0 ldiagdebugprint
/pathgap exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagangleto
/FROM@ANGLE ldiagangledef
from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd
/FROM ldiagpointdef
FROM@ANGLE /TO@ANGLE ldiagangledef
to (CTR) ldiagdolabel TO@ANGLE 180 dg sub to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength TO@ANGLE 180 dg sub ldiagatangle ldiagpadd /TO ldiagpointdef
FROM 0.5 ldiagpmul TO 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
FROM@ANGLE /LMID@ANGLE ldiagangledef
/XINDENT xindent FROM LMID ldiagdistance ldiagmin def
FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
/ZINDENT zindent TO LMID ldiagdistance ldiagmin def
0 0 ZINDENT FROM@ANGLE ldiagatangle TO ldiagpsub /LTO ldiagpointdef
FROM@ANGLE /LTO@ANGLE ldiagangledef
direct {
FROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
TO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
[]
FROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
TO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
}
{
FROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
LFROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
LMID pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
LTO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
TO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle
[]
FROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
LFROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
LMID pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
LTO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
TO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle
} ifelse
% (leaving ldiagdoublelinepath) 0 ldiagdebugprint
} def
% fromarrowlen toarrowlen { from } { to } xindent zindent bias ldiagacurvepath -
/ldiagacurvepath
{
% (entering ldiagacurvepath) 0 ldiagdebugprint
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
%/B1 bias 0.02 ft ldiagmax def
%/B2 from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagdistance 0.5 mul def
%/BIAS B1 B2 ldiagmin def
/BIAS bias 0.02 ft ldiagmax def
/XMID [ from (CTR) ldiagdolabel 0.5 ldiagpmul
to (CTR) ldiagdolabel 0.5 ldiagpmul ldiagpadd ] cvx def
/XTOP [ XMID 0 0 BIAS from (CTR) ldiagdolabel to (CTR) ldiagdolabel
ldiagangleto 90 dg sub ldiagatangle ldiagpadd ] cvx def
/CTR [ from (CTR) ldiagdolabel XTOP ldiaglinebetween
to (CTR) ldiagdolabel XTOP ldiaglinebetween
ldiaglineintersect ] cvx def
from fromarrowlength [ CTR ] cvx ldiagaabout /FROM ldiagpointdef
from (CTR) ldiagdolabel FROM ldiagdistance 0 gt
{ from (CTR) ldiagdolabel FROM ldiagangleto
}
{ CTR FROM ldiagangleto 90 dg add
} ifelse /FROM@ANGLE ldiagangledef
to toarrowlength [ CTR ] cvx ldiagcabout /TO ldiagpointdef
TO to (CTR) ldiagdolabel ldiagdistance 0 gt
{ TO to (CTR) ldiagdolabel ldiagangleto
}
{ CTR TO ldiagangleto 90 dg add
} ifelse /TO@ANGLE ldiagangledef
/RADIUS CTR FROM ldiagdistance def
CTR 0 0 RADIUS CTR FROM ldiagangleto 360 dg CTR TO ldiagangleto
add CTR FROM ldiagangleto sub cvi 360 mod 0.5 mul add
ldiagatangle ldiagpadd /LMID ldiagpointdef
CTR LMID ldiagangleto 90 dg add /LMID@ANGLE ldiagangledef
/XINDENT xindent FROM LMID ldiagdistance ldiagmin def
CTR 0 0 RADIUS CTR FROM 0 0 XINDENT FROM@ANGLE ldiagatangle
ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LFROM ldiagpointdef
CTR LFROM ldiagangleto 90 dg add /LFROM@ANGLE ldiagangledef
/ZINDENT zindent TO LMID ldiagdistance ldiagmin def
CTR 0 0 RADIUS CTR TO 0 0 ZINDENT TO@ANGLE 180 dg add
ldiagatangle ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LTO ldiagpointdef
CTR LTO ldiagangleto 90 dg add /LTO@ANGLE ldiagangledef
direct
{ FROM [CTR] TO }
{ FROM [CTR] LFROM [CTR] LMID [CTR] LTO [CTR] TO }
ifelse
% (leaving ldiagacurvepath) 0 ldiagdebugprint
} def
% fromarrowlen toarrowlen { from } { to } xindent zindent bias ldiagccurvepath -
/ldiagccurvepath
{
% (entering ldiagccurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
%/B1 bias 0.02 ft ldiagmax def
%/B2 from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagdistance 0.5 mul def
%/BIAS B1 B2 ldiagmin def
/BIAS bias 0.02 ft ldiagmax def
/XMID [ from (CTR) ldiagdolabel 0.5 ldiagpmul
to (CTR) ldiagdolabel 0.5 ldiagpmul ldiagpadd ] cvx def
/XTOP [ XMID 0 0 BIAS from (CTR) ldiagdolabel to (CTR) ldiagdolabel
ldiagangleto 90 dg add ldiagatangle ldiagpadd ] cvx def
/CTR [ from (CTR) ldiagdolabel XTOP ldiaglinebetween
to (CTR) ldiagdolabel XTOP ldiaglinebetween ldiaglineintersect ] cvx def
from fromarrowlength [ CTR ] cvx ldiagcabout /FROM ldiagpointdef
from (CTR) ldiagdolabel FROM ldiagdistance 0 gt
{ from (CTR) ldiagdolabel FROM ldiagangleto }
{ CTR FROM ldiagangleto 90 dg sub }
ifelse /FROM@ANGLE ldiagangledef
to toarrowlength [ CTR ] cvx ldiagaabout /TO ldiagpointdef
TO to (CTR) ldiagdolabel ldiagdistance 0 gt
{ TO to (CTR) ldiagdolabel ldiagangleto }
{ CTR TO ldiagangleto 90 dg sub }
ifelse /TO@ANGLE ldiagangledef
/RADIUS [ CTR FROM ldiagdistance ] cvx def
CTR 0 0 RADIUS CTR TO ldiagangleto 360 dg CTR FROM ldiagangleto add
CTR TO ldiagangleto sub cvi 360 cvi mod 2 div add ldiagatangle
ldiagpadd /LMID ldiagpointdef
CTR LMID ldiagangleto 90 dg sub /LMID@ANGLE ldiagangledef
/XINDENT [ xindent FROM LMID ldiagdistance ldiagmin ] cvx def
CTR 0 0 RADIUS CTR FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd
ldiagangleto ldiagatangle ldiagpadd /LFROM ldiagpointdef
CTR LFROM ldiagangleto 90 dg sub /LFROM@ANGLE ldiagangledef
/ZINDENT [ zindent TO LMID ldiagdistance ldiagmin ] cvx def
CTR 0 0 RADIUS CTR TO 0 0 ZINDENT TO@ANGLE 180 dg add ldiagatangle
ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LTO ldiagpointdef
CTR LTO ldiagangleto 90 dg sub /LTO@ANGLE ldiagangledef
direct
{ FROM [CTR clockwise] TO }
{ FROM [CTR clockwise] LFROM [CTR clockwise]
LMID [CTR clockwise] LTO [CTR clockwise] TO }
ifelse
% (leaving ldiagccurvepath) 0 ldiagdebugprint
} def
% farr tarr { from } { to } xindent zindent [frompt] [topt] ldiagbezierpath -
/ldiagbezierpath
{
% (entering ldiagbezierpath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
cvx /topt exch def
cvx /frompt exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel frompt ldiagangleto /FROM@ANGLE ldiagangledef
from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel
ldiagpadd 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd
/FROM ldiagpointdef
topt to (CTR) ldiagdolabel ldiagangleto /TO@ANGLE ldiagangledef
to (CTR) ldiagdolabel TO@ANGLE 180 dg add to (CIRCUM) ldiagdolabel
ldiagpadd 0 0 toarrowlength TO@ANGLE 180 dg add ldiagatangle ldiagpadd
/TO ldiagpointdef
FROM 0 0 xindent FROM@ANGLE ldiagatangle ldiagpadd
/LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
TO 0 0 zindent TO@ANGLE 180 dg add ldiagatangle ldiagpadd
/LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
FROM TO ldiagpadd frompt ldiagpadd topt ldiagpadd 0.25 ldiagpmul
/LMID ldiagpointdef
FROM [frompt topt] TO
% (leaving ldiagbezierpath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent ldiagvhlinepath -
/ldiagvhlinepath
{
% (entering ldiagvhlinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/CTR [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel exch pop ] cvx def
/FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
/TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef
FANG /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef
TANG 180 dg add /TO@ANGLE ldiagangledef
/FDIST [ FROM CTR ldiagdistance ] cvx def
/TDIST [ TO CTR ldiagdistance ] cvx def
/XINDENT [ xindent FDIST ldiagmin ] cvx def
/ZINDENT [ zindent TDIST ldiagmin ] cvx def
FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
CTR /LMID ldiagpointdef
0 0 1 ft FANG 180 dg add ldiagatangle
0 0 1 ft TANG 180 dg add ldiagatangle
ldiagangleto /LMID@ANGLE ldiagangledef
FROM LFROM LMID LTO TO
% (leaving ldiagvhlinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent radius ldiagvhcurvepath -
/ldiagvhcurvepath
{
% (entering ldiagvhcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/radius exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/CTR [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel exch pop ] cvx def
/FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
/TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef
FANG /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef
TANG 180 dg add /TO@ANGLE ldiagangledef
/FDIST [ FROM CTR ldiagdistance ] cvx def
/TDIST [ TO CTR ldiagdistance ] cvx def
/RADIUS [ radius FDIST TDIST ldiagmin ldiagmin ] cvx def
/XINDENT [ xindent FDIST RADIUS sub ldiagmin ] cvx def
/ZINDENT [ zindent TDIST RADIUS sub ldiagmin ] cvx def
FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
/FCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd ] cvx def
/TCTR [ CTR 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def
/XCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd
0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def
XCTR 0 0 RADIUS XCTR CTR ldiagangleto ldiagatangle ldiagpadd
/LMID ldiagpointdef
FCTR TCTR ldiagangleto /LMID@ANGLE ldiagangledef
FROM LFROM FCTR
{[XCTR clockwise]} {} {} {} {} {[XCTR]} {[XCTR clockwise]} {[XCTR]}
FCTR TCTR ldiagangleto ldiagquadcase
TCTR LTO TO
% (leaving ldiagvhcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent ldiaghvlinepath -
/ldiaghvlinepath
{
% (entering ldiaghvlinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/CTR [ to (CTR) ldiagdolabel pop from (CTR) ldiagdolabel exch pop ] cvx def
/FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
/TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef
FANG /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef
TANG 180 dg add /TO@ANGLE ldiagangledef
/FDIST [ FROM CTR ldiagdistance ] cvx def
/TDIST [ TO CTR ldiagdistance ] cvx def
/XINDENT [ xindent FDIST ldiagmin ] cvx def
/ZINDENT [ zindent TDIST ldiagmin ] cvx def
FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
CTR /LMID ldiagpointdef
0 0 1 ft FANG 180 dg add ldiagatangle
0 0 1 ft TANG 180 dg add ldiagatangle ldiagangleto
/LMID@ANGLE ldiagangledef
FROM LFROM LMID LTO TO
% (leaving ldiaghvlinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent radius ldiaghvcurvepath -
/ldiaghvcurvepath
{
% (entering ldiaghvcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/radius exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/CTR [ to (CTR) ldiagdolabel pop from (CTR) ldiagdolabel exch pop ] cvx def
/FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
/TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def
from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef
FANG /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef
TANG 180 dg add /TO@ANGLE ldiagangledef
/FDIST [ FROM CTR ldiagdistance ] cvx def
/TDIST [ TO CTR ldiagdistance ] cvx def
/RADIUS [ radius FDIST TDIST ldiagmin ldiagmin ] cvx def
/XINDENT [ xindent FDIST RADIUS sub ldiagmin ] cvx def
/ZINDENT [ zindent TDIST RADIUS sub ldiagmin ] cvx def
FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
/FCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd ] cvx def
/TCTR [ CTR 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def
/XCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd
0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def
XCTR 0 0 RADIUS XCTR CTR ldiagangleto ldiagatangle ldiagpadd
/LMID ldiagpointdef
FCTR TCTR ldiagangleto /LMID@ANGLE ldiagangledef
FROM LFROM FCTR
{[XCTR]} {} {} {} {} {[XCTR clockwise]} {[XCTR]} {[XCTR clockwise]}
FCTR TCTR ldiagangleto ldiagquadcase
TCTR LTO TO
% (leaving ldiaghvcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias ldiaglvrlinepath -
/ldiaglvrlinepath
{
% (entering ldiaglvrlinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel 180 dg from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength 180 dg ldiagatangle ldiagpadd /FROM ldiagpointdef
180 dg /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel 180 dg to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength 180 dg ldiagatangle ldiagpadd /TO ldiagpointdef
0 dg /TO@ANGLE ldiagangledef
/XLEFT [ FROM pop TO pop ldiagmin bias sub ] cvx def
XLEFT FROM exch pop /P1 ldiagpointdef
XLEFT TO exch pop /P2 ldiagpointdef
/VERT [ P1 P2 ldiagangleto ] cvx def
P1 P1 0 0 1 ft 180 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle
ldiagpadd ldiagangleto /P1@ANGLE ldiagangledef
P2 P2 0 0 1 ft 0 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle
ldiagpadd ldiagangleto /P2@ANGLE ldiagangledef
P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
VERT /LMID@ANGLE ldiagangledef
/XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def
/ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def
XINDENT 0 FROM ldiagpsub /LFROM ldiagpointdef
180 dg /LFROM@ANGLE ldiagangledef
ZINDENT 0 TO ldiagpsub /LTO ldiagpointdef
0 dg /LTO@ANGLE ldiagangledef
FROM LFROM P1 LMID P2 LTO TO
% (leaving ldiaglvrlinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias radius ldiaglvrcurvepath -
/ldiaglvrcurvepath
{
% (entering ldiaglvrcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/radius exch def
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel 180 dg from (CIRCUM) ldiagdolabel ldiagpadd 0 0
fromarrowlength 180 dg ldiagatangle ldiagpadd /FROM ldiagpointdef
180 dg /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel 180 dg to (CIRCUM) ldiagdolabel ldiagpadd 0 0
toarrowlength 180 dg ldiagatangle ldiagpadd /TO ldiagpointdef
0 dg /TO@ANGLE ldiagangledef
/XLEFT [ FROM pop TO pop ldiagmin bias sub ] cvx def
/XP1 [ XLEFT FROM exch pop ] cvx def
/XP2 [ XLEFT TO exch pop ] cvx def
/VERT [ XP1 XP2 ldiagangleto ] cvx def
XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
VERT /LMID@ANGLE ldiagangledef
/XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def
/ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def
XINDENT 0 FROM ldiagpsub /LFROM ldiagpointdef
180 dg /LFROM@ANGLE ldiagangledef
ZINDENT 0 TO ldiagpsub /LTO ldiagpointdef
0 dg /LTO@ANGLE ldiagangledef
/RADIUS [ radius XP1 XP2 ldiagdistance 2 div ldiagmin ] cvx def
/XP1PRE [ XP1 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def
/XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def
/XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def
XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd
/P1 ldiagpointdef
XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef
/XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def
/XP2POST [ XP2 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def
/XP2CTR [ XP2PRE 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def
XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd
/P2 ldiagpointdef
XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef
FROM LFROM XP1PRE
{ } { [XP1CTR] P1 [XP1CTR] } { } { [XP1CTR clockwise] P1 [XP1CTR clockwise] }
{ } { } { } { } VERT round ldiagquadcase
XP1POST LMID XP2PRE
{ } { [XP2CTR] P2 [XP2CTR] } { } { [XP2CTR clockwise] P2 [XP2CTR clockwise] }
{ } { } { } { } VERT round ldiagquadcase
XP2POST LTO TO
% (leaving ldiaglvrcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias ldiagrvllinepath -
/ldiagrvllinepath
{
% (entering ldiagrvllinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel 0 dg from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength 0 dg ldiagatangle ldiagpadd /FROM ldiagpointdef
0 dg /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel 0 dg to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength 0 dg ldiagatangle ldiagpadd /TO ldiagpointdef
180 dg /TO@ANGLE ldiagangledef
/XRIGHT [ FROM pop TO pop ldiagmax bias add ] cvx def
XRIGHT FROM exch pop /P1 ldiagpointdef
XRIGHT TO exch pop /P2 ldiagpointdef
/VERT [ P1 P2 ldiagangleto ] cvx def
P1 P1 0 0 1 ft 0 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle
ldiagpadd ldiagangleto /P1@ANGLE ldiagangledef
P2 P2 0 0 1 ft 180 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle
ldiagpadd ldiagangleto /P2@ANGLE ldiagangledef
P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
VERT /LMID@ANGLE ldiagangledef
/XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def
/ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def
FROM XINDENT 0 ldiagpadd /LFROM ldiagpointdef
0 dg /LFROM@ANGLE ldiagangledef
TO ZINDENT 0 ldiagpadd /LTO ldiagpointdef
180 dg /LTO@ANGLE ldiagangledef
FROM LFROM P1 LMID P2 LTO TO
% (leaving ldiagrvllinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias radius ldiagrvlcurvepath -
/ldiagrvlcurvepath
{
% (entering ldiagrvlcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/radius exch def
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
from (CTR) ldiagdolabel 0 dg from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength 0 dg ldiagatangle ldiagpadd /FROM ldiagpointdef
0 dg /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel 0 dg to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength 0 dg ldiagatangle ldiagpadd /TO ldiagpointdef
180 dg /TO@ANGLE ldiagangledef
/XRIGHT [ FROM pop TO pop ldiagmax bias add ] cvx def
/XP1 [ XRIGHT FROM exch pop ] cvx def
/XP2 [ XRIGHT TO exch pop ] cvx def
/VERT [ XP1 XP2 ldiagangleto ] cvx def
XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
VERT /LMID@ANGLE ldiagangledef
/XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def
/ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def
FROM XINDENT 0 ldiagpadd /LFROM ldiagpointdef
0 dg /LFROM@ANGLE ldiagangledef
TO ZINDENT 0 ldiagpadd /LTO ldiagpointdef
180 dg /LTO@ANGLE ldiagangledef
/RADIUS [ radius XP1 XP2 ldiagdistance 0.5 mul ldiagmin ] cvx def
/XP1PRE [ XP1 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def
/XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def
/XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def
XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd
/P1 ldiagpointdef
XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef
/XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def
/XP2POST [ XP2 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def
/XP2CTR [ XP2PRE 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def
XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd
/P2 ldiagpointdef
XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef
FROM LFROM XP1PRE
{} {[XP1CTR clockwise] P1 [XP1CTR clockwise]} {} {[XP1CTR] P1 [XP1CTR]}
{} {} {} {} VERT round ldiagquadcase
XP1POST LMID XP2PRE
{} {[XP2CTR clockwise] P2 [XP2CTR clockwise]} {} {[XP2CTR] P2 [XP2CTR]}
{} {} {} {} VERT round ldiagquadcase
XP2POST LTO TO
% (leaving ldiagrvlcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias fbias tbias ldiagdwraplinepath -
/ldiagdwraplinepath
{
% (entering ldiagdwraplinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/tbias exch def
/fbias exch def
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop
lt { 180 dg } { 0 dg } ifelse ] cvx def
from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd 0 0
fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef
DIRN /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef
DIRN /TO@ANGLE ldiagangledef
FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd /P1 ldiagpointdef
DIRN 180 dg eq { 225 dg } { -45 dg } ifelse /P1@ANGLE ldiagangledef
TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd
/P4 ldiagpointdef
DIRN 180 dg eq { 135 dg } { 45 dg } ifelse /P4@ANGLE ldiagangledef
/YC [ from (CTR) ldiagdolabel 270 dg from (CIRCUM) ldiagdolabel ldiagpadd
exch pop to (CTR) ldiagdolabel 270 dg to (CIRCUM) ldiagdolabel ldiagpadd
exch pop ldiagmin bias 0 ldiagmax sub ] cvx def
P1 pop YC /P2 ldiagpointdef
P4@ANGLE 180 dg sub /P2@ANGLE ldiagangledef
P4 pop YC /P3 ldiagpointdef
P1@ANGLE 180 dg sub /P3@ANGLE ldiagangledef
/XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def
FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
/ZINDENT [ zindent TO P4 ldiagdistance ldiagmin ] cvx def
TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
P2 0.5 ldiagpmul P3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
DIRN 180 dg sub /LMID@ANGLE ldiagangledef
FROM P1 P2 P3 P4 TO
% (leaving ldiagdwraplinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias fbias tbias radius
% ldiagdwrapcurvepath -
/ldiagdwrapcurvepath
{
% (entering ldiagdwrapcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/radius exch def
/tbias exch def
/fbias exch def
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt
{ 180 dg } { 0 dg } ifelse ] cvx def
/CLOCK [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt
{ anticlockwise } { clockwise } ifelse ] cvx def
from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef
DIRN /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef
DIRN /TO@ANGLE ldiagangledef
/XP1 [ FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd ] cvx def
/XP4 [ TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd ] cvx def
/YC [ from (CTR) ldiagdolabel 270 dg from (CIRCUM) ldiagdolabel ldiagpadd
exch pop to (CTR) ldiagdolabel 270 dg to (CIRCUM) ldiagdolabel ldiagpadd
exch pop ldiagmin bias 0 ldiagmax sub ] cvx def
/XP2 [ XP1 pop YC ] cvx def
/XP3 [ XP4 pop YC ] cvx def
/RP1 [ radius XP1 FROM ldiagdistance XP1 XP2 ldiagdistance 2 div
ldiagmin ldiagmin ] cvx def
/XP1PRE [ XP1 0 0 RP1 XP1 FROM ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP1POST [ XP1 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP1CTR [ XP1PRE 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP1CTR 0 0 RP1 XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef
XP1CTR P1 ldiagangleto DIRN add 90 dg sub /P1@ANGLE ldiagangledef
/RP2 [ radius XP1 XP2 ldiagdistance 2 div XP2 XP3 ldiagdistance 2 div
ldiagmin ldiagmin ] cvx def
/XP2PRE [ XP2 0 0 RP2 XP2 XP1 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP2POST [ XP2 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP2CTR [ XP2PRE 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP2CTR 0 0 RP2 XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef
XP2CTR P2 ldiagangleto DIRN add 90 dg sub /P2@ANGLE ldiagangledef
/RP3 [ radius XP2 XP3 ldiagdistance 2 div XP3 XP4 ldiagdistance 2 div
ldiagmin ldiagmin ] cvx def
/XP3PRE [ XP3 0 0 RP3 XP3 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP3POST [ XP3 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP3CTR [ XP3PRE 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP3CTR 0 0 RP3 XP3CTR XP3 ldiagangleto ldiagatangle ldiagpadd /P3 ldiagpointdef
XP3CTR P3 ldiagangleto DIRN add 90 dg sub /P3@ANGLE ldiagangledef
/RP4 [ radius XP4 XP3 ldiagdistance 2 div XP4 TO ldiagdistance
ldiagmin ldiagmin ] cvx def
/XP4PRE [ XP4 0 0 RP4 XP4 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP4POST [ XP4 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP4CTR [ XP4PRE 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP4CTR 0 0 RP4 XP4CTR XP4 ldiagangleto ldiagatangle ldiagpadd /P4 ldiagpointdef
XP4CTR P4 ldiagangleto DIRN add 90 dg sub /P4@ANGLE ldiagangledef
/XINDENT [ xindent FROM XP1PRE ldiagdistance ldiagmin ] cvx def
FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
XP2 0.5 ldiagpmul XP3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
DIRN 180 dg sub /LMID@ANGLE ldiagangledef
/ZINDENT [ zindent TO XP4POST ldiagdistance ldiagmin ] cvx def
TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
FROM LFROM
XP1PRE [XP1CTR CLOCK] XP1POST
XP2PRE [XP2CTR CLOCK] XP2POST
LMID
XP3PRE [XP3CTR CLOCK] XP3POST
XP4PRE [XP4CTR CLOCK] XP4POST
LTO TO
% (leaving ldiagdwrapcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias fbias tbias ldiaguwraplinepath -
/ldiaguwraplinepath
{
% (entering ldiaguwraplinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/tbias exch def
/fbias exch def
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt
{ 180 dg } { 0 dg } ifelse ] cvx def
from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef
DIRN /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef
DIRN /TO@ANGLE ldiagangledef
FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd /P1 ldiagpointdef
DIRN 180 dg eq { 135 dg } { 45 dg } ifelse /P1@ANGLE ldiagangledef
TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd
/P4 ldiagpointdef
DIRN 180 dg eq { 225 dg } { -45 dg } ifelse /P4@ANGLE ldiagangledef
/YC [ from (CTR) ldiagdolabel 90 dg from (CIRCUM) ldiagdolabel ldiagpadd
exch pop to (CTR) ldiagdolabel 90 dg to (CIRCUM) ldiagdolabel ldiagpadd
exch pop ldiagmax bias 0 ldiagmax add ] cvx def
P1 pop YC /P2 ldiagpointdef
P4@ANGLE 180 dg sub /P2@ANGLE ldiagangledef
P4 pop YC /P3 ldiagpointdef
P1@ANGLE 180 dg sub /P3@ANGLE ldiagangledef
/XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def
FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
/ZINDENT [ zindent TO P4 ldiagdistance ldiagmin ] cvx def
TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
P2 0.5 ldiagpmul P3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
DIRN 180 dg sub /LMID@ANGLE ldiagangledef
FROM P1 P2 P3 P4 TO
% (leaving ldiaguwraplinepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% farr tarr { from } { to } xindent zindent bias fbias tbias radius
% ldiaguwrapcurvepath -
/ldiaguwrapcurvepath
{
% (entering ldiaguwrapcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
/radius exch def
/tbias exch def
/fbias exch def
/bias exch def
/zindent exch def
/xindent exch def
cvlit /to exch def
cvlit /from exch def
/toarrowlength exch def
/fromarrowlength exch def
/DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt
{ 180 dg } { 0 dg } ifelse ] cvx def
/CLOCK [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt
{ clockwise } { anticlockwise } ifelse ] cvx def
from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd
0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef
DIRN /FROM@ANGLE ldiagangledef
to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd
0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef
DIRN /TO@ANGLE ldiagangledef
/XP1 [ FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd ] cvx def
/XP4 [ TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd ] cvx def
/YC [ from (CTR) ldiagdolabel 90 dg from (CIRCUM) ldiagdolabel ldiagpadd
exch pop to (CTR) ldiagdolabel 90 dg to (CIRCUM) ldiagdolabel ldiagpadd
exch pop ldiagmax bias 0 ldiagmax add ] cvx def
/XP2 [ XP1 pop YC ] cvx def
/XP3 [ XP4 pop YC ] cvx def
/RP1 [ radius XP1 FROM ldiagdistance XP1 XP2 ldiagdistance 2 div
ldiagmin ldiagmin ] cvx def
/XP1PRE [ XP1 0 0 RP1 XP1 FROM ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP1POST [ XP1 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP1CTR [ XP1PRE 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP1CTR 0 0 RP1 XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef
XP1CTR P1 ldiagangleto DIRN add 90 dg add /P1@ANGLE ldiagangledef
/RP2 [ radius XP1 XP2 ldiagdistance 2 div XP2 XP3 ldiagdistance 2 div
ldiagmin ldiagmin ] cvx def
/XP2PRE [ XP2 0 0 RP2 XP2 XP1 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP2POST [ XP2 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP2CTR [ XP2PRE 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP2CTR 0 0 RP2 XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef
XP2CTR P2 ldiagangleto DIRN add 90 dg add /P2@ANGLE ldiagangledef
/RP3 [ radius XP2 XP3 ldiagdistance 2 div XP3 XP4 ldiagdistance 2 div
ldiagmin ldiagmin ] cvx def
/XP3PRE [ XP3 0 0 RP3 XP3 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP3POST [ XP3 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP3CTR [ XP3PRE 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP3CTR 0 0 RP3 XP3CTR XP3 ldiagangleto ldiagatangle ldiagpadd /P3 ldiagpointdef
XP3CTR P3 ldiagangleto DIRN add 90 dg add /P3@ANGLE ldiagangledef
/RP4 [ radius XP4 XP3 ldiagdistance 2 div XP4 TO ldiagdistance
ldiagmin ldiagmin ] cvx def
/XP4PRE [ XP4 0 0 RP4 XP4 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP4POST [ XP4 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def
/XP4CTR [ XP4PRE 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def
XP4CTR 0 0 RP4 XP4CTR XP4 ldiagangleto ldiagatangle ldiagpadd /P4 ldiagpointdef
XP4CTR P4 ldiagangleto DIRN add 90 dg add /P4@ANGLE ldiagangledef
/XINDENT [ xindent FROM XP1PRE ldiagdistance ldiagmin ] cvx def
FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef
FROM@ANGLE /LFROM@ANGLE ldiagangledef
XP2 0.5 ldiagpmul XP3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef
DIRN 180 dg sub /LMID@ANGLE ldiagangledef
/ZINDENT [ zindent TO XP4POST ldiagdistance ldiagmin ] cvx def
TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef
TO@ANGLE /LTO@ANGLE ldiagangledef
FROM LFROM
XP1PRE [XP1CTR CLOCK] XP1POST
XP2PRE [XP2CTR CLOCK] XP2POST
LMID
XP3PRE [XP3CTR CLOCK] XP3POST
XP4PRE [XP4CTR CLOCK] XP4POST
LTO TO
% (leaving ldiaguwrapcurvepath) 0 ldiagdebugprint
% count ( stack size is) 1 ldiagdebugprint pop
} def
% shape and labels of the @SolidArrowHead symbol
% - ldiagsolidarrowhead -
/ldiagsolidarrowhead
{
0 0 xsize ysize 0.5 mul 0 ysize
} def
% shape and labels of the @OpenArrowHead symbol
% <pathwidth> ldiagopenarrowhead -
/ldiagopenarrowhead
{
/pathwidth exch def
/PSW [ 0 0 ] cvx def
/PNW [ 0 ysize ] cvx def
/PE [ xsize ysize 0.5 mul ] cvx def
/REL [ 0 0 pathwidth PE PNW ldiagangleto 90 add ldiagatangle ] cvx def
/PNA [ 0 ysize 0.5 mul pathwidth 0.5 mul add ] cvx def
/PSA [ 0 ysize 0.5 mul pathwidth 0.5 mul sub ] cvx def
/PNI [ PNA PNA xsize 0 ldiagpadd PNW REL ldiagpadd
PE REL ldiagpadd ldiaglineintersect ] cvx def
/PSI [ 0 pathwidth PNI ldiagpsub ] cvx def
PSW PE PNW PNI PNA PSA PSI PSW
} def
% shape and labels of the @HalfOpenArrowHead symbol
% <pathwidth> ldiaghalfopenarrowhead -
/ldiaghalfopenarrowhead
{
/pathwidth exch def
0 0
xsize ysize 0.5 mul
0 ysize
xsize 0.3 mul ysize 0.5 mul pathwidth 0.5 mul add
0 ysize 0.5 mul pathwidth 0.5 mul add
0 ysize 0.5 mul pathwidth 0.5 mul sub
xsize 0.3 mul ysize 0.5 mul pathwidth 0.5 mul sub
0 0
} def
% shape and labels of the @SolidCurvedArrowHead symbol
% - ldiagsolidcurvedarrowhead -
/ldiagsolidcurvedarrowhead
{
0 0
[0 0 xsize ysize 0.5 mul ldiaglinebetween
xsize 0 xsize ysize ldiaglineintersect clockwise]
xsize ysize 0.5 mul
[xsize ysize 0.5 mul 0 ysize ldiaglinebetween
xsize 0 xsize ysize ldiaglineintersect clockwise]
0 ysize
} def
% shape and labels of the @OpenCurvedArrowHead symbol
% <pathwidth> ldiagopencurvedarrowhead -
/ldiagopencurvedarrowhead
{
/pathwidth exch def
/LR [ 0 0 xsize ysize 0.5 mul ldiaglinebetween
xsize 0 xsize ysize ldiaglineintersect
] cvx def
/UR [ xsize ysize 0.5 mul 0 ysize ldiaglinebetween
xsize 0 xsize ysize ldiaglineintersect
] cvx def
/PW2 [ pathwidth 0.5 mul ] cvx def
/UMID [
0 ysize 0.5 mul PW2 add
xsize ysize 0.5 mul PW2 add
0 ysize 0 0 1 ft UR 0 ysize ldiagangleto 90 add ldiagatangle
ldiagpadd 0 ysize ldiaglineintersect
] cvx def
/LMID [ 0 pathwidth UMID ldiagpsub ] cvx def
0 0
[LR clockwise]
xsize ysize 0.5 mul
[UR clockwise]
0 ysize
UMID
0 ysize 0.5 mul PW2 add
0 ysize 0.5 mul PW2 sub
LMID
0 0
} def
% shape and labels of the @HalfOpenCurvedArrowHead symbol
% <pathwidth> ldiaghalfopencurvedarrowhead -
/ldiaghalfopencurvedarrowhead
{
/pathwidth exch def
/LR [ 0 0 xsize ysize 0.5 mul ldiaglinebetween
xsize 0 xsize ysize ldiaglineintersect
] cvx def
/UR [ xsize ysize 0.5 mul 0 ysize ldiaglinebetween
xsize 0 xsize ysize ldiaglineintersect
] cvx def
/BR [ 0 0 LR 0 ysize UR ldiaglineintersect ] cvx def
/BRAD [ 0 0 BR ldiagdistance ] cvx def
/PW2 [ pathwidth 0.5 mul ] cvx def
/XDIST [ BRAD dup mul PW2 dup mul sub sqrt ] cvx def
/UMID [ BR XDIST PW2 ldiagpadd ] cvx def
/LMID [ BR XDIST 0 PW2 sub ldiagpadd ] cvx def
0 0
[LR clockwise]
xsize ysize 0.5 mul
[UR clockwise]
0 ysize
[BR clockwise]
UMID
0 ysize 0.5 mul PW2 add
0 ysize 0.5 mul PW2 sub
LMID
[BR clockwise]
0 0
} def
end
%%EndResource