| 1 |
% $Id: pstricks.pro 7 2007-12-29 22:21:13Z herbert $ |
|---|
| 2 |
% |
|---|
| 3 |
% PostScript prologue for pstricks.tex. |
|---|
| 4 |
% Version 1.03, 2008/01/01 |
|---|
| 5 |
% For distribution and copyright, see pstricks.tex. |
|---|
| 6 |
% |
|---|
| 7 |
% |
|---|
| 8 |
systemdict /.setopacityalpha known not {/.setopacityalpha { pop } def } if |
|---|
| 9 |
systemdict /.setblendmode known not {/.setblendmode { pop } def } if |
|---|
| 10 |
systemdict /.setshapealpha known not {/.setshapealpha { pop } def } if |
|---|
| 11 |
% |
|---|
| 12 |
/tx@Dict 200 dict def tx@Dict begin |
|---|
| 13 |
/ADict 25 dict def |
|---|
| 14 |
/CM { matrix currentmatrix } bind def |
|---|
| 15 |
/SLW /setlinewidth load def |
|---|
| 16 |
/CLW /currentlinewidth load def |
|---|
| 17 |
/CP /currentpoint load def |
|---|
| 18 |
/ED { exch def } bind def |
|---|
| 19 |
/L /lineto load def |
|---|
| 20 |
/T /translate load def |
|---|
| 21 |
/TMatrix { } def |
|---|
| 22 |
/RAngle { 0 } def |
|---|
| 23 |
/Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def % return 0 for negative arguments |
|---|
| 24 |
/Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known |
|---|
| 25 |
/ATAN1 {neg -1 atan 180 sub } def % atan(x) (only one parameter) |
|---|
| 26 |
/Div { dup 0 eq { pop } { div } ifelse } def % control the division |
|---|
| 27 |
/tan { dup cos abs 1.e-10 lt |
|---|
| 28 |
{ pop 1.e10 } % return 1.e10 as infinit |
|---|
| 29 |
{ dup sin exch cos div } ifelse % default sin/cos |
|---|
| 30 |
} def |
|---|
| 31 |
/Tan { dup sin exch cos Div } def % sin(x)/cos(x) x in degrees |
|---|
| 32 |
/Acos {dup dup mul neg 1 add dup 0 lt { % arc cos, returns 0 when negative root |
|---|
| 33 |
pop pop 0 }{ sqrt exch atan} ifelse } def |
|---|
| 34 |
/NET { neg exch neg exch T } def % change coordinate system to the negative one |
|---|
| 35 |
/Pyth { dup mul exch dup mul add sqrt } def % Pythagoras, expects 2 parameter |
|---|
| 36 |
/Pyth2 { % Pythagoras, xA yA xB yB |
|---|
| 37 |
3 -1 roll % xA xB yB yA |
|---|
| 38 |
sub % xA xB yB-yA |
|---|
| 39 |
3 1 roll % yB-yA xA xB |
|---|
| 40 |
sub % yB-yA xA-xB |
|---|
| 41 |
Pyth } def |
|---|
| 42 |
/PtoC { 2 copy cos mul 3 1 roll sin mul } def % Polar to Cartesian |
|---|
| 43 |
%----------------- hv added 20050516 --------------- |
|---|
| 44 |
/PiDiv2 1.57079632680 def |
|---|
| 45 |
/Pi 3.14159265359 def |
|---|
| 46 |
/TwoPi 6.28318530718 def |
|---|
| 47 |
/Euler 2.71828182846 def |
|---|
| 48 |
%/e Euler bind def |
|---|
| 49 |
/RadtoDeg { 180 mul Pi div } bind def % convert from radian to degrees |
|---|
| 50 |
/DegtoRad { Pi mul 180 div } bind def % viceversa |
|---|
| 51 |
%----------------- hv end--------------------------- |
|---|
| 52 |
/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def |
|---|
| 53 |
/PathLength { flattenpath /z 0 def |
|---|
| 54 |
{ /y1 ED /x1 ED /y2 y1 def /x2 x1 def |
|---|
| 55 |
}{ /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ } |
|---|
| 56 |
/pathforall load stopped { pop pop pop pop } if z } def |
|---|
| 57 |
/STP { .996264 dup scale } def |
|---|
| 58 |
/STV { SDict begin normalscale end STP } def |
|---|
| 59 |
% |
|---|
| 60 |
%%-------------- DG begin patch 15 ---------------%% |
|---|
| 61 |
%/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def |
|---|
| 62 |
%PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y |
|---|
| 63 |
%mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul |
|---|
| 64 |
%/y ED x mul /x ED x 0 gt y 0 gt and { [ y x ] 1 a sub y mul } { [ 1 0 ] |
|---|
| 65 |
%0 } ifelse setdash stroke } def |
|---|
| 66 |
/DashLine { |
|---|
| 67 |
dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def PathLength } ifelse |
|---|
| 68 |
/b ED /x1 ED /y1 ED /x ED /y ED |
|---|
| 69 |
/z y x add y1 add x1 add def |
|---|
| 70 |
/Coef b a .5 sub 2 mul y mul sub z Div round |
|---|
| 71 |
z mul a .5 sub 2 mul y mul add b exch Div def |
|---|
| 72 |
/y y Coef mul def |
|---|
| 73 |
/x x Coef mul def |
|---|
| 74 |
/y1 y1 Coef mul def |
|---|
| 75 |
/x1 x1 Coef mul def |
|---|
| 76 |
x1 0 gt y1 0 gt or x 0 gt or y 0 gt and |
|---|
| 77 |
{ [ y x y1 x1 ] 1 a sub y mul } |
|---|
| 78 |
{ [ 1 0 ] 0 } ifelse |
|---|
| 79 |
setdash stroke |
|---|
| 80 |
} def |
|---|
| 81 |
%%-------------- DG end patch 15 ---------------%% |
|---|
| 82 |
/DotLine { |
|---|
| 83 |
/b PathLength def |
|---|
| 84 |
/a ED /z ED /y CLW def |
|---|
| 85 |
/z y z add def |
|---|
| 86 |
a 0 gt { |
|---|
| 87 |
/b b a div def |
|---|
| 88 |
}{ |
|---|
| 89 |
a 0 eq { |
|---|
| 90 |
/b b y sub def |
|---|
| 91 |
}{ a -3 eq { |
|---|
| 92 |
/b b y add def } if |
|---|
| 93 |
} ifelse |
|---|
| 94 |
} ifelse |
|---|
| 95 |
[ 0 b b z Div round Div dup 0 le { pop 1 } if ] |
|---|
| 96 |
a 0 gt { 0 }{ y 2 div a -2 gt { neg }if } ifelse |
|---|
| 97 |
setdash 1 setlinecap stroke |
|---|
| 98 |
} def |
|---|
| 99 |
% |
|---|
| 100 |
/LineFill { % hv ------------ patch 7 ------------- |
|---|
| 101 |
gsave |
|---|
| 102 |
abs /hatchWidthInc ED |
|---|
| 103 |
abs /hatchSepInc ED |
|---|
| 104 |
abs CLW add /a ED |
|---|
| 105 |
a 0 dtransform round exch round exch |
|---|
| 106 |
2 copy idtransform |
|---|
| 107 |
exch Atan rotate |
|---|
| 108 |
idtransform pop /a ED |
|---|
| 109 |
.25 .25 itransform pathbbox |
|---|
| 110 |
/y2 ED |
|---|
| 111 |
a Div ceiling cvi /x2 ED /y1 ED |
|---|
| 112 |
a Div cvi /x1 ED /y2 y2 y1 sub def |
|---|
| 113 |
clip |
|---|
| 114 |
newpath |
|---|
| 115 |
2 setlinecap |
|---|
| 116 |
systemdict |
|---|
| 117 |
/setstrokeadjust known { true setstrokeadjust } if |
|---|
| 118 |
x2 x1 sub 1 add { |
|---|
| 119 |
x1 a mul y1 moveto 0 y2 rlineto stroke |
|---|
| 120 |
/x1 x1 1 add |
|---|
| 121 |
hatchWidthInc 0 gt { CLW add } if |
|---|
| 122 |
def |
|---|
| 123 |
hatchSepInc 0 gt hatchWidthInc 0 gt or { |
|---|
| 124 |
/a a hatchSepInc add def |
|---|
| 125 |
CLW hatchWidthInc add SLW |
|---|
| 126 |
} if |
|---|
| 127 |
} repeat |
|---|
| 128 |
grestore |
|---|
| 129 |
pop pop } def |
|---|
| 130 |
% |
|---|
| 131 |
%gsave abs CLW add /a ED a 0 dtransform round exch round exch |
|---|
| 132 |
%2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25 |
|---|
| 133 |
%% DG/SR modification begin - Dec. 12, 1997 - Patch 2 |
|---|
| 134 |
%%itransform translate pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a |
|---|
| 135 |
%itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a |
|---|
| 136 |
%% DG/SR modification end |
|---|
| 137 |
%Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict |
|---|
| 138 |
%/setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1 |
|---|
| 139 |
%% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) |
|---|
| 140 |
%% a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore } |
|---|
| 141 |
%% def |
|---|
| 142 |
%a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore |
|---|
| 143 |
%pop pop } def |
|---|
| 144 |
%% DG/SR modification end |
|---|
| 145 |
% |
|---|
| 146 |
/BeginArrow { ADict begin |
|---|
| 147 |
/@mtrx CM def |
|---|
| 148 |
gsave |
|---|
| 149 |
2 copy T |
|---|
| 150 |
2 index sub neg exch |
|---|
| 151 |
3 index sub exch Atan |
|---|
| 152 |
rotate newpath |
|---|
| 153 |
} def |
|---|
| 154 |
% |
|---|
| 155 |
/EndArrow { @mtrx setmatrix CP grestore end } def |
|---|
| 156 |
% |
|---|
| 157 |
/Arrow { |
|---|
| 158 |
CLW mul add dup |
|---|
| 159 |
2 div /w ED |
|---|
| 160 |
mul dup /h ED |
|---|
| 161 |
mul /a ED |
|---|
| 162 |
{ 0 h T 1 -1 scale } if |
|---|
| 163 |
w neg h moveto |
|---|
| 164 |
0 0 L w h L w neg a neg rlineto |
|---|
| 165 |
gsave fill grestore |
|---|
| 166 |
} def |
|---|
| 167 |
% |
|---|
| 168 |
/ArrowD { % the sides are drawn as curves (hv 20071211) |
|---|
| 169 |
CLW mul add dup |
|---|
| 170 |
2 div /w ED |
|---|
| 171 |
mul dup /h ED |
|---|
| 172 |
mul /Inset ED |
|---|
| 173 |
{ 0 h T 1 -1 scale } if % changes the direction |
|---|
| 174 |
% we use y=w/h^2 * x^2 as equation for the control points |
|---|
| 175 |
% for the coordinates the arrow is seen from top to bottom |
|---|
| 176 |
% the bottom (tip) is (0;0) |
|---|
| 177 |
w neg h moveto % lower left of > |
|---|
| 178 |
w 9 div 4 mul neg h 3 div 2 mul |
|---|
| 179 |
w 9 div neg h 3 div |
|---|
| 180 |
0 0 curveto % tip of > |
|---|
| 181 |
w 9 div h 3 div |
|---|
| 182 |
w 9 div 4 mul h 3 div 2 mul |
|---|
| 183 |
w h curveto % upper left of > |
|---|
| 184 |
w neg Inset neg rlineto % move to x=0 and inset |
|---|
| 185 |
gsave fill grestore |
|---|
| 186 |
} def |
|---|
| 187 |
% |
|---|
| 188 |
/Tbar { |
|---|
| 189 |
CLW mul add /z ED |
|---|
| 190 |
z -2 div CLW 2 div moveto |
|---|
| 191 |
z 0 rlineto stroke |
|---|
| 192 |
0 CLW moveto |
|---|
| 193 |
} def |
|---|
| 194 |
% |
|---|
| 195 |
/Bracket { |
|---|
| 196 |
CLW mul add dup CLW sub 2 div |
|---|
| 197 |
/x ED mul CLW add /y ED /z CLW 2 div def |
|---|
| 198 |
x neg y moveto |
|---|
| 199 |
x neg CLW 2 div L x CLW 2 div L x y L stroke |
|---|
| 200 |
0 CLW moveto |
|---|
| 201 |
} def |
|---|
| 202 |
% |
|---|
| 203 |
/RoundBracket { |
|---|
| 204 |
CLW mul add dup 2 div |
|---|
| 205 |
/x ED mul /y ED /mtrx CM def |
|---|
| 206 |
0 CLW 2 div T x y mul 0 ne { x y scale } if |
|---|
| 207 |
1 1 moveto |
|---|
| 208 |
.85 .5 .35 0 0 0 curveto |
|---|
| 209 |
-.35 0 -.85 .5 -1 1 curveto |
|---|
| 210 |
mtrx setmatrix stroke 0 CLW moveto |
|---|
| 211 |
} def |
|---|
| 212 |
% |
|---|
| 213 |
/SD { 0 360 arc fill } def |
|---|
| 214 |
% |
|---|
| 215 |
/EndDot { % DS is the dot size |
|---|
| 216 |
{ /z DS def } { /z 0 def } ifelse |
|---|
| 217 |
/b ED 0 z DS SD b { 0 z DS CLW sub SD } if |
|---|
| 218 |
0 DS z add CLW 4 div sub moveto } def |
|---|
| 219 |
% |
|---|
| 220 |
/Shadow { [ { /moveto load } { /lineto load } { /curveto load } { |
|---|
| 221 |
/closepath load } /pathforall load stopped { pop pop pop pop CP /moveto |
|---|
| 222 |
load } if ] cvx newpath 3 1 roll T exec } def |
|---|
| 223 |
% |
|---|
| 224 |
%/NArray { |
|---|
| 225 |
% aload length 2 div dup dup cvi eq not { exch pop } if /n exch |
|---|
| 226 |
% cvi def |
|---|
| 227 |
%} def |
|---|
| 228 |
% |
|---|
| 229 |
/NArray { % holds the coordinates and on top of stack the showpoints boolean |
|---|
| 230 |
/showpoints ED |
|---|
| 231 |
counttomark 2 div dup cvi /n ED |
|---|
| 232 |
n eq not { exch pop } if |
|---|
| 233 |
showpoints { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse |
|---|
| 234 |
} def |
|---|
| 235 |
/Line { |
|---|
| 236 |
NArray n 0 eq not |
|---|
| 237 |
{ n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def |
|---|
| 238 |
n { Lineto } repeat |
|---|
| 239 |
CP 4 2 roll ArrowB L pop pop |
|---|
| 240 |
} if |
|---|
| 241 |
} def |
|---|
| 242 |
/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 } |
|---|
| 243 |
ifelse { pop } repeat a } def |
|---|
| 244 |
/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq |
|---|
| 245 |
and { pop pop /n n 1 sub def } if } def |
|---|
| 246 |
/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop } |
|---|
| 247 |
repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1 |
|---|
| 248 |
ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1 |
|---|
| 249 |
moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto |
|---|
| 250 |
Lineto pop pop closepath } ifelse } def |
|---|
| 251 |
/Diamond { |
|---|
| 252 |
/mtrx CM def |
|---|
| 253 |
T rotate |
|---|
| 254 |
/h ED |
|---|
| 255 |
/w ED |
|---|
| 256 |
dup 0 eq { pop } { CLW mul neg |
|---|
| 257 |
/d ED |
|---|
| 258 |
/a w h Atan def |
|---|
| 259 |
/h d a sin Div h add def |
|---|
| 260 |
/w d a cos Div w add def } ifelse |
|---|
| 261 |
mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 div |
|---|
| 262 |
/ArrowA { moveto } def |
|---|
| 263 |
/ArrowB { } def |
|---|
| 264 |
false Line |
|---|
| 265 |
closepath mtrx setmatrix } def |
|---|
| 266 |
% DG modification begin - Jan. 15, 1997 |
|---|
| 267 |
%/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup 0 eq { |
|---|
| 268 |
%pop } { CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2 |
|---|
| 269 |
%div dup cos exch sin Div mul sub def } ifelse mark 0 d w neg d 0 h w d 0 |
|---|
| 270 |
%d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx |
|---|
| 271 |
%setmatrix } def |
|---|
| 272 |
/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup |
|---|
| 273 |
CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2 |
|---|
| 274 |
div dup cos exch sin Div mul sub def mark 0 d w neg d 0 h w d 0 |
|---|
| 275 |
d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx |
|---|
| 276 |
% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) |
|---|
| 277 |
% setmatrix } def |
|---|
| 278 |
setmatrix pop } def |
|---|
| 279 |
% DG/SR modification end |
|---|
| 280 |
/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth |
|---|
| 281 |
def } def |
|---|
| 282 |
/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth |
|---|
| 283 |
def } def |
|---|
| 284 |
/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1 |
|---|
| 285 |
def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp |
|---|
| 286 |
mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos |
|---|
| 287 |
abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def |
|---|
| 288 |
/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul |
|---|
| 289 |
m mul neg def } def |
|---|
| 290 |
/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } |
|---|
| 291 |
ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def } |
|---|
| 292 |
def |
|---|
| 293 |
/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def |
|---|
| 294 |
/NC { CC x1 y1 x2 y2 x y curveto } def |
|---|
| 295 |
/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def |
|---|
| 296 |
/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def |
|---|
| 297 |
/NAC { x2 y2 x y curveto CC x1 y1 } def |
|---|
| 298 |
/EAC { x2 y2 x y ArrowB curveto pop pop } def |
|---|
| 299 |
/OpenCurve { |
|---|
| 300 |
NArray n 3 lt |
|---|
| 301 |
{ n { pop pop } repeat } |
|---|
| 302 |
{ BOC /n n 3 sub def n { NC } repeat EOC } ifelse |
|---|
| 303 |
} def |
|---|
| 304 |
/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload |
|---|
| 305 |
/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop |
|---|
| 306 |
pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def |
|---|
| 307 |
/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt { |
|---|
| 308 |
CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC } |
|---|
| 309 |
repeat closepath pop pop } ifelse } def |
|---|
| 310 |
/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def |
|---|
| 311 |
/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def |
|---|
| 312 |
/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore } |
|---|
| 313 |
def |
|---|
| 314 |
/FontDot { DS 2 mul dup matrix scale matrix concatmatrix exch matrix |
|---|
| 315 |
rotate matrix concatmatrix exch findfont exch makefont setfont } def |
|---|
| 316 |
/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto |
|---|
| 317 |
x1 y1 lineto closepath } def |
|---|
| 318 |
/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1 |
|---|
| 319 |
y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div |
|---|
| 320 |
exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse |
|---|
| 321 |
/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto |
|---|
| 322 |
x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath } |
|---|
| 323 |
ifelse } def |
|---|
| 324 |
/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add |
|---|
| 325 |
/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq { |
|---|
| 326 |
pop pop Rect } { OvalFrame } ifelse } def |
|---|
| 327 |
/BezierNArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop |
|---|
| 328 |
} if n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat f { ] |
|---|
| 329 |
aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def |
|---|
| 330 |
/OpenBezier { BezierNArray n 1 eq { pop pop } { ArrowA n 4 sub 3 idiv { 6 |
|---|
| 331 |
2 roll 4 2 roll curveto } repeat 6 2 roll 4 2 roll ArrowB curveto } |
|---|
| 332 |
ifelse } def |
|---|
| 333 |
/ClosedBezier { BezierNArray n 1 eq { pop pop } { moveto n 1 sub 3 idiv { |
|---|
| 334 |
6 2 roll 4 2 roll curveto } repeat closepath } ifelse } def |
|---|
| 335 |
/BezierShowPoints { gsave Points aload length 2 div cvi /n ED moveto n 1 |
|---|
| 336 |
sub { lineto } repeat CLW 2 div SLW [ 4 4 ] 0 setdash stroke grestore } |
|---|
| 337 |
def |
|---|
| 338 |
/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1 |
|---|
| 339 |
sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA |
|---|
| 340 |
x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0 |
|---|
| 341 |
y0 x0 2 mul x1 sub y1 ] def } def |
|---|
| 342 |
% |
|---|
| 343 |
/Grid { |
|---|
| 344 |
newpath |
|---|
| 345 |
/a 4 string def |
|---|
| 346 |
/b ED /c ED /n ED |
|---|
| 347 |
cvi dup 1 lt { pop 1 } if |
|---|
| 348 |
/s ED |
|---|
| 349 |
s div dup 0 eq { pop 1 } if |
|---|
| 350 |
/dy ED s div dup 0 eq { pop 1 } if |
|---|
| 351 |
/dx ED dy div round dy mul |
|---|
| 352 |
/y0 ED dx div round dx mul |
|---|
| 353 |
/x0 ED dy div round cvi |
|---|
| 354 |
/y2 ED dx div round cvi |
|---|
| 355 |
/x2 ED dy div round cvi |
|---|
| 356 |
/y1 ED dx div round cvi |
|---|
| 357 |
/x1 ED |
|---|
| 358 |
/h y2 y1 sub 0 gt { 1 } { -1 } ifelse def |
|---|
| 359 |
/w x2 x1 sub 0 gt { 1 } { -1 } ifelse def |
|---|
| 360 |
b 0 gt { |
|---|
| 361 |
/z1 b 4 div CLW 2 div add def |
|---|
| 362 |
% /Helvetica findfont b scalefont setfont |
|---|
| 363 |
/b b .95 mul CLW 2 div add def } if |
|---|
| 364 |
systemdict /setstrokeadjust known |
|---|
| 365 |
{ true setstrokeadjust /t { } def } |
|---|
| 366 |
{ /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add |
|---|
| 367 |
exch itransform } bind def } ifelse |
|---|
| 368 |
gsave n 0 gt { 1 setlinecap [ 0 dy n div ] dy n div 2 div setdash } { 2 setlinecap } ifelse |
|---|
| 369 |
/i x1 def |
|---|
| 370 |
/f y1 dy mul n 0 gt { dy n div 2 div h mul sub } if def |
|---|
| 371 |
/g y2 dy mul n 0 gt { dy n div 2 div h mul add } if def |
|---|
| 372 |
x2 x1 sub w mul 1 add dup 1000 gt { pop 1000 } if |
|---|
| 373 |
{ i dx mul dup y0 moveto |
|---|
| 374 |
b 0 gt |
|---|
| 375 |
{ gsave c i a cvs dup stringwidth pop |
|---|
| 376 |
/z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse |
|---|
| 377 |
h 0 gt {b neg}{z1} ifelse |
|---|
| 378 |
rmoveto show grestore } if |
|---|
| 379 |
dup t f moveto |
|---|
| 380 |
g t L stroke |
|---|
| 381 |
/i i w add def |
|---|
| 382 |
} repeat |
|---|
| 383 |
grestore |
|---|
| 384 |
gsave |
|---|
| 385 |
n 0 gt |
|---|
| 386 |
% DG/SR modification begin - Nov. 7, 1997 - Patch 1 |
|---|
| 387 |
%{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash } |
|---|
| 388 |
{ 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash } |
|---|
| 389 |
% DG/SR modification end |
|---|
| 390 |
{ 2 setlinecap } ifelse |
|---|
| 391 |
/i y1 def |
|---|
| 392 |
/f x1 dx mul n 0 gt { dx n div 2 div w mul sub } if def |
|---|
| 393 |
/g x2 dx mul n 0 gt { dx n div 2 div w mul add } if def |
|---|
| 394 |
y2 y1 sub h mul 1 add dup 1000 gt { pop 1000 } if |
|---|
| 395 |
{ newpath i dy mul dup x0 exch moveto |
|---|
| 396 |
b 0 gt { gsave c i a cvs dup stringwidth pop |
|---|
| 397 |
/z2 ED |
|---|
| 398 |
w 0 gt {z1 z2 add neg} {z1} ifelse |
|---|
| 399 |
h 0 gt {z1} {b neg} ifelse |
|---|
| 400 |
rmoveto show grestore } if |
|---|
| 401 |
dup f exch t moveto |
|---|
| 402 |
g exch t L stroke |
|---|
| 403 |
/i i h add def |
|---|
| 404 |
} repeat |
|---|
| 405 |
grestore |
|---|
| 406 |
} def |
|---|
| 407 |
% |
|---|
| 408 |
/ArcArrow { |
|---|
| 409 |
/d ED /b ED /a ED |
|---|
| 410 |
gsave |
|---|
| 411 |
newpath 0 -1000 moveto clip |
|---|
| 412 |
newpath |
|---|
| 413 |
0 1 0 0 b |
|---|
| 414 |
grestore |
|---|
| 415 |
c mul |
|---|
| 416 |
/e ED |
|---|
| 417 |
pop pop pop r a e d PtoC y add exch x add |
|---|
| 418 |
exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c |
|---|
| 419 |
mul neg d |
|---|
| 420 |
} def |
|---|
| 421 |
% |
|---|
| 422 |
/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def |
|---|
| 423 |
% |
|---|
| 424 |
/ArcAdjust { %%%% Vincent Guirardel |
|---|
| 425 |
% given a target length (targetLength) and an initial angle (angle0) [in the stack], |
|---|
| 426 |
% let M(angle0)=(rx*cos(angle0),ry*sin(angle0))=(x0,y0). |
|---|
| 427 |
% This computes an angle t such that (x0,y0) is at distance |
|---|
| 428 |
% targetLength from the point M(t)=(rx*cos(t),ry*sin(t)). |
|---|
| 429 |
% NOTE: this an absolute angle, it does not have to be added or substracted to angle0 |
|---|
| 430 |
% contrary to TvZ's code. |
|---|
| 431 |
% To achieve, this, one iterates the following process: start with some angle t, |
|---|
| 432 |
% compute the point M' at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]. |
|---|
| 433 |
% Now take t' (= new angle) so that (0,0) M(t') and M' are aligned. |
|---|
| 434 |
% |
|---|
| 435 |
% Another difference with TvZ's code is that we need d (=add/sub) to be defined. |
|---|
| 436 |
% the value of d = add/sub is used to know on which side we have to move. |
|---|
| 437 |
% It is only used in the initialisation of the angle before the iteration. |
|---|
| 438 |
% |
|---|
| 439 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|---|
| 440 |
% Input stack: 1: target length 2: initial angle |
|---|
| 441 |
% variables used : rx, ry, d (=add/sub) |
|---|
| 442 |
% |
|---|
| 443 |
/targetLength ED /angle0 ED |
|---|
| 444 |
/x0 rx angle0 cos mul def |
|---|
| 445 |
/y0 ry angle0 sin mul def |
|---|
| 446 |
% we are looking for an angle t such that (x0,y0) is at distance targetLength |
|---|
| 447 |
% from the point M(t)=(rx*cos(t),ry*sin(t))) |
|---|
| 448 |
%initialisation of angle (using 1st order approx = TvZ's code) |
|---|
| 449 |
targetLength 57.2958 mul |
|---|
| 450 |
angle0 sin rx mul dup mul |
|---|
| 451 |
angle0 cos ry mul dup mul |
|---|
| 452 |
add sqrt div |
|---|
| 453 |
% if initialisation angle is two large (more than 90 degrees) set it to 90 degrees |
|---|
| 454 |
% (if the ellipse is very curved at the point where we draw the arrow, % |
|---|
| 455 |
% the value can be much more than 360 degrees !) |
|---|
| 456 |
% this should avoid going on the wrong side (more than 180 degrees) or go near |
|---|
| 457 |
% a bad attractive point (at 180 degrees) |
|---|
| 458 |
dup 90 ge { pop 90 } if |
|---|
| 459 |
angle0 exch d % add or sub |
|---|
| 460 |
% maximum number of times to iterate the iterative procedure: |
|---|
| 461 |
% iterative procedure: takes an angle t on top of stack, computes a |
|---|
| 462 |
% better angle (and put it on top of stack) |
|---|
| 463 |
30 { dup |
|---|
| 464 |
% compute distance D between (x0,y0) and M(t) |
|---|
| 465 |
dup cos rx mul x0 sub dup mul exch sin ry mul y0 sub dup mul add sqrt |
|---|
| 466 |
% if D almost equals targetLength, we stop |
|---|
| 467 |
dup targetLength sub abs 1e-5 le { pop exit } if |
|---|
| 468 |
% stack now contains D t |
|---|
| 469 |
% compute the point M(t') at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]: |
|---|
| 470 |
% M(t')= ( (x(t)-x0)*targetLength/d+x0 , (y(t)-y0)*targetLength/d+y0 ) |
|---|
| 471 |
exch dup cos rx mul x0 sub exch sin ry mul y0 sub |
|---|
| 472 |
% stack contains: y(t)-y0, x(t)-x0, d |
|---|
| 473 |
2 index Div targetLength mul y0 add ry Div exch |
|---|
| 474 |
2 index Div targetLength mul x0 add rx Div |
|---|
| 475 |
% stack contains x(t')/rx , y(t')/ry , d |
|---|
| 476 |
% now compute t', and remove D from stack |
|---|
| 477 |
atan exch pop |
|---|
| 478 |
} repeat |
|---|
| 479 |
% we don't look at what happened... in particular, if targetLength is greater |
|---|
| 480 |
% than the diameter of the ellipse... |
|---|
| 481 |
% the final angle will be around /angle0 + 180. maybe we should treat this pathological case... |
|---|
| 482 |
% after iteration, stack contains an angle t such that M(t) is the tail of the arrow |
|---|
| 483 |
% to give back the result as a an angle relative to angle0 we could add the following line: |
|---|
| 484 |
% angle0 sub 0 exch d |
|---|
| 485 |
% |
|---|
| 486 |
% begin bug fix 2006-01-11 |
|---|
| 487 |
% we want to adjust the new angle t' by a multiple of 360 so that | t'-angle0 | <= 180 |
|---|
| 488 |
%(we don't want to make the ellipse turn more or less than it should)... |
|---|
| 489 |
dup angle0 sub dup abs 180 gt { 180 add 360 div floor 360 mul sub } { pop } ifelse |
|---|
| 490 |
% end bug fix |
|---|
| 491 |
} def |
|---|
| 492 |
% |
|---|
| 493 |
/EllipticArcArrow { |
|---|
| 494 |
/d ED % is add or sub |
|---|
| 495 |
/b ED % arrow procedure |
|---|
| 496 |
/a1 ED % angle |
|---|
| 497 |
gsave |
|---|
| 498 |
newpath |
|---|
| 499 |
0 -1000 moveto |
|---|
| 500 |
clip % Set clippath far from arrow. |
|---|
| 501 |
newpath |
|---|
| 502 |
0 1 0 0 b % Draw arrow to determine length. |
|---|
| 503 |
grestore |
|---|
| 504 |
% Length of arrow is on top of stack. Next 3 numbers are junk. |
|---|
| 505 |
% |
|---|
| 506 |
a1 exch ArcAdjust % Angular position of base of arrow. |
|---|
| 507 |
/a2 ED |
|---|
| 508 |
pop pop pop |
|---|
| 509 |
a2 cos rx mul xOrig add % hv 2007-08-29 x->xOrig |
|---|
| 510 |
a2 sin ry mul yOrig add % hv 2007-08-29 y->yOrig |
|---|
| 511 |
a1 cos rx mul xOrig add % |
|---|
| 512 |
a1 sin ry mul yOrig add % |
|---|
| 513 |
% Now arrow tip coor and base coor are on stack. |
|---|
| 514 |
b pop pop pop pop % Draw arrow, and discard coordinates. |
|---|
| 515 |
a2 CLW 8 div |
|---|
| 516 |
% change value of d (test it by looking if `` 1 1 d '' gives 2 or not ) |
|---|
| 517 |
1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse |
|---|
| 518 |
ArcAdjust |
|---|
| 519 |
% resets original value of d |
|---|
| 520 |
1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse % Adjust angle to give overlap. |
|---|
| 521 |
} def |
|---|
| 522 |
%%------------------ tvz/DG/hv (2004-05-10) end -------------------%% |
|---|
| 523 |
% |
|---|
| 524 |
/Rot { CP CP translate 3 -1 roll neg rotate NET } def |
|---|
| 525 |
% |
|---|
| 526 |
/RotBegin { |
|---|
| 527 |
tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if |
|---|
| 528 |
/TMatrix [ TMatrix CM ] cvx def |
|---|
| 529 |
/a ED |
|---|
| 530 |
a Rot /RAngle [ RAngle dup a add ] cvx def |
|---|
| 531 |
} def |
|---|
| 532 |
% |
|---|
| 533 |
/RotEnd { /TMatrix [ TMatrix setmatrix ] cvx def /RAngle [ RAngle pop ] cvx def } def |
|---|
| 534 |
% |
|---|
| 535 |
/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def |
|---|
| 536 |
/PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def |
|---|
| 537 |
/PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def |
|---|
| 538 |
/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s |
|---|
| 539 |
abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b |
|---|
| 540 |
div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } { |
|---|
| 541 |
h1 abs h sub dup s mul abs } ifelse } def |
|---|
| 542 |
/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s |
|---|
| 543 |
mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q |
|---|
| 544 |
{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add |
|---|
| 545 |
exch } def |
|---|
| 546 |
/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { Visible |
|---|
| 547 |
/IfVisible true def } if } { IfVisible { Invisible /IfVisible false def |
|---|
| 548 |
} if } ifelse } def |
|---|
| 549 |
/InitOL { /OLUnit [ 3000 3000 matrix defaultmatrix dtransform ] cvx def |
|---|
| 550 |
/Visible { CP OLUnit idtransform T moveto } def /Invisible { CP OLUnit |
|---|
| 551 |
neg exch neg exch idtransform T moveto } def /BOL { BeginOL } def |
|---|
| 552 |
/IfVisible true def } def |
|---|
| 553 |
end |
|---|
| 554 |
%-----------------------------------------------------------------------------% |
|---|
| 555 |
|
|---|
| 556 |
% END pstricks.pro |
|---|