Initialisation du projet pst-solides3d.git (SVN revision 142)
[pst-solides3d.git] / tests / .svn / text-base / test_08.ps.svn-base
1 %!PS-Adobe-2.0
2 %%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software
3 %%Title: test_08.dvi
4 %%CreationDate: Sun Mar 23 09:54:17 2008
5 %%Pages: 2
6 %%PageOrder: Ascend
7 %%BoundingBox: 0 0 596 842
8 %%DocumentPaperSizes: a4
9 %%EndComments
10 %DVIPSWebPage: (www.radicaleye.com)
11 %DVIPSCommandLine: dvips test_08
12 %DVIPSParameters: dpi=600
13 %DVIPSSource:  TeX output 2008.03.23:0954
14 %%BeginProcSet: tex.pro 0 0
15 %!
16 /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
17 N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
18 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
19 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
20 landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
21 mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
22 matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
23 exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
24 statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
25 N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
26 /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
27 /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
28 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
29 df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
30 definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
31 }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
32 B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
33 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
34 /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
35 setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
36 restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
37 /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
38 }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
39 bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
40 mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
41 SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
42 userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
43 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
44 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
45 /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
46 /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
47 (LaserWriter 16/600)]{A length product length le{A length product exch 0
48 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
49 end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
50 grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
51 imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
52 exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
53 fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
54 delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
55 B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
56 p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
57 rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
58
59 %%EndProcSet
60 %%BeginProcSet: pstricks.pro 0 0
61 %!
62 % PostScript prologue for pstricks.tex.
63 % Version 1.02, 2007/09/13
64 % For distribution and copyright, see pstricks.tex.
65 %
66 /tx@Dict 200 dict def tx@Dict begin
67 /ADict 25 dict def
68 /CM { matrix currentmatrix } bind def
69 /SLW /setlinewidth load def
70 /CLW /currentlinewidth load def
71 /CP /currentpoint load def
72 /ED { exch def } bind def
73 /L /lineto load def
74 /T /translate load def
75 /TMatrix { } def
76 /RAngle { 0 } def
77 /Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def  % return 0 for negative arguments 
78 /Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known
79 /ATAN1 {neg -1 atan 180 sub } def       % atan(x) (only one parameter)
80 /Div { dup 0 eq { pop } { div } ifelse } def    % control the division
81 /Tan { dup sin exch cos Div } def       % sin(x)/cos(x) x in degrees
82 /NET { neg exch neg exch T } def            % change coordinate system to the negative one      
83 /Pyth { dup mul exch dup mul add sqrt } def     % Pythagoras, expects 2 parameter
84 /Pyth2 {                    % Pythagoras, xA yA xB yB
85   3 -1 roll         % xA xB yB yA
86   sub           % xA xB yB-yA
87   3 1 roll      % yB-yA xA xB
88   sub           % yB-yA xA-xB
89   Pyth } def
90 /PtoC { 2 copy cos mul 3 1 roll sin mul } def   % Polar to Cartesian
91 %----------------- hv added 20050516 ---------------
92 /Pi 3.14159265359 def 
93 /TwoPi 6.28318530718 def
94 /Euler 2.71828182846 def 
95 /RadtoDeg { 180 mul Pi div } bind def % convert from radian to degrees
96 /DegtoRad { Pi mul 180 div } bind def % viceversa
97 %----------------- hv end---------------------------
98 /PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def
99 /PathLength { flattenpath /z 0 def 
100   { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
101   }{ /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
102   /pathforall load stopped { pop pop pop pop } if z } def
103 /STP { .996264 dup scale } def
104 /STV { SDict begin normalscale end STP  } def
105 %
106 %%-------------- DG begin patch 15 ---------------%%
107 %/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
108 %PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
109 %mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
110 %/y ED x mul /x ED x 0 gt y 0 gt and { [ y x ] 1 a sub y mul } { [ 1 0 ]
111 %0 } ifelse setdash stroke } def
112 /DashLine {
113   dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def PathLength } ifelse
114   /b ED /x1 ED /y1 ED /x ED /y ED 
115   /z y x add y1 add x1 add def
116   /Coef b a .5 sub 2 mul y mul sub z Div round 
117     z mul a .5 sub 2 mul y mul add b exch Div def 
118   /y y Coef mul def 
119   /x x Coef mul def 
120   /y1 y1 Coef mul def 
121   /x1 x1 Coef mul def
122   x1 0 gt y1 0 gt or x 0 gt or y 0 gt and 
123     { [ y x y1 x1 ] 1 a sub y mul }
124     { [ 1 0 ] 0 } ifelse 
125   setdash stroke
126 } def
127 %%-------------- DG end patch 15 ---------------%%
128 /DotLine { 
129   /b PathLength def 
130   /a ED /z ED /y CLW def 
131   /z y z add def 
132   a 0 gt { 
133     /b b a div def 
134   }{ 
135     a 0 eq { 
136       /b b y sub def 
137     }{ a -3 eq { 
138       /b b y add def } if 
139     } ifelse 
140   } ifelse 
141   [ 0 b b z Div round Div dup 0 le { pop 1 } if ] 
142   a 0 gt { 0 }{ y 2 div a -2 gt { neg }if } ifelse 
143   setdash 1 setlinecap stroke 
144 } def
145 %
146 /LineFill { % hv ------------ patch 7 -------------
147   gsave 
148   abs /hatchWidthInc ED
149   abs /hatchSepInc ED
150   abs CLW add /a ED 
151   a 0 dtransform round exch round exch
152   2 copy idtransform 
153   exch Atan rotate 
154   idtransform pop /a ED 
155   .25 .25 itransform pathbbox 
156   /y2 ED 
157   a Div ceiling cvi /x2 ED /y1 ED 
158   a Div cvi /x1 ED /y2 y2 y1 sub def 
159   clip 
160   newpath 
161   2 setlinecap 
162   systemdict
163   /setstrokeadjust known { true setstrokeadjust } if 
164   x2 x1 sub 1 add { 
165     x1 a mul y1 moveto 0 y2 rlineto stroke 
166     /x1 x1 1 add 
167       hatchWidthInc 0 gt { CLW add } if 
168     def 
169     hatchSepInc 0 gt hatchWidthInc 0 gt or { 
170       /a a hatchSepInc add def
171       CLW hatchWidthInc add SLW 
172     } if
173   } repeat 
174   grestore 
175   pop pop } def
176 %
177 %gsave abs CLW add /a ED a 0 dtransform round exch round exch
178 %2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25
179 %% DG/SR modification begin - Dec. 12, 1997 - Patch 2
180 %%itransform translate pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a
181 %itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a
182 %% DG/SR modification end
183 %Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict
184 %/setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1
185 %% DG/SR modification begin - Jun.  1, 1998 - Patch 3 (from Michael Vulis)
186 %% a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore }
187 %% def
188 %a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore
189 %pop pop } def
190 %% DG/SR modification end
191 %
192 /BeginArrow { ADict begin 
193   /@mtrx CM def 
194   gsave 
195   2 copy T 
196   2 index sub neg exch 
197   3 index sub exch Atan 
198   rotate newpath 
199 } def
200 %
201 /EndArrow { @mtrx setmatrix CP grestore end } def
202 %
203 /Arrow { 
204   CLW mul add dup 
205   2 div /w ED 
206   mul dup /h ED 
207   mul /a ED 
208   { 0 h T 1 -1 scale } if 
209   w neg h moveto 
210   0 0 L w h L w neg a neg rlineto 
211   gsave fill grestore 
212 } def
213 %
214 /Tbar { 
215   CLW mul add /z ED 
216   z -2 div CLW 2 div moveto 
217   z 0 rlineto stroke 
218   0 CLW moveto 
219 } def
220 %
221 /Bracket { 
222   CLW mul add dup CLW sub 2 div 
223   /x ED mul CLW add /y ED /z CLW 2 div def 
224   x neg y moveto 
225   x neg CLW 2 div L x CLW 2 div L x y L stroke 
226   0 CLW moveto 
227 } def
228 %
229 /RoundBracket { 
230   CLW mul add dup 2 div 
231   /x ED mul /y ED /mtrx CM def 
232   0 CLW 2 div T x y mul 0 ne { x y scale } if 
233   1 1 moveto 
234   .85 .5 .35 0 0 0 curveto 
235   -.35 0 -.85 .5 -1 1 curveto 
236   mtrx setmatrix stroke 0 CLW moveto 
237 } def
238 %
239 /SD { 0 360 arc fill } def
240 %
241 /EndDot { % DS is the dot size 
242   { /z DS def } { /z 0 def } ifelse 
243   /b ED 0 z DS SD b { 0 z DS CLW sub SD } if 
244   0 DS z add CLW 4 div sub moveto } def
245 %
246 /Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
247   /closepath load } /pathforall load stopped { pop pop pop pop CP /moveto
248   load } if ] cvx newpath 3 1 roll T exec } def
249 %
250 /NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
251 cvi def } def
252 /NArray { % holds the coordinates and on top of stack the showpoints boolean
253   /f ED 
254   counttomark 2 div dup cvi /n ED 
255   n eq not { exch pop } if
256   f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse 
257 } def
258 /Line { 
259   NArray n 0 eq not 
260     { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def 
261       n { Lineto } repeat 
262       CP 4 2 roll ArrowB L pop pop 
263     } if 
264 } def
265 /Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
266   ifelse { pop } repeat a } def
267 /CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
268   and { pop pop /n n 1 sub def } if } def
269 /Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
270   repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
271   ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
272   moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
273   Lineto pop pop closepath } ifelse } def
274 /Diamond { 
275   /mtrx CM def 
276   T rotate 
277   /h ED 
278   /w ED 
279   dup 0 eq { pop } { CLW mul neg 
280     /d ED 
281     /a w h Atan def 
282     /h d a sin Div h add def 
283     /w d a cos Div w add def } ifelse 
284   mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 div 
285   /ArrowA { moveto } def 
286   /ArrowB { } def 
287   false Line 
288   closepath mtrx setmatrix } def
289 % DG modification begin - Jan. 15, 1997
290 %/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup 0 eq {
291 %pop } { CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2
292 %div dup cos exch sin Div mul sub def } ifelse mark 0 d w neg d 0 h w d 0
293 %d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx
294 %setmatrix } def
295 /Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup
296 CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2
297 div dup cos exch sin Div mul sub def mark 0 d w neg d 0 h w d 0
298 d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx
299 % DG/SR modification begin - Jun.  1, 1998 - Patch 3 (from Michael Vulis)
300 % setmatrix } def
301 setmatrix pop } def
302 % DG/SR modification end
303 /CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
304 def } def
305 /CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
306 def } def
307 /CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
308 def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
309 mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
310 abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
311 /y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
312 m mul neg def } def
313 /IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
314 ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
315 def
316 /BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
317 /NC { CC x1 y1 x2 y2 x y curveto } def
318 /EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
319 /BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
320 /NAC { x2 y2 x y curveto CC x1 y1 } def
321 /EAC { x2 y2 x y ArrowB curveto pop pop } def
322 /OpenCurve { 
323   NArray n 3 lt 
324     { n { pop pop } repeat } 
325     { BOC /n n 3 sub def n { NC } repeat EOC } ifelse 
326 } def
327 /AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
328 /Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
329 pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
330 /ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
331 CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
332 repeat closepath pop pop } ifelse } def
333 /SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
334 /ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
335 /SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
336 def
337 /FontDot { DS 2 mul dup matrix scale matrix concatmatrix exch matrix
338 rotate matrix concatmatrix exch findfont exch makefont setfont } def
339 /Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
340 x1 y1 lineto closepath } def
341 /OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
342 y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
343 exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
344 /b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
345 x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
346 ifelse } def
347 /Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
348 /y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
349 pop pop Rect } { OvalFrame } ifelse } def
350 /BezierNArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop
351 } if n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat f { ]
352 aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
353 /OpenBezier { BezierNArray n 1 eq { pop pop } { ArrowA n 4 sub 3 idiv { 6
354 2 roll 4 2 roll curveto } repeat 6 2 roll 4 2 roll ArrowB curveto }
355 ifelse } def
356 /ClosedBezier { BezierNArray n 1 eq { pop pop } { moveto n 1 sub 3 idiv {
357 6 2 roll 4 2 roll curveto } repeat closepath } ifelse } def
358 /BezierShowPoints { gsave Points aload length 2 div cvi /n ED moveto n 1
359 sub { lineto } repeat CLW 2 div SLW [ 4 4 ] 0 setdash stroke grestore }
360 def
361 /Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
362 sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
363 x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
364 y0 x0 2 mul x1 sub y1 ] def } def
365 %
366 /Grid { 
367   newpath 
368   /a 4 string def 
369   /b ED /c ED /n ED 
370   cvi dup 1 lt { pop 1 } if 
371   /s ED 
372   s div dup 0 eq { pop 1 } if 
373   /dy ED s div dup 0 eq { pop 1 } if
374   /dx ED dy div round dy mul 
375   /y0 ED dx div round dx mul 
376   /x0 ED dy div round cvi 
377   /y2 ED dx div round cvi 
378   /x2 ED dy div round cvi 
379   /y1 ED dx div round cvi 
380   /x1 ED 
381   /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def 
382   /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def 
383   b 0 gt { 
384     /z1 b 4 div CLW 2 div add def
385 %    /Helvetica findfont b scalefont setfont 
386     /b b .95 mul CLW 2 div add def } if 
387   systemdict /setstrokeadjust known 
388     { true setstrokeadjust /t { } def }
389     { /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add
390        exch itransform } bind def } ifelse 
391   gsave n 0 gt { 1 setlinecap [ 0 dy n div ] dy n div 2 div setdash } { 2 setlinecap } ifelse 
392   /i x1 def 
393   /f y1 dy mul n 0 gt { dy n div 2 div h mul sub } if def 
394   /g y2 dy mul n 0 gt { dy n div 2 div h mul add } if def 
395   x2 x1 sub w mul 1 add dup 1000 gt { pop 1000 } if 
396   { i dx mul dup y0 moveto 
397     b 0 gt 
398       { gsave c i a cvs dup stringwidth pop 
399         /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse 
400     h 0 gt {b neg}{z1} ifelse 
401         rmoveto show grestore } if 
402     dup t f moveto 
403     g t L stroke 
404     /i i w add def 
405   } repeat 
406   grestore 
407   gsave 
408   n 0 gt
409   % DG/SR modification begin - Nov. 7, 1997 - Patch 1
410   %{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash }
411     { 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash }
412   % DG/SR modification end
413     { 2 setlinecap } ifelse 
414   /i y1 def 
415   /f x1 dx mul n 0 gt { dx n div 2 div w mul sub } if def 
416   /g x2 dx mul n 0 gt { dx n div 2 div w mul add } if def 
417   y2 y1 sub h mul 1 add dup 1000 gt { pop 1000 } if 
418   { newpath i dy mul dup x0 exch moveto 
419     b 0 gt { gsave c i a cvs dup stringwidth pop 
420       /z2 ED 
421       w 0 gt {z1 z2 add neg} {z1} ifelse 
422       h 0 gt {z1} {b neg} ifelse 
423       rmoveto show grestore } if 
424     dup f exch t moveto 
425     g exch t L stroke 
426     /i i h add def 
427   } repeat 
428   grestore 
429 } def
430 %
431 /ArcArrow { 
432   /d ED /b ED /a ED 
433   gsave 
434   newpath 0 -1000 moveto clip 
435   newpath 
436   0 1 0 0 b 
437   grestore 
438   c mul 
439   /e ED 
440   pop pop pop r a e d PtoC y add exch x add
441   exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
442   mul neg d 
443 } def
444 %
445 /Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
446 %
447 /ArcAdjust { %%%% Vincent Guirardel
448 % given a target length (targetLength) and an initial angle (angle0) [in the stack],
449 % let  M(angle0)=(rx*cos(angle0),ry*sin(angle0))=(x0,y0).
450 % This computes an angle t such that (x0,y0) is at distance 
451 % targetLength from the point M(t)=(rx*cos(t),ry*sin(t)).
452 % NOTE: this an absolute angle, it does not have to be added or substracted to angle0
453 % contrary to TvZ's code.
454 % To achieve, this, one iterates the following process: start with some angle t,
455 % compute the point M' at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)].
456 % Now take t' (= new angle) so that (0,0) M(t') and M' are aligned.
457 %
458 % Another difference with TvZ's code is that we need d (=add/sub) to be defined.
459 % the value of d = add/sub is used to know on which side we have to move.
460 % It is only used in the initialisation of the angle before the iteration.
461 %
462 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
463 % Input stack:  1: target length 2: initial angle
464 % variables used : rx, ry, d (=add/sub)
465 %
466   /targetLength ED /angle0 ED
467   /x0 rx angle0 cos mul def
468   /y0 ry angle0 sin mul def
469 % we are looking for an angle t such that (x0,y0) is at distance targetLength 
470 % from the point M(t)=(rx*cos(t),ry*sin(t)))
471 %initialisation of angle (using 1st order approx = TvZ's code)
472   targetLength 57.2958 mul
473   angle0 sin rx mul dup mul
474   angle0 cos ry mul dup mul
475   add sqrt div 
476 % if initialisation angle is two large (more than 90 degrees) set it to 90 degrees
477 % (if the ellipse is very curved at the point where we draw the arrow, %
478 % the value can be much more than 360 degrees !)
479 % this should avoid going on the wrong side (more than 180 degrees) or go near
480 % a bad attractive point (at 180 degrees)
481   dup 90 ge { pop 90 } if 
482   angle0 exch d % add or sub
483 % maximum number of times to iterate the iterative procedure:
484 % iterative procedure: takes an angle t on top of stack, computes a 
485 % better angle (and put it on top of stack)
486   30 { dup
487 % compute distance D between (x0,y0) and M(t)
488     dup cos rx mul x0 sub dup mul exch sin ry mul y0 sub dup mul add sqrt
489 % if D almost equals targetLength, we stop
490     dup targetLength sub abs 1e-5 le { pop exit } if
491 % stack now contains D t
492 % compute the point M(t') at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]:
493 % M(t')= ( (x(t)-x0)*targetLength/d+x0 , (y(t)-y0)*targetLength/d+y0 )
494     exch dup cos rx mul x0 sub  exch sin ry mul y0 sub
495 % stack contains:  y(t)-y0, x(t)-x0, d
496     2 index Div targetLength mul y0 add ry Div exch
497     2 index Div targetLength mul x0 add rx Div
498 % stack contains x(t')/rx , y(t')/ry , d
499 % now compute t', and remove D from stack
500     atan exch pop
501   } repeat
502 % we don't look at what happened... in particular, if targetLength is greater 
503 % than the diameter of the ellipse...
504 % the final angle will be around /angle0 + 180. maybe we should treat this pathological case...
505 % after iteration, stack contains an angle t such that M(t) is the tail of the arrow
506 % to give back the result as a an angle relative to angle0 we could add the following line:
507 % angle0 sub 0 exch d
508 %
509 % begin bug fix 2006-01-11
510 % we want to adjust the new angle t' by a multiple of 360 so that  | t'-angle0 | <= 180
511 %(we don't want to make the ellipse turn more or less than it should)...
512 dup angle0 sub dup abs 180 gt { 180 add 360 div floor 360 mul sub } { pop } ifelse
513 % end bug fix
514 } def
515 %
516 /EllipticArcArrow {
517   /d ED      % is add or sub
518   /b ED      % arrow procedure
519   /a1 ED     % angle
520   gsave
521   newpath
522   0 -1000 moveto
523   clip                  % Set clippath far from arrow.
524   newpath
525   0 1 0 0 b             % Draw arrow to determine length.
526   grestore
527 % Length of arrow is on top of stack. Next 3 numbers are junk.
528 %
529   a1 exch ArcAdjust   % Angular position of base of arrow.
530   /a2 ED
531   pop pop pop
532   a2 cos rx mul xOrig add % hv 2007-08-29   x->xOrig
533   a2 sin ry mul yOrig add % hv 2007-08-29   y->yOrig
534   a1 cos rx mul xOrig add % 
535   a1 sin ry mul yOrig add % 
536 % Now arrow tip coor and base coor are on stack.
537   b pop pop pop pop       % Draw arrow, and discard coordinates.
538   a2 CLW 8 div
539 % change value of d (test it by looking if  `` 1 1 d '' gives 2 or not )
540   1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse
541   ArcAdjust
542 % resets original value of d
543   1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse  % Adjust angle to give overlap.
544 } def
545 %%------------------ tvz/DG/hv (2004-05-10) end -------------------%%
546 %
547 /Rot { CP CP translate 3 -1 roll neg rotate NET  } def
548 %
549 /RotBegin { 
550   tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if 
551   /TMatrix [ TMatrix CM ] cvx def 
552   /a ED 
553   a Rot /RAngle [ RAngle dup a add ] cvx def 
554 } def
555 %
556 /RotEnd { /TMatrix [ TMatrix setmatrix ] cvx def /RAngle [ RAngle pop ] cvx def } def
557 %
558 /PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
559 /PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def
560 /PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def
561 /Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
562 abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
563 div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
564 h1 abs h sub dup s mul abs } ifelse } def
565 /UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
566 mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
567 { x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
568 exch } def
569 /BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { Visible
570 /IfVisible true def } if } { IfVisible { Invisible /IfVisible false def
571 } if } ifelse } def
572 /InitOL { /OLUnit [ 3000 3000 matrix defaultmatrix dtransform ] cvx def
573 /Visible { CP OLUnit idtransform T moveto } def /Invisible { CP OLUnit
574 neg exch neg exch idtransform T moveto } def /BOL { BeginOL } def
575 /IfVisible true def } def
576 end
577 %
578 /AlgParser { tx@AlgToPs begin AlgToPs end } def
579 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
580 /tx@CoreAnalyzerDict 100 dict def tx@CoreAnalyzerDict begin
581 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
582 % PS ANALYZER FOR ALGEBRAIC EXPRESSION V1.12
583 % E->T|E+T
584 % T->FS|T*FS
585 % FS -> F | +FS | -FS
586 % F->P|F^SF
587 % P->(E)|literal
588 % literal->number|var|var[E]|func(params)
589 % params->E|E,param
590 % number->TOBEFINISHED
591 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
592 %% E expression, T term, SF signed factor, F factor, P power
593 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
594 %% parser
595 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
596 %% str
597 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
598 %% C->E<condition_operators>E
599 %% STR index -> STR index+lenExpr
600 /AnalyzeCond { AnalyzeExpr ReadCondOp AnalyzeExpr EvalCondOp  } def
601 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
602 %% analyze Expression List (separator , or | )
603 %% STR index -> STR index+lenExpr
604 %% /AnalyzeListOfE {
605 %%   { NextNonBlankChar pop AnalyzeExpr%%dup Strlen eq { exit } if NextNonBlankChar
606 %%     NextNonBlankChar dup 0 eq { pop exit } if
607 %%     dup 44 ne 1 index 124 ne and { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } if
608 %%     pop NextNonBlankChar dup 0 eq { exit } if 124 ne { PROBLEMCONTACTBILLOU } if 1 add NextNonBlankChar 0 eq {toto} if } loop
609 %%   AnalyzeListOfEPostHook
610 %% } def
611 /AnalyzeListOfE {
612   /NotFirst false def
613   { NextNonBlankChar pop AnalyzeExpr
614     NotFirst { EvalListOfExpr } { /NotFirst true def } ifelse
615     dup Strlen eq { exit } if NextNonBlankChar
616     dup 44 ne 1 index 124 ne and
617     { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse }
618     if  pop 1 add } loop
619   AnalyzeListOfEPostHook
620 } def
621 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
622 %% E->T|E+T
623 %% STR index -> STR index+lenExpr
624 /AnalyzeExpr {
625   AnalyzePreHook AnalyzeTerm IsEndingExpr
626   { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
627   { { RollOp 1 add NextNonBlankChar pop AnalyzeTerm PreEvalHook EvalAddSub IsEndingExpr { pop exit } if } loop }
628   ifelse
629   AnalyzePostHook
630 } def
631 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
632 %% T->FS|T*FS
633 %% STR index
634 /AnalyzeTerm {
635   AnalyzePreHook AnalyzeSignedFactor IsEndingTerm
636   { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
637   { { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor PreEvalHook EvalMulDiv IsEndingTerm { pop exit } if} loop }
638   ifelse
639   AnalyzePostHook
640 } def
641 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
642 %% FS -> F | +FS | -FS
643 %% STR index
644 /AnalyzeSignedFactor {
645   AnalyzePreHook 2 copy get dup IsUnaryOp
646   { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor EvalUnaryOp }
647   { pop AnalyzeFactor }
648   ifelse AnalyzePostHook
649 } def
650 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
651 %% F->P|F^P
652 %% STR index
653 /AnalyzeFactor {
654   AnalyzePreHook AnalyzePower IsEndingFactor
655   { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
656   { { RollOp 1 add NextNonBlankChar pop AnalyzePower PreEvalHook EvalPower IsEndingFactor { pop exit } if} loop }
657   ifelse  AnalyzePostHook
658 } def
659 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
660 %% P->(E)|literal
661 %% STR index
662 /AnalyzePower {
663   %% depending of first char either a number, or a literal
664   2 copy get dup 40 eq%%an open par
665   { pop 1 add NextNonBlankChar pop AnalyzeExpr 1 add NextNonBlankChar pop }
666   { AnalyzeLiteral }
667   ifelse
668 } def
669 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
670 %% STR index STR[index] -> STR index
671 %/AnalyzeLiteral { IsNumber { EvalNumber } { EvalLiteral } ifelse } def
672 /AnalyzeLiteral { dup IsUnaryOp exch IsNumber or { EvalNumber } { EvalLiteral } ifelse } def%%dr 09102006
673 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
674 %% recognize + or -
675 %% chr -> T/F
676 /IsUnaryOp { dup 43 eq exch 45 eq or } bind def
677 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
678 %% a number can contain only : 0123456789.
679 %% chr -> T/F
680 /IsNumber { dup 48 ge exch dup 57 le 3 -1 roll and exch 46 eq or } bind def
681 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
682 %% STR index -> STR index number
683 %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)?
684 %% STR index -> STR index' number
685 /ReadNumber {
686   exch dup 3 -1 roll dup 3 1 roll
687   %%read mantissa
688   { 1 add  2 copy dup Strlen eq { pop pop 0 exit } if get dup IsNumber not { exit } if pop } loop
689   dup 101 eq exch 69 eq or
690   %%% there is a "e" or "E" -> read exponant
691   { 1 add 2 copy get dup IsUnaryOp
692     { pop 1 add 2 copy get } if
693     { IsNumber not { exit } if 1 add 2 copy get } loop }
694   if
695   dup 4 1 roll
696   3 -1 roll exch 1 index sub getinterval
697 } def
698 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
699 %% a number can contain only : 0123456789.
700 %% chr -> T/F
701 /IsCondOp { dup 30 eq exch dup 60 ge exch 62 le and or } bind def
702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
703 %% STR index -> STR index number
704 %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)?
705 %% STR index -> STR index' number
706 /ReadCondOp {
707   NextNonBlankChar 1 index 4 1 roll
708   { IsCondOp not { exit } if 1 add  2 copy get } loop
709   2 copy 5 -1 roll
710   exch 1 index sub getinterval 3 1 roll
711 } def
712 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
713 %% a literal can contain only : 0123456789.
714 %% chr -> T/F
715 /IsLiteral {%
716   dup 48 ge exch dup  57 le 3 -1 roll and exch
717   dup 65 ge exch dup  90 le 3 -1 roll and 3 -1 roll or exch
718   dup 97 ge exch     122 le and or } bind def
719 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
720 %% a literal can be of the form [a-zA-Z][a-zA-Z0-9]*\(\((Expression)\)|\(\[Expression\]\)\)?
721 %% STR index -> literal STR index' nextchr
722 /ReadLiteral {
723   exch dup 3 -1 roll dup 3 1 roll
724   %%read literal core
725   { 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsLiteral not { exit } if pop 1 add } loop
726   4 1 roll dup 5 1 roll 3 -1 roll exch 1 index sub getinterval 4 1 roll
727 } def
728 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
729 %% expr is ended by end of str or a clpar
730 %% STR index -> STR index STR[index] T/F
731 /IsEndingExpr {%
732   2 copy dup Strlen eq
733   %% if end of str is reached -> end !
734   { pop pop 0 true }
735   %% ending chr -> clpar, comma, |, <, >, =, !,
736   {get dup  dup  41 eq
737        exch dup 124 eq
738        exch dup  93 eq
739        exch dup  44 eq
740        exch dup  30 eq
741        exch dup  60 ge exch 62 le and or or or or or}
742   ifelse } def
743 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
744 %% expr is ended by end of str or a +-
745 %% STR index -> STR index STR[index] T/F
746 /IsEndingTerm { IsEndingExpr { true } { dup dup 43 eq exch 45 eq or } ifelse } def
747 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
748 %% expr is ended by end of str or */
749 %% STR index -> STR index STR[index] T/F
750 /IsEndingFactor { IsEndingTerm { true } { dup dup 42 eq exch 47 eq or } ifelse } def
751 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
752 %% expr is ended by end of str or ^
753 %% STR index -> STR index STR[index] T/F
754 /IsEndingPower { IsEndingFactor { true } { dup 94 eq } ifelse } def
755 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
756 %% STR index -> STR index STR[index]
757 /NextNonBlankChar { { dup Strlen eq { 0 exit } if 2 copy get dup neBlkChar { exit } if pop 1 add } loop } bind def
758 /neBlkChar { dup 32 ne exch dup 10 ne exch 9 ne and and } bind def
759 %%%%%%%%%%%%%%%%%%%%%%%%
760 %% DEBUG
761 /BRK {false} def
762 /BRKtrue {/BRK true def} def
763 /BRKStop {BRK {BRKtoto} if } def
764 /BRKEvalStop {BRK exch if } def
765 /BRKBRK2true {BRK {BRK2true} if } def
766 /BRK2 {false} def
767 /BRK2true {/BRK2 true def} def
768 /BRK2Stop {BRK2 {BRK2toto} if } def/BRK {false} def
769 end
770 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
771 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
772 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
773 /tx@AlgToPs 12 dict def tx@AlgToPs begin
774 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
775 %% algExpr -> PSVector
776 /AlgToPs { tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE pop pop EndingSequence end } def
777 /EndingSequence { ExpressionVector aload length /end cvx exch 1 add array astore } def
778 /InitParser { /ExpressionVector [ /tx@AddMathFunc cvx /begin cvx ] def dup length /Strlen exch def 0 } def
779 /Strlen 0 def
780 /EvalListOfExpr {} def%
781 /EvalNumber {%
782     ReadNumber  cvr /ExpressionVector ExpressionVector aload length dup 3 add -1 roll cvx
783     exch 1 add array astore def NextNonBlankChar pop } def
784 /EvalAddSub {%
785   /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
786   43 eq { /add } { /sub } ifelse cvx exch 1 add array astore def
787 } def
788 /EvalMulDiv {%
789   /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
790   42 eq { /mul } { /div } ifelse cvx exch 1 add array astore def
791 } def
792 /EvalPower {%
793   /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
794   pop /exp cvx exch 1 add array astore def
795 } def
796 /EvalLiteral {%
797   ReadLiteral
798   dup 40 eq%%% there is an open par -> function call
799   { pop 2 index
800     dup (Sum) eq { EvalSum }
801     { dup (IfTE) eq { EvalCond }
802       { dup (Derive) eq { pop EvalDerive }
803     { pop 1 add NextNonBlankChar pop AnalyzeListOfE 2 index TrigoFunc
804           /ExpressionVector ExpressionVector aload length dup 5 add -1 roll cvn cvx
805       exch 1 add array astore def 1 add NextNonBlankChar pop } ifelse } ifelse} ifelse }
806   { /ExpressionVector ExpressionVector aload length dup 6 add -1 roll cvn cvx exch 1 add array astore def
807     dup 91 eq%%% there is an open bracket -> vector element
808     { pop 1 add NextNonBlankChar pop AnalyzeExpr
809       /ExpressionVector ExpressionVector aload length /cvi cvx exch /get cvx exch 2 add array astore def 1 add }
810     { pop NextNonBlankChar pop }
811     ifelse}
812   ifelse
813 } def
814 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
815 %% the derive function : Derive(n,f(x))
816 %% firstparindex lastparindex ->
817 /EvalDerive {
818   %% manage the function descripiton
819   1 add ReadNumber 3 1 roll NextNonBlankChar
820   44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
821   1 add NextNonBlankChar pop
822   3 -1 roll cvi
823   dup 0 eq
824   { pop AnalyzeExpr 3 -1 roll pop 1 add }
825   { 1 sub 3 1 roll (x)  exch tx@Derive begin DeriveIndexed end 4 -1 roll
826     { (x) tx@Derive begin Derive end } repeat
827     ExpressionVector exch /ExpressionVector [] def
828     AlgToPs aload length
829     /ExpressionVector 1 index 3 add -1 roll aload length dup 3 add -1 roll  /l2 exch def /l1 exch def
830     l1 l2 add 1 add l2 neg roll l1 l2 add array astore def 3 -1 roll pop 1 add
831     1 index length /Strlen exch def } ifelse
832 } def
833 /EvalSum {%
834   pop 1 add NextNonBlankChar pop
835   %% read the variable name
836   ReadLiteral pop NextNonBlankChar
837   44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if
838   %% read the initial value
839   1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
840   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
841   %% read the increment value
842   1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
843   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
844   %% read the limit value
845   1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
846   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
847   /ExpressionVector ExpressionVector aload length dup 7 add -3 roll 0 4 1 roll
848   5 -1 roll 4 add array astore def
849   %% keep ExpressionVector for later and create a new one for internal Sum computation
850   ExpressionVector 3 1 roll /ExpressionVector [ 6 -1 roll cvn /exch cvx /def cvx ] def
851   1 add NextNonBlankChar pop AnalyzeExpr
852   %% add each term
853   /ExpressionVector ExpressionVector aload length 1 add /add cvx exch array astore def
854   /ExpressionVector 4 -1 roll aload length ExpressionVector cvx /for cvx 3 -1 roll 2 add
855   array astore def 3 -1 roll pop 1 add
856 } def
857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
858 %% Convert to radians if trigo function call
859 %% (name) ->
860 /TrigoFunc {
861   dup (cos) eq 1 index (sin) eq or exch (tan) eq or
862   { /ExpressionVector ExpressionVector aload length 3.14159265359 /div cvx 180 /mul cvx 5 -1 roll 4 add
863     array astore def
864   } if
865 } def
866 /EvalCond {%
867   pop 1 add AnalyzeCond NextNonBlankChar
868   44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if
869   ExpressionVector 3 1 roll /ExpressionVector [] def
870   1 add AnalyzeExpr ExpressionVector 3 1 roll /ExpressionVector [] def
871   NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if
872   1 add AnalyzeExpr
873   NextNonBlankChar 41 ne { ANALYZER_ERROR_missing_ending parenthesis_in_IfTE } if
874   ExpressionVector
875   /ExpressionVector 6 -1 roll aload length dup
876   6 add -1 roll cvx exch dup 4 add -1 roll cvx /ifelse cvx 3 -1 roll 3 add array astore def
877   1 add 3 -1 roll pop
878 } def
879 %% CondOp STR index
880 /EvalCondOp {%
881   3 -1 roll
882   dup (=) eq  { /eq } {%
883   dup (<) eq  { /lt } {%
884   dup (>) eq  { /gt } {%
885   dup (>=) eq { /ge } {%
886   dup (<=) eq { /ge } {%
887   dup (!=) eq { /ne } { ERROR_non_valid_conditional_operator }
888   ifelse } ifelse } ifelse } ifelse } ifelse } ifelse
889   cvx exch pop
890   /ExpressionVector ExpressionVector aload length dup 3 add -1 roll exch 1 add array astore def } def
891 /EvalUnaryOp {
892   3 -1 roll 45 eq { /ExpressionVector ExpressionVector aload length /neg cvx exch 1 add array astore def } if
893 } def
894 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
895 %% H O O K S
896 /AnalyzePreHook {} bind def
897 /PreEvalHook {} bind def
898 /AnalyzeListOfEPostHook {} bind def
899 /AnalyzePostHook {} def
900 /RollOp { 3 1 roll } bind def
901 end%%%tx@CoreAnalyzerDict
902 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
903 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
904 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
905 /tx@Derive 41 dict def tx@Derive begin
906 %%increase ^^ for each function added
907 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
908 %% algExpr variable -> PSVector
909 /Derive {%
910   10240 string 3 1 roll 0 3 1 roll
911   /Variable exch def
912   tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE end
913 } def
914 /Strlen 0 def
915 /InitParser { dup length /Strlen exch def 0 } def
916 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
917 %% algExpr variable index -> PSVector
918 /DeriveIndexed {%
919   3 1 roll 10240 string 3 1 roll 0 3 1 roll
920   /Variable exch def
921   tx@CoreAnalyzerDict begin InitParser pop 4 -1 roll AnalyzeExpr 4 -2 roll pop pop 4 -2 roll exch pop end
922 } def
923 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
924 %% (u,v)'=-(u',v')
925 /EvalListOfExpr {%
926   4 2 roll 2 copy 9 -1 roll dup length 4 1 roll putinterval add AddPipe
927            2 copy 7 -1 roll dup length 4 1 roll putinterval add
928   6 -2 roll pop pop
929   2 copy pop 0 6 2 roll GetIntervalNewStr 5 1 roll 2 copy 0 exch getinterval 6 1 roll } def
930 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
931 %% (-u)'=-(u')
932 /EvalUnaryOp {
933   4 -2 roll 4 index (0) eq
934   { (0) StrConcat 7 -1 roll pop }
935   { 7 -1 roll 45 eq
936     { AddSub AddOpPar true } { false } ifelse
937     3 1 roll 5 index StrConcat 3 -1 roll { AddClPar } if } ifelse
938   2 copy pop 0 6 2 roll GetIntervalNewStr
939   7 -2 roll pop pop 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
940 } def
941 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
942 %% (number)'=0
943 /EvalNumber { ReadNumber (0) 6 2 roll } def
944 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
945 %% (u+v)'=u'+v'
946 /EvalAddSub {%
947   7 index dup (0) eq
948   { pop true }%% du=0 nothing added
949   { dup length exch 5 index 5 index 3 -1 roll putinterval 4 -1 roll add 3 1 roll false }
950   ifelse
951   5 index dup (0) eq
952   { pop { (0) } { 4 -2 roll 2 copy pop 0  6 2 roll GetIntervalNewStr } ifelse }%%dv=0
953   { exch
954     { 5 -2 roll 7 index 45 eq { AddSub } if false } %%nothing yet added
955     { 5 -2 roll 7 index 43 eq%%something yet added
956       { AddAdd false } { AddSub AddOpPar true } ifelse }
957     ifelse 11 1 roll
958     3 -1 roll StrConcat 10 -1 roll { AddClPar } if
959     2 copy pop 0 6 2 roll GetIntervalNewStr }
960   ifelse
961   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
962 } def
963 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
964 %% (u*v)' or (u/v)'
965 /EvalMulDiv { 6 index 42 eq {EvalMul} {EvalDiv} ifelse } def
966 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
967 %% (u*v)'=u'*v+u*v'
968 /EvalMul {%
969   4 -2 roll 7 index dup (0) eq
970   { pop false }%%du=0
971   { (1) eq%%du=1
972     { false }
973     { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse
974     3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if
975     true }%%du!=0
976   ifelse
977   5 1 roll 5 index (0) eq
978   { 5 -1 roll not { (0) StrConcat } if }%%dv=0
979   { 5 -1 roll { AddAdd } if
980     4 index (1) eq
981     { 8 index StrConcat }
982     { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar }
983     ifelse
984   }%%dv!=0
985   ifelse
986   2 copy pop 0 6 2 roll GetIntervalNewStr
987   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
988 } def
989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
990 %% (u/v)'=(u'*v-u*v')/v^2
991 /EvalDiv {%
992   4 -2 roll
993   4 index (0) eq%%dv=0 -> u'/v
994   { 7 index (0) eq { (0) StrConcat } { AddOpPar 7 index StrConcat AddClPar AddDiv 5 index StrConcat } ifelse }
995   { 7 index dup (0) eq
996     { pop }%%du=0
997     { (1) eq%%du=1
998       { false }
999       { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse
1000       3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if}%%du!=0
1001     ifelse
1002       AddSub
1003       4 index (1) eq
1004       { 8 index StrConcat }
1005       { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar }
1006       ifelse
1007     %}%%dv!=0
1008     2 copy GetIntervalNewStr 3 1 roll pop 0 AddOpPar 3 -1 roll StrConcat AddClPar
1009     AddDiv AddOpPar 5 index StrConcat AddClPar 2 copy (^2) putinterval 2 add }
1010   ifelse
1011   2 copy pop 0 6 2 roll GetIntervalNewStr
1012   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1013 } def
1014 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1015 %% str1 index str2 -> str1 index
1016 /StrConcat { dup length 4 2 roll 2 copy 6 -1 roll putinterval 3 -1 roll add } bind def
1017 /GetIntervalNewStr { 0 exch getinterval dup length string copy } bind def
1018 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1019 %% (u^v)'=(u^v)'=u'vu^(v-1)+v'u^(v)ln(u)
1020 /EvalPower {%
1021   4 -2 roll 7 index (0) eq
1022   {%%if du=0 then (u^v)'=v'ln(u)u^v
1023     4 index (0) eq
1024     { (0) StrConcat }%%if dv=0 then (u^v)'=0
1025     { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if
1026       8 index (e) ne { (ln\() StrConcat 8 index StrConcat (\)*) StrConcat } if
1027       AddOpPar 8 index StrConcat (\)^\() StrConcat 5 index StrConcat AddClPar } ifelse
1028   }
1029   {%%du!=0
1030     4 index (0) eq
1031     {%%if dv=0 then (u^v)'=vu'u^(v-1)
1032       5 index dup IsStrNumber
1033       { dup (0) eq
1034         { StrConcat }
1035         { dup dup (1) eq exch (1.0) eq or
1036           { StrConcat  }
1037       { StrConcat
1038         7 index dup (1) ne exch (1.0) ne and%%%dr 09102006 insert du if <> 1
1039         { (*\() StrConcat 7 index StrConcat (\)) StrConcat } if%%%dr 09102006
1040             (*\() StrConcat 8 index StrConcat (\)) StrConcat
1041             5 index  dup dup (2) eq exch (2.0) eq or
1042         { pop } { cvr 1 sub 20 string cvs 3 1 roll (^) StrConcat 3 -1 roll StrConcat } ifelse } ifelse } ifelse }
1043       { pop AddOpPar 5 index StrConcat (\)*\() StrConcat 8 index StrConcat (\)^\() StrConcat
1044         5 index StrConcat (-1\)) StrConcat } ifelse
1045     }
1046     {%%if dv!=0 and du!=0 then (u^v)'=u'vu^(v-1)+v'u^(v)ln(u)
1047       7 index (1) ne { AddOpPar 7 index StrConcat (\)*) StrConcat } if
1048       AddOpPar 5 index StrConcat (\)*\() StrConcat
1049       8 index StrConcat (\)^\() StrConcat
1050       5 index StrConcat (-1\)+\() StrConcat
1051       4 index (1) ne { 4 index StrConcat (\)*\() StrConcat } if
1052       8 index StrConcat (\)^\() StrConcat
1053       5 index StrConcat (\)*ln\() StrConcat
1054       8 index StrConcat AddClPar
1055     } ifelse
1056   } ifelse
1057   2 copy pop 0 6 2 roll GetIntervalNewStr
1058   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1059 } def
1060 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1061 %% str -> true/false
1062 /IsStrNumber {%
1063   true exch
1064   { dup 48 lt exch dup 57 gt 3 -1 roll or
1065     exch dup 46 ne%%.
1066     exch dup 43 ne%%+
1067     exch 45 ne%%-
1068     and and and { pop false } if } forall
1069 } def
1070 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1071 %% literal switch -> func call, vector, variables
1072 /EvalLiteral {%
1073   ReadLiteral dup 40 eq%%% there is an open par -> function call
1074   { pop (EvalFunc_             ) 9 4 index StrConcat 0 exch getinterval cvn cvx exec }
1075   { dup 91 eq%%% there is an open bracket -> vector element
1076     { ERROR_vector_not_yet_implemented }
1077     { pop EvalVariable }
1078     ifelse }
1079   ifelse
1080 } def
1081 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1082 %% first last parpos Expr[first:parpos-1] ->
1083 /EvalVariable { 2 index Variable eq { (1) } { (0) } ifelse 4 -1 roll exch 6 2 roll } def
1084 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1085 %% (f(u))'=u'f'(u)
1086 /EvalFunc {
1087   4 2 roll 4 index (1) ne
1088   { AddOpPar 4 index StrConcat (\)*) StrConcat } if
1089   (Eval             ) 4 8 index StrConcat 0 exch getinterval cvn cvx exec
1090   2 copy pop 0 6 2 roll GetIntervalNewStr
1091   mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1092 } def
1093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1094 %% Func derivative -> Eval<func>
1095 /EvalFunc_sin {%
1096   PreCommonFunc
1097   { (cos\() StrConcat 5 index StrConcat AddClPar } if
1098   PostCommonFunc } def
1099 /EvalFunc_cos {%
1100   PreCommonFunc
1101   { (\(-sin\() StrConcat 5 index StrConcat (\)\)) StrConcat } if
1102   PostCommonFunc } def
1103 /EvalFunc_tan {%
1104   PreCommonFunc
1105   {  dup 0 eq { (1) StrConcat } { 1 sub } ifelse  (/cos\() StrConcat 5 index StrConcat (\)^2) StrConcat } if
1106   PostCommonFunc } def
1107 /EvalFunc_asin {%
1108   PreCommonFunc
1109   { (1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1110   PostCommonFunc } def
1111 /EvalFunc_acos {%
1112   PreCommonFunc
1113   { (-1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1114   PostCommonFunc } def
1115 /EvalFunc_atg {%
1116   PreCommonFunc
1117   { (1/\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1118   PostCommonFunc } def
1119 /EvalFunc_ln {%
1120   PreCommonFunc
1121   {  dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\() StrConcat 5 index StrConcat AddClPar } if
1122   PostCommonFunc } def
1123 /EvalFunc_exp {%
1124   PreCommonFunc
1125   {  (exp\() StrConcat 5 index StrConcat AddClPar } if
1126   PostCommonFunc } def
1127 /EvalFunc_sqrt {%
1128   PreCommonFunc
1129   { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\(2*sqrt\() StrConcat 5 index StrConcat (\)\)) StrConcat } if
1130   PostCommonFunc } def
1131 /EvalFunc_Fact {%
1132   PreCommonFunc { ERROR_no_variable_expression_in_Fact } if
1133   PostCommonFunc } def
1134 /EvalFunc_sh {%
1135   PreCommonFunc
1136   { (ch\() StrConcat 5 index StrConcat AddClPar } if
1137   PostCommonFunc } def
1138 /EvalFunc_ch {%
1139   PreCommonFunc
1140   { (sh\() StrConcat 5 index StrConcat AddClPar } if
1141   PostCommonFunc } def
1142 /EvalFunc_th {%
1143   PreCommonFunc
1144   {  dup 0 eq { (1) StrConcat } { 1 sub } ifelse  (/ch\() StrConcat 5 index StrConcat (\)^2) StrConcat } if
1145   PostCommonFunc } def
1146 /EvalFunc_Argsh {%
1147   PreCommonFunc
1148   { (1/sqrt\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1149   PostCommonFunc } def
1150 /EvalFunc_Argch {%
1151   PreCommonFunc
1152   { (1/sqrt\(\() StrConcat 5 index StrConcat (\)^2-1\)\)) StrConcat } if
1153   PostCommonFunc } def
1154 /EvalFunc_Argth {%
1155   PreCommonFunc
1156   { (1/\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1157   PostCommonFunc } def
1158 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1159 /PreCommonFunc {
1160   1 add NextNonBlankChar pop 3 -1 roll 5 1 roll AnalyzeExpr 1 add NextNonBlankChar pop
1161   4 2 roll 4 index (0) eq
1162   { (0) StrConcat false }
1163   { 4 index (1)  ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if true } ifelse
1164 } def
1165 /PostCommonFunc {
1166   2 copy pop 0 6 2 roll GetIntervalNewStr
1167   mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1168 } def
1169 /EvalFunc_Derive {%
1170   1 add ReadNumber cvi 1 add dup cvr log 1 add cvi string cvs
1171   4 -1 roll pop 5 1 roll 1 add NextNonBlankChar pop AnalyzeExpr 1 add
1172   4 -2 roll (Derive\() StrConcat 7 -1 roll StrConcat (,) StrConcat 6 -1 roll StrConcat AddClPar
1173   2 copy pop 0 6 2 roll GetIntervalNewStr 6 -1 roll pop 2 index 6 index dup 4 index exch sub getinterval
1174   exch 6 2 roll } def
1175 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1176 %% literal switch -> func call, vector, variables
1177 /EvalFunc_Sum {%
1178   1 add NextNonBlankChar pop
1179   %% read the variable name
1180   ReadLiteral pop 3 -1 roll pop NextNonBlankChar
1181   44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if
1182   %% read the initial value
1183   1 add NextNonBlankChar pop ReadNumber pop
1184   2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1185   %% read the increment value
1186   1 add NextNonBlankChar pop ReadNumber pop
1187   2 copy get 44 ne { ANALYZER_ERROR_missing_third_comma_in_Sum } if
1188   %% read the limit value
1189   1 add NextNonBlankChar pop ReadNumber pop
1190   2 copy get 44 ne { ANALYZER_ERROR_missing_fourth_comma_in_Sum } if
1191   1 add NextNonBlankChar pop dup 6 1 roll 3 -1 roll pop AnalyzeExpr 1 add NextNonBlankChar pop
1192   4 -2 roll 3 index 8 index dup 9 index exch sub getinterval StrConcat
1193   4 index StrConcat AddClPar
1194   2 copy pop 0 6 2 roll GetIntervalNewStr
1195   mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1196 } def
1197 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1198 %% literal switch -> func call, vector, variables
1199 /EvalFunc_IfTE {%
1200   3 -1 roll pop 1 add NextNonBlankChar pop SkipCond
1201   NextNonBlankChar
1202   44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if
1203   1 add NextNonBlankChar pop dup 5 1 roll
1204   AnalyzeExpr NextNonBlankChar
1205   44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if
1206   1 add NextNonBlankChar pop
1207   AnalyzeExpr 1 add NextNonBlankChar pop
1208   4 -2 roll 3 index 10 index dup 11 index exch sub getinterval StrConcat
1209   6 index StrConcat (,) StrConcat 4 index StrConcat AddClPar
1210   2 copy pop 0 6 2 roll GetIntervalNewStr
1211   mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1212 } def
1213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1214 %% advance in str until a comma is found (no error detection!)
1215 %% str index -> str index'
1216 /SkipCond { { 1 add 2 copy get 44 eq {exit } if } loop } bind def
1217 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1218 %% Convert to radians if trigo function call
1219 %% (name) ->
1220 /TrigoFunc {
1221   dup (cos) eq 1 index (sin) eq or exch (tan) eq or
1222   { /ExpressionVector ExpressionVector aload length 3.14159265359 /div cvx 180 /mul cvx 5 -1 roll 4 add
1223     array astore def
1224   } if
1225 } def
1226 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1227 %% No derivative for condition....
1228 /EvalCondOp { 3 -1 roll pop } bind def
1229 /PutIntervalOneAdd {putinterval 1 add} bind def
1230 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1231 %% Add open parenthesis in string at the given index
1232 %% str index -> str index+1
1233 /AddOpPar {2 copy (\() PutIntervalOneAdd} bind def
1234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1235 %% Add close parenthesis in string at the given index
1236 %% str index -> str index+1
1237 /AddClPar {2 copy (\)) PutIntervalOneAdd} bind def
1238 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1239 %% Add 0 in string at the given index
1240 %% str index -> str index+1
1241 /AddZero {2 copy (0) PutIntervalOneAdd} bind def
1242 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1243 %% Add open parenthesis in string at the given index
1244 %% str index -> str index+1
1245 /AddMul {2 copy (*) PutIntervalOneAdd} bind def
1246 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1247 %% Add open parenthesis in string at the given index
1248 %% str index -> str index+1
1249 /AddDiv {2 copy (/) PutIntervalOneAdd} bind def
1250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1251 %% Add a plus sign in string at the given index
1252 %% str index -> str index+1
1253 /AddAdd {2 copy (+) PutIntervalOneAdd} bind def
1254 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1255 %% Add a minus sign in string at the given index
1256 %% str index -> str index+1
1257 /AddSub {2 copy (-) PutIntervalOneAdd} bind def
1258 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1259 %% Add a pipe sign in string at the given index
1260 %% str index -> str index+1
1261 /AddPipe {2 copy (|) PutIntervalOneAdd} bind def
1262 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1263 %% H O O K S
1264 /AnalyzePreHook { dup 5 1 roll } bind def
1265 /PreEvalHook {} def
1266 /AnalyzePostHook { 7 -1 roll pop } bind def
1267 /AnalyzeListOfEPostHook { 6 -1 roll mark 6 1 roll cleartomark } bind def
1268 /RollOp { 5 1 roll } bind def
1269 end%%%tx@CoreAnalyzerDict
1270 /tx@AddMathFunc 12 dict def tx@AddMathFunc begin
1271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1272 %% NEW FUNC
1273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1274 %% function arcsine in radians asin(x)=atan(x/sqrt(1-x^2))
1275 %% x -> theta
1276 /asin {%
1277   dup abs 1 gt { EQDFasinrangeerror  } if
1278   dup dup dup mul 1 exch sub sqrt atan exch 0 lt { 360 sub } if 90 div 1.57079632680 mul
1279 } def
1280 %% function arccosine in radians acos(x)=atan(sqrt(1-x^2)/x)
1281 %% x -> theta
1282 /acos {%
1283   dup abs 1 gt { EQDFacosrangeerror  } if
1284   dup dup mul 1 exch sub sqrt exch atan 90 div 1.57079632680 mul
1285 } def
1286 %% function arctangent in radians
1287 %% x -> theta
1288 /atg { 1 atan dup 90 gt { 360 sub } if 90 div 1.57079632680 mul } bind def
1289 %% HYPERBOLIC FUNCTIONS
1290 /sh { dup Ex exch neg Ex sub 2 div } def
1291 /ch { dup Ex exch neg Ex add 2 div } def
1292 /th { dup sh exch ch div } def
1293 /Argsh { dup dup mul 1 add sqrt add ln } def
1294 /Argch { dup dup mul 1 sub sqrt add ln } def
1295 /Argth { dup 1 add exch 1 exch sub div ln 2 div } def
1296 %% modified exponential funtion for 0
1297 %% x n -> x^n
1298 /Exp { dup 0 eq { pop pop 1 } { exp } ifelse } bind def
1299 %% modified exponential funtion for 0
1300 %% x -> e^x
1301 /Ex { 2.71828182846 exch exp } bind def
1302 %%
1303 %% factorial function
1304 %% n -> n!
1305 /Fact { 1 exch 2 exch 1 exch { mul } for } bind def
1306 /fact { Fact } bind def
1307 /PI 3.14159265358 def
1308 /e 2.71828182846 def
1309 end
1310
1311 % END pstricks.pro
1312
1313 %%EndProcSet
1314 %%BeginProcSet: pst-dots.pro 0 0
1315 %!
1316 %% PostScript prologue for pstricks.tex.
1317 %% Version 2.00,                                    Suggestion of 2006/12/19
1318 %% For distribution, see pstricks.tex.
1319 %%
1320 %% Timothy Van Zandt <tvz@Princeton.EDU>
1321 %%
1322 %% Modified by Etienne Riga  - Dec. 16, 1999
1323 %% Modified by Herbert Voss (hv) - 2004/12/27 
1324 %% Modified by Etienne Riga  - 2005/01/01 (er)
1325 %% to add /Diamond, /SolidDiamond and /BoldDiamond
1326 %
1327 10 dict dup begin
1328   /FontType 3 def
1329   /FontMatrix [.001 0 0 .001 0 0] def
1330   /FontBBox [-571.5 -742.5 571.5 742.5] def
1331 %  /FontBBox [-1000 -1000 1000 1000] def
1332 %                See end of file in /BuildGlyph
1333   /Encoding 256 array def
1334   0 1 255 {Encoding exch/.notdef put} for
1335   Encoding
1336     dup (b) 0 get /Bullet put
1337     dup (c) 0 get /Circle put
1338     dup (C) 0 get /BoldCircle put
1339     dup (u) 0 get /SolidTriangle put
1340     dup (t) 0 get /Triangle put
1341     dup (T) 0 get /BoldTriangle put
1342     dup (r) 0 get /SolidSquare put
1343     dup (s) 0 get /Square put
1344     dup (S) 0 get /BoldSquare put
1345     dup (q) 0 get /SolidPentagon put
1346     dup (p) 0 get /Pentagon put
1347     dup (P) 0 get /BoldPentagon put
1348 %%%               
1349     dup (k) 0 get /Asterisk put
1350     dup (K) 0 get /BoldAsterisk put
1351     dup (J) 0 get /SolidAsterisk put
1352     dup (h) 0 get /Hexagon put
1353     dup (H) 0 get /BoldHexagon put
1354     dup (G) 0 get /SolidHexagon put
1355     dup (a) 0 get /Add put
1356     dup (A) 0 get /BoldAdd put
1357     dup (x) 0 get /Mul put
1358     dup (X) 0 get /BoldMul put
1359     dup (m) 0 get /Oplus put
1360     dup (M) 0 get /BOplus put
1361     dup (e) 0 get /SolidOplus put
1362     dup (n) 0 get /Otimes put
1363     dup (N) 0 get /BOtimes put
1364     dup (E) 0 get /SolidOtimes put
1365     dup (i) 0 get /Bar put
1366     dup (I) 0 get /BoldBar put
1367     dup (l) 0 get /SolidDiamond put
1368     dup (d) 0 get /Diamond put
1369         (D) 0 get /BoldDiamond put
1370 %%%  
1371 /CharProcs 47 dict def
1372   CharProcs begin
1373     /CirclePath {0 0 500 0 360 arc closepath} def
1374       /Bullet {CirclePath fill} def
1375           /Circle {CirclePath .9 .9 scale CirclePath eofill} def
1376           /BoldCircle {CirclePath .8 .8 scale CirclePath eofill} def
1377     /TrianglePath {0 660 moveto -571.5 -330 lineto 571.5 -330 lineto
1378                 closepath} def
1379           /SolidTriangle {TrianglePath fill} def
1380       /Triangle {TrianglePath .85 .85 scale TrianglePath eofill} def
1381       /BoldTriangle {TrianglePath .7 .7 scale TrianglePath eofill} def
1382     /SquarePath {-450 450 moveto 450 450 lineto 450 -450 lineto -450 -450 lineto
1383                 closepath} def
1384       /SolidSquare {SquarePath fill} def
1385       /Square {SquarePath .89 .89 scale SquarePath eofill} def
1386       /BoldSquare {SquarePath .78 .78 scale SquarePath eofill} def
1387     /PentagonPath {-337.8 -465 moveto 337.8 -465 lineto 546.6 177.6 lineto
1388                 0 574.7 lineto -546.6 177.6 lineto closepath} def
1389       /SolidPentagon {PentagonPath fill} def
1390       /Pentagon {PentagonPath .89 .89 scale PentagonPath eofill} def
1391       /BoldPentagon {PentagonPath .78 .78 scale PentagonPath eofill} def
1392 %-------------- hv begin 2004/07/25   from: er 2003/03/24
1393     /HexagonPath {0 550 moveto -476 275 lineto -476 -275 lineto
1394                 0 -550 lineto 476 -275 lineto 476 275 lineto closepath} def
1395       /SolidHexagon {HexagonPath fill} def
1396       /Hexagon {HexagonPath .89 .89 scale HexagonPath eofill} def
1397       /BoldHexagon {HexagonPath .79 .79 scale HexagonPath eofill} def
1398         /AsteriskPath {20 0 moveto 10 250 180 500 0 500 curveto
1399                 -180 500 -10 250 -20 0 curveto closepath} def
1400       /Asterisk {AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath
1401             60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath 
1402                 fill} def
1403         /Basterp {50 250 220 500 0 500 curveto
1404         -220 500 -50 250 -50 30 cos 100 mul curveto} def
1405         /BoldAsteriskPath {50 30 cos 100 mul moveto  Basterp
1406                      60 rotate Basterp 60 rotate Basterp
1407                      60 rotate Basterp 60 rotate Basterp
1408                      60 rotate Basterp closepath} def
1409       /BoldAsterisk {BoldAsteriskPath fill} def
1410           /SolidAsterisk {CirclePath .9 .9 scale BoldAsteriskPath eofill} def
1411     /CrossPath {40 550 moveto -40 550 lineto -40 40 lineto -550 40 lineto
1412         -550 -40 lineto -40 -40 lineto -40 -550 lineto 40 -550 lineto 
1413                 40 -40 lineto 550 -40 lineto 550 40 lineto 40 40 lineto closepath} def
1414     /BoldCrossPath {80 550 moveto -80 550 lineto -80 80 lineto -550 80 lineto
1415         -550 -80 lineto -80 -80 lineto -80 -550 lineto 80 -550 lineto 
1416                 80 -80 lineto 550 -80 lineto 550 80 lineto 80 80 lineto closepath} def
1417       /Add {CrossPath fill} def
1418       /Mul {45 rotate CrossPath fill} def
1419       /BoldAdd {BoldCrossPath fill} def
1420       /BoldMul {45 rotate BoldCrossPath fill} def
1421           /Oplus {CirclePath .9 .9 scale CirclePath eofill
1422                 .775 .775 scale CrossPath  fill} def 
1423           /SolidOplus {CirclePath .775 .775 scale BoldCrossPath eofill} def 
1424           /BOplus {CirclePath .8 .8 scale CirclePath eofill
1425                 .775 .775 scale BoldCrossPath fill} def 
1426           /Otimes {CirclePath .9 .9 scale CirclePath eofill
1427                 45 rotate .775 .775 scale CrossPath fill} def 
1428           /BOtimes {CirclePath .8 .8 scale CirclePath eofill
1429                 45 rotate .775 .775 scale BoldCrossPath  fill } def 
1430           /SolidOtimes {CirclePath 45 rotate .775 .775 scale BoldCrossPath eofill} def 
1431     /BarPath {40 660 moveto -40 660 lineto -40 -660 lineto 40 -660 lineto
1432                 closepath} def
1433       /Bar {BarPath fill} def
1434     /BoldBarPath {80 660 moveto -80 660 lineto -80 -660 lineto 80 -660 lineto
1435                 closepath} def
1436       /BoldBar {BoldBarPath fill} def
1437     /DiamondPath {0 742.5 moveto -428.5 0 lineto 0 -742.5 lineto 
1438                 428.5 0 lineto closepath} def
1439       /SolidDiamond {DiamondPath fill} def
1440       /Diamond {DiamondPath .865 .865 scale DiamondPath eofill} def
1441       /BoldDiamond {DiamondPath .73 .73 scale DiamondPath eofill} def
1442 %%%
1443     /.notdef { } def
1444   end
1445   /BuildGlyph {
1446     exch
1447     begin
1448 %      Metrics 1 index get exec 0
1449        0 0
1450 %      BBoxes 3 index get exec
1451       -1000 -1000 1000 1000
1452 %     -571.5 -742.5 571.5 742.5
1453       setcachedevice
1454       CharProcs begin load exec end
1455     end
1456   } def
1457   /BuildChar {
1458     1 index /Encoding get exch get
1459     1 index /BuildGlyph get exec
1460   } bind def
1461 end
1462 /PSTricksDotFont exch definefont pop
1463
1464
1465 %%EndProcSet
1466 %%BeginProcSet: pst-node.pro 0 0
1467 %!
1468 % PostScript prologue for pst-node.tex.
1469 % Version 97 patch 1, 97/05/09.
1470 % For distribution, see pstricks.tex.
1471 %
1472 /tx@NodeDict 400 dict def tx@NodeDict begin
1473 tx@Dict begin /T /translate load def end
1474 /NewNode { gsave /next ED dict dup 3 1 roll def exch { dup 3 1 roll def }
1475 if begin tx@Dict begin STV CP T exec end /NodeMtrx CM def next end
1476 grestore } def
1477 /InitPnode { /Y ED /X ED /NodePos { NodeSep Cos mul NodeSep Sin mul } def
1478 } def
1479 /InitCnode { /r ED /Y ED /X ED /NodePos { NodeSep r add dup Cos mul exch
1480 Sin mul } def } def
1481 /GetRnodePos { Cos 0 gt { /dx r NodeSep add def } { /dx l NodeSep sub def
1482 } ifelse Sin 0 gt { /dy u NodeSep add def } { /dy d NodeSep sub def }
1483 ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
1484 dup Sin mul Cos Div } ifelse } def
1485 /InitRnode { /Y ED /X ED X sub /r ED /l X neg def Y add neg /d ED Y sub
1486 /u ED /NodePos { GetRnodePos } def } def
1487 /DiaNodePos { w h mul w Sin mul abs h Cos mul abs add Div NodeSep add dup
1488 Cos mul exch Sin mul } def
1489 /TriNodePos { Sin s lt { d NodeSep sub dup Cos mul Sin Div exch } { w h
1490 mul w Sin mul h Cos abs mul add Div NodeSep add dup Cos mul exch Sin mul
1491 } ifelse } def
1492 /InitTriNode { sub 2 div exch 2 div exch 2 copy T 2 copy 4 index index /d
1493 ED pop pop pop pop -90 mul rotate /NodeMtrx CM def /X 0 def /Y 0 def d
1494 sub abs neg /d ED d add /h ED 2 div h mul h d sub Div /w ED /s d w Atan
1495 sin def /NodePos { TriNodePos } def } def
1496 /OvalNodePos { /ww w NodeSep add def /hh h NodeSep add def Sin ww mul Cos
1497 hh mul Atan dup cos ww mul exch sin hh mul } def
1498 /GetCenter { begin X Y NodeMtrx transform CM itransform end } def
1499 /XYPos { dup sin exch cos Do /Cos ED /Sin ED /Dist ED Cos 0 gt { Dist
1500 Dist Sin mul Cos div } { Cos 0 lt { Dist neg Dist Sin mul Cos div neg }
1501 { 0 Dist Sin mul } ifelse } ifelse Do } def
1502 /GetEdge { dup 0 eq { pop begin 1 0 NodeMtrx dtransform CM idtransform
1503 exch atan sub dup sin /Sin ED cos /Cos ED /NodeSep ED NodePos NodeMtrx
1504 dtransform CM idtransform end } { 1 eq {{exch}} {{}} ifelse /Do ED pop
1505 XYPos } ifelse } def
1506 /AddOffset { 1 index 0 eq { pop pop } { 2 copy 5 2 roll cos mul add 4 1
1507 roll sin mul sub exch } ifelse } def
1508 /GetEdgeA { NodeSepA AngleA NodeA NodeSepTypeA GetEdge OffsetA AngleA
1509 AddOffset yA add /yA1 ED xA add /xA1 ED } def
1510 /GetEdgeB { NodeSepB AngleB NodeB NodeSepTypeB GetEdge OffsetB AngleB
1511 AddOffset yB add /yB1 ED xB add /xB1 ED } def
1512 /GetArmA { ArmTypeA 0 eq { /xA2 ArmA AngleA cos mul xA1 add def /yA2 ArmA
1513 AngleA sin mul yA1 add def } { ArmTypeA 1 eq {{exch}} {{}} ifelse /Do ED
1514 ArmA AngleA XYPos OffsetA AngleA AddOffset yA add /yA2 ED xA add /xA2 ED
1515 } ifelse } def
1516 /GetArmB { ArmTypeB 0 eq { /xB2 ArmB AngleB cos mul xB1 add def /yB2 ArmB
1517 AngleB sin mul yB1 add def } { ArmTypeB 1 eq {{exch}} {{}} ifelse /Do ED
1518 ArmB AngleB XYPos OffsetB AngleB AddOffset yB add /yB2 ED xB add /xB2 ED
1519 } ifelse } def
1520 /InitNC { /b ED /a ED /NodeSepTypeB ED /NodeSepTypeA ED /NodeSepB ED
1521 /NodeSepA ED /OffsetB ED /OffsetA ED tx@NodeDict a known tx@NodeDict b
1522 known and dup { /NodeA a load def /NodeB b load def NodeA GetCenter /yA
1523 ED /xA ED NodeB GetCenter /yB ED /xB ED } if } def
1524 /LPutLine { 4 copy 3 -1 roll sub neg 3 1 roll sub Atan /NAngle ED 1 t sub
1525 mul 3 1 roll 1 t sub mul 4 1 roll t mul add /Y ED t mul add /X ED } def
1526 /LPutLines { mark LPutVar counttomark 2 div 1 sub /n ED t floor dup n gt
1527 { pop n 1 sub /t 1 def } { dup t sub neg /t ED } ifelse cvi 2 mul { pop
1528 } repeat LPutLine cleartomark } def
1529 /BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
1530 /t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
1531 mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
1532 sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
1533 add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
1534 y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
1535 mul 2 bx t mul mul add cx add atan /NAngle ED /Y ED /X ED } def
1536 /HPosBegin { yB yA ge { /t 1 t sub def } if /Y yB yA sub t mul yA add def
1537 } def
1538 /HPosEnd { /X Y yyA sub yyB yyA sub Div xxB xxA sub mul xxA add def
1539 /NAngle yyB yyA sub xxB xxA sub Atan def } def
1540 /HPutLine { HPosBegin /yyA ED /xxA ED /yyB ED /xxB ED HPosEnd  } def
1541 /HPutLines { HPosBegin yB yA ge { /check { le } def } { /check { ge } def
1542 } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { dup Y check { exit
1543 } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark HPosEnd 
1544 } def
1545 /VPosBegin { xB xA lt { /t 1 t sub def } if /X xB xA sub t mul xA add def
1546 } def
1547 /VPosEnd { /Y X xxA sub xxB xxA sub Div yyB yyA sub mul yyA add def
1548 /NAngle yyB yyA sub xxB xxA sub Atan def } def
1549 /VPutLine { VPosBegin /yyA ED /xxA ED /yyB ED /xxB ED VPosEnd  } def
1550 /VPutLines { VPosBegin xB xA ge { /check { le } def } { /check { ge } def
1551 } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { 1 index X check {
1552 exit } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark
1553 VPosEnd  } def
1554 /HPutCurve { gsave newpath /SaveLPutVar /LPutVar load def LPutVar 8 -2
1555 roll moveto curveto flattenpath /LPutVar [ {} {} {} {} pathforall ] cvx
1556 def grestore exec /LPutVar /SaveLPutVar load def } def
1557 /NCCoor { /AngleA yB yA sub xB xA sub Atan def /AngleB AngleA 180 add def
1558 GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 xA1 yA1 ] cvx def /LPutPos {
1559 LPutVar LPutLine } def /HPutPos { LPutVar HPutLine } def /VPutPos {
1560 LPutVar VPutLine } def LPutVar } def
1561 /NCLine { NCCoor tx@Dict begin ArrowA CP 4 2 roll ArrowB lineto pop pop
1562 end } def
1563 /NCLines { false NArray n 0 eq { NCLine } { 2 copy yA sub exch xA sub
1564 Atan /AngleA ED n 2 mul dup index exch index yB sub exch xB sub Atan
1565 /AngleB ED GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 n 2 mul 4 add 4 roll xA1
1566 yA1 ] cvx def mark LPutVar tx@Dict begin false Line end /LPutPos {
1567 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1568 ifelse } def
1569 /NCCurve { GetEdgeA GetEdgeB xA1 xB1 sub yA1 yB1 sub Pyth 2 div dup 3 -1
1570 roll mul /ArmA ED mul /ArmB ED /ArmTypeA 0 def /ArmTypeB 0 def GetArmA
1571 GetArmB xA2 yA2 xA1 yA1 tx@Dict begin ArrowA end xB2 yB2 xB1 yB1 tx@Dict
1572 begin ArrowB end curveto /LPutVar [ xA1 yA1 xA2 yA2 xB2 yB2 xB1 yB1 ]
1573 cvx def /LPutPos { t LPutVar BezierMidpoint } def /HPutPos { { HPutLines
1574 } HPutCurve } def /VPutPos { { VPutLines } HPutCurve } def } def
1575 /NCAngles { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate
1576 def xA2 yA2 mtrx transform pop xB2 yB2 mtrx transform exch pop mtrx
1577 itransform /y0 ED /x0 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 x0 y0 xA2
1578 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end /LPutVar [ xB1
1579 yB1 xB2 yB2 x0 y0 xA2 yA2 xA1 yA1 ] cvx def /LPutPos { LPutLines } def
1580 /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def
1581 /NCAngle { GetEdgeA GetEdgeB GetArmB /mtrx AngleA matrix rotate def xB2
1582 yB2 mtrx itransform pop xA1 yA1 mtrx itransform exch pop mtrx transform
1583 /y0 ED /x0 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 x0 y0 xA1 yA1
1584 tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA1 yA1 ]
1585 cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1586 VPutLines } def } def
1587 /NCBar { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate def
1588 xA2 yA2 mtrx itransform pop xB2 yB2 mtrx itransform pop sub dup 0 mtrx
1589 transform 3 -1 roll 0 gt { /yB2 exch yB2 add def /xB2 exch xB2 add def }
1590 { /yA2 exch neg yA2 add def /xA2 exch neg xA2 add def } ifelse mark ArmB
1591 0 ne { xB1 yB1 } if xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict
1592 begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx
1593 def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1594 VPutLines } def } def
1595 /NCDiag { GetEdgeA GetEdgeB GetArmA GetArmB mark ArmB 0 ne { xB1 yB1 } if
1596 xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end
1597 /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx def /LPutPos {
1598 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1599 def
1600 /NCDiagg { GetEdgeA GetArmA yB yA2 sub xB xA2 sub Atan 180 add /AngleB ED
1601 GetEdgeB mark xB1 yB1 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin
1602 false Line end /LPutVar [ xB1 yB1 xA2 yA2 xA1 yA1 ] cvx def /LPutPos {
1603 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1604 def
1605 /NCLoop { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate
1606 def xA2 yA2 mtrx transform loopsize add /yA3 ED /xA3 ED /xB3 xB2 yB2
1607 mtrx transform pop def xB3 yA3 mtrx itransform /yB3 ED /xB3 ED xA3 yA3
1608 mtrx itransform /yA3 ED /xA3 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2
1609 xB3 yB3 xA3 yA3 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false
1610 Line end /LPutVar [ xB1 yB1 xB2 yB2 xB3 yB3 xA3 yA3 xA2 yA2 xA1 yA1 ]
1611 cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1612 VPutLines } def } def
1613 % DG/SR modification begin - May 9, 1997 - Patch 1
1614 %/NCCircle { 0 0 NodesepA nodeA \tx@GetEdge pop xA sub 2 div dup 2 exp r
1615 %r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add
1616 %exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360
1617 %mul add dup 5 1 roll 90 sub \tx@PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED
1618 /NCCircle { NodeSepA 0 NodeA 0 GetEdge pop 2 div dup 2 exp r
1619 r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add
1620 exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360
1621 mul add dup 5 1 roll 90 sub PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED
1622 % DG/SR modification end
1623 } def /HPutPos { LPutPos } def /VPutPos { LPutPos } def r AngleA 90 sub a add
1624 AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c 57.2957 r
1625 Div def /y ED /x ED } def
1626 /NCBox { /d ED /h ED /AngleB yB yA sub xB xA sub Atan def /AngleA AngleB
1627 180 add def GetEdgeA GetEdgeB /dx d AngleB sin mul def /dy d AngleB cos
1628 mul neg def /hx h AngleB sin mul neg def /hy h AngleB cos mul def
1629 /LPutVar [ xA1 hx add yA1 hy add xB1 hx add yB1 hy add xB1 dx add yB1 dy
1630 add xA1 dx add yA1 dy add ] cvx def /LPutPos { LPutLines } def /HPutPos
1631 { xB yB xA yA LPutLine } def /VPutPos { HPutPos } def mark LPutVar
1632 tx@Dict begin false Polygon end } def
1633 /NCArcBox { /l ED neg /d ED /h ED /a ED /AngleA yB yA sub xB xA sub Atan
1634 def /AngleB AngleA 180 add def /tA AngleA a sub 90 add def /tB tA a 2
1635 mul add def /r xB xA sub tA cos tB cos sub Div dup 0 eq { pop 1 } if def
1636 /x0 xA r tA cos mul add def /y0 yA r tA sin mul add def /c 57.2958 r div
1637 def /AngleA AngleA a sub 180 add def /AngleB AngleB a add 180 add def
1638 GetEdgeA GetEdgeB /AngleA tA 180 add yA yA1 sub xA xA1 sub Pyth c mul
1639 sub def /AngleB tB 180 add yB yB1 sub xB xB1 sub Pyth c mul add def l 0
1640 eq { x0 y0 r h add AngleA AngleB arc x0 y0 r d add AngleB AngleA arcn }
1641 { x0 y0 translate /tA AngleA l c mul add def /tB AngleB l c mul sub def
1642 0 0 r h add tA tB arc r h add AngleB PtoC r d add AngleB PtoC 2 copy 6 2
1643 roll l arcto 4 { pop } repeat r d add tB PtoC l arcto 4 { pop } repeat 0
1644 0 r d add tB tA arcn r d add AngleA PtoC r h add AngleA PtoC 2 copy 6 2
1645 roll l arcto 4 { pop } repeat r h add tA PtoC l arcto 4 { pop } repeat }
1646 ifelse closepath /LPutVar [ x0 y0 r AngleA AngleB h d ] cvx def /LPutPos
1647 { LPutVar /d ED /h ED /AngleB ED /AngleA ED /r ED /y0 ED /x0 ED t 1 le {
1648 r h add AngleA 1 t sub mul AngleB t mul add dup 90 add /NAngle ED PtoC }
1649 { t 2 lt { /NAngle AngleB 180 add def r 2 t sub h mul t 1 sub d mul add
1650 add AngleB PtoC } { t 3 lt { r d add AngleB 3 t sub mul AngleA 2 t sub
1651 mul add dup 90 sub /NAngle ED PtoC } { /NAngle AngleA 180 add def r 4 t
1652 sub d mul t 3 sub h mul add add AngleA PtoC } ifelse } ifelse } ifelse
1653 y0 add /Y ED x0 add /X ED } def /HPutPos { LPutPos } def /VPutPos {
1654 LPutPos } def } def
1655 /Tfan { /AngleA yB yA sub xB xA sub Atan def GetEdgeA w xA1 xB sub yA1 yB
1656 sub Pyth Pyth w Div CLW 2 div mul 2 div dup AngleA sin mul yA1 add /yA1
1657 ED AngleA cos mul xA1 add /xA1 ED /LPutVar [ xA1 yA1 m { xB w add yB xB
1658 w sub yB } { xB yB w sub xB yB w add } ifelse xA1 yA1 ] cvx def /LPutPos
1659 { LPutLines } def /VPutPos@ { LPutVar flag { 8 4 roll pop pop pop pop }
1660 { pop pop pop pop 4 2 roll } ifelse } def /VPutPos { VPutPos@ VPutLine }
1661 def /HPutPos { VPutPos@ HPutLine } def mark LPutVar tx@Dict begin
1662 /ArrowA { moveto } def /ArrowB { } def false Line closepath end } def
1663 /LPutCoor { NAngle tx@Dict begin /NAngle ED end gsave CM STV CP Y sub neg
1664 exch X sub neg exch moveto setmatrix CP grestore } def
1665 /LPut { tx@NodeDict /LPutPos known { LPutPos } { CP /Y ED /X ED /NAngle 0
1666 def } ifelse LPutCoor  } def
1667 /HPutAdjust { Sin Cos mul 0 eq { 0 } { d Cos mul Sin div flag not { neg }
1668 if h Cos mul Sin div flag { neg } if 2 copy gt { pop } { exch pop }
1669 ifelse } ifelse s add flag { r add neg } { l add } ifelse X add /X ED }
1670 def
1671 /VPutAdjust { Sin Cos mul 0 eq { 0 } { l Sin mul Cos div flag { neg } if
1672 r Sin mul Cos div flag not { neg } if 2 copy gt { pop } { exch pop }
1673 ifelse } ifelse s add flag { d add } { h add neg } ifelse Y add /Y ED }
1674 def
1675 end
1676 % END pst-node.pro
1677
1678 %%EndProcSet
1679 %%BeginProcSet: solides.pro 0 0
1680 %!
1681 % PostScript prologue for pst-solides3d.tex.
1682 % Version 3.05, 2008/03/21
1683 %
1684 %% COPYRIGHT 2008 by Jean-Paul Vignault, Manuel Luque
1685 %%
1686 %% This program can be redistributed and/or modified under the terms
1687 %% of the LaTeX Project Public License Distributed from CTAN
1688 %% archives in directory macros/latex/base/lppl.txt.
1689 %
1690 /SolidesDict 100 dict def
1691 /SolidesbisDict 100 dict def
1692 SolidesDict begin
1693
1694 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1695 %% %% les variables globales gerees par PSTricks %%
1696 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1697 %% %% les lignes dessous sont a decommenter si l on veut utiliser le
1698 %% %% fichier solides.pro independamment du package PSTricks
1699 %% /Dobs 20 def
1700 %% /THETA 20 def
1701 %% /PHI 50 def
1702 %% /Decran 30 def
1703 %% /XpointVue {Dobs Cos1Cos2 mul} def
1704 %% /YpointVue {Dobs Sin1Cos2 mul} def
1705 %% /ZpointVue {Dobs Sin2 mul} def
1706 %% /xunit 28.14 def
1707 %% /solidhollow false def
1708 %% /solidbiface false def
1709 %% /xunit 28.45 def
1710 %% /tracelignedeniveau? true def
1711 %% /hauteurlignedeniveau 1 def
1712 %% /couleurlignedeniveau {rouge} def
1713 %% /linewidthlignedeniveau 4 def
1714 %% /solidgrid true def
1715 /aretescachees true def
1716 /defaultsolidmode 2 def
1717 /activationgestioncouleurs true def
1718
1719
1720 /fillstyle {} def
1721 /startest false def
1722 /cm {} def
1723 /cm_1 {} def
1724 /yunit {xunit} def
1725 /angle_repere 90 def
1726
1727 /hadjust 2.5 def
1728 /vadjust 2.5 def
1729
1730 /pointilles {
1731    [6.25 3.75] 1.25 setdash
1732 } def
1733 /stockcurrentcpath {} def
1734 /newarrowpath {} def
1735 /chaine 15 string def
1736
1737 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1738 %% choix d une fonte accentuee pour le .ps %%
1739 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1740 /ReEncode { exch findfont
1741 dup length dict begin { 1 index /FID eq {pop pop} {def} ifelse
1742 }forall /Encoding ISOLatin1Encoding def currentdict end definefont
1743 pop }bind def
1744 /Font /Times-Roman /ISOfont ReEncode /ISOfont def
1745 %Font findfont 10 scalefont setfont
1746
1747 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1748 %% extrait de color.pro pour pouvoir recuperer ses couleurs %%
1749 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1750 /GreenYellow{0.15 0 0.69 0 setcmykcolor}def
1751 /Yellow{0 0 1 0 setcmykcolor}def
1752 /Goldenrod{0 0.10 0.84 0 setcmykcolor}def
1753 /Dandelion{0 0.29 0.84 0 setcmykcolor}def
1754 /Apricot{0 0.32 0.52 0 setcmykcolor}def
1755 /Peach{0 0.50 0.70 0 setcmykcolor}def
1756 /Melon{0 0.46 0.50 0 setcmykcolor}def
1757 /YellowOrange{0 0.42 1 0 setcmykcolor}def
1758 /Orange{0 0.61 0.87 0 setcmykcolor}def
1759 /BurntOrange{0 0.51 1 0 setcmykcolor}def
1760 /Bittersweet{0 0.75 1 0.24 setcmykcolor}def
1761 /RedOrange{0 0.77 0.87 0 setcmykcolor}def
1762 /Mahogany{0 0.85 0.87 0.35 setcmykcolor}def
1763 /Maroon{0 0.87 0.68 0.32 setcmykcolor}def
1764 /BrickRed{0 0.89 0.94 0.28 setcmykcolor}def
1765 /Red{0 1 1 0 setcmykcolor}def
1766 /OrangeRed{0 1 0.50 0 setcmykcolor}def
1767 /RubineRed{0 1 0.13 0 setcmykcolor}def
1768 /WildStrawberry{0 0.96 0.39 0 setcmykcolor}def
1769 /Salmon{0 0.53 0.38 0 setcmykcolor}def
1770 /CarnationPink{0 0.63 0 0 setcmykcolor}def
1771 /Magenta{0 1 0 0 setcmykcolor}def
1772 /VioletRed{0 0.81 0 0 setcmykcolor}def
1773 /Rhodamine{0 0.82 0 0 setcmykcolor}def
1774 /Mulberry{0.34 0.90 0 0.02 setcmykcolor}def
1775 /RedViolet{0.07 0.90 0 0.34 setcmykcolor}def
1776 /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}def
1777 /Lavender{0 0.48 0 0 setcmykcolor}def
1778 /Thistle{0.12 0.59 0 0 setcmykcolor}def
1779 /Orchid{0.32 0.64 0 0 setcmykcolor}def
1780 /DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}def
1781 /Purple{0.45 0.86 0 0 setcmykcolor}def
1782 /Plum{0.50 1 0 0 setcmykcolor}def
1783 /Violet{0.79 0.88 0 0 setcmykcolor}def
1784 /RoyalPurple{0.75 0.90 0 0 setcmykcolor}def
1785 /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}def
1786 /Periwinkle{0.57 0.55 0 0 setcmykcolor}def
1787 /CadetBlue{0.62 0.57 0.23 0 setcmykcolor}def
1788 /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}def
1789 /MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}def
1790 /NavyBlue{0.94 0.54 0 0 setcmykcolor}def
1791 /RoyalBlue{1 0.50 0 0 setcmykcolor}def
1792 /Blue{1 1 0 0 setcmykcolor}def
1793 /Cerulean{0.94 0.11 0 0 setcmykcolor}def
1794 /Cyan{1 0 0 0 setcmykcolor}def
1795 /ProcessBlue{0.96 0 0 0 setcmykcolor}def
1796 /SkyBlue{0.62 0 0.12 0 setcmykcolor}def
1797 /Turquoise{0.85 0 0.20 0 setcmykcolor}def
1798 /TealBlue{0.86 0 0.34 0.02 setcmykcolor}def
1799 /Aquamarine{0.82 0 0.30 0 setcmykcolor}def
1800 /BlueGreen{0.85 0 0.33 0 setcmykcolor}def
1801 /Emerald{1 0 0.50 0 setcmykcolor}def
1802 /JungleGreen{0.99 0 0.52 0 setcmykcolor}def
1803 /SeaGreen{0.69 0 0.50 0 setcmykcolor}def
1804 /Green{1 0 1 0 setcmykcolor}def
1805 /ForestGreen{0.91 0 0.88 0.12 setcmykcolor}def
1806 /PineGreen{0.92 0 0.59 0.25 setcmykcolor}def
1807 /LimeGreen{0.50 0 1 0 setcmykcolor}def
1808 /YellowGreen{0.44 0 0.74 0 setcmykcolor}def
1809 /SpringGreen{0.26 0 0.76 0 setcmykcolor}def
1810 /OliveGreen{0.64 0 0.95 0.40 setcmykcolor}def
1811 /RawSienna{0 0.72 1 0.45 setcmykcolor}def
1812 /Sepia{0 0.83 1 0.70 setcmykcolor}def
1813 /Brown{0 0.81 1 0.60 setcmykcolor}def
1814 /Tan{0.14 0.42 0.56 0 setcmykcolor}def
1815 /Gray{0 0 0 0.50 setcmykcolor}def
1816 /Black{0 0 0 1 setcmykcolor}def
1817 /White{0 0 0 0 setcmykcolor}def
1818 %% fin de l extrait color.pro
1819
1820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1821 %%%%             autres couleurs                        %%%%
1822 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1823
1824 /bleu {0 0 1 setrgbcolor} def
1825 /rouge {1 0 0 setrgbcolor} def
1826 /vert {0 .5 0 setrgbcolor} def
1827 /gris {.4 .4 .4 setrgbcolor} def
1828 /jaune {1 1 0 setrgbcolor} def
1829 /noir {0 0 0 setrgbcolor} def
1830 /blanc {1 1 1 setrgbcolor} def
1831 /orange {1 .65 0 setrgbcolor} def
1832 /rose {1 .01 .58  setrgbcolor} def
1833 /cyan {1 0 0 0 setcmykcolor} def
1834 /magenta {0 1 0 0 setcmykcolor} def
1835
1836 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1837 %%%%             definition du point de vue             %%%%
1838 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1839 %% pour la 3D conventionnelle
1840 %% Dony : graphisme scientifique : page 187
1841 %% Editeur : Masson
1842
1843 %% calcul des coefficients de la matrice
1844 %% de transformation
1845 /Sin1 {THETA sin} def
1846 /Sin2 {PHI sin} def
1847 /Cos1 {THETA cos} def
1848 /Cos2 {PHI cos} def
1849 /Cos1Sin2 {Cos1 Sin2 mul} def
1850 /Sin1Sin2 {Sin1 Sin2 mul} def
1851 /Cos1Cos2 {Cos1 Cos2 mul} def
1852 /Sin1Cos2 {Sin1 Cos2 mul} def
1853
1854 /3dto2d {
1855 6 dict begin
1856    /Zcote exch def
1857    /Yordonnee exch def
1858    /Xabscisse exch def
1859    /xObservateur
1860       Xabscisse Sin1 mul neg Yordonnee Cos1 mul add
1861    def
1862    /yObservateur
1863       Xabscisse Cos1Sin2 mul neg Yordonnee Sin1Sin2 mul sub Zcote Cos2
1864       mul add
1865    def
1866    /zObservateur
1867       Xabscisse neg Cos1Cos2 mul Yordonnee Sin1Cos2 mul sub Zcote Sin2
1868       mul sub Dobs add
1869    def
1870    %% maintenant on depose les resultats sur la pile
1871    Decran xObservateur mul zObservateur div cm
1872    Decran yObservateur mul zObservateur div cm
1873 end
1874 } def
1875
1876 /getpointVue {
1877    XpointVue
1878    YpointVue
1879    ZpointVue
1880 } def
1881
1882 /GetCamPos {
1883    getpointVue
1884 } def
1885
1886 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1887 %%%%         jps modifie pour PSTricks                  %%%%
1888 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1889
1890 /solid {continu} def
1891 /dashed {pointilles} def
1892
1893 %%% les 3 procedures utilisees pour transformer les depots de AlgToPs en nombres
1894 /pstrickactionR3 { 
1895 3 dict begin 
1896   /len@3 exch def 
1897   /len@2 exch def 
1898   /len@1 exch def 
1899   len@1 exec 
1900   len@2 exec 
1901   len@3 exec 
1902 end 
1903 } def 
1904
1905 /pstrickactionR2 {
1906    exec exch exec exch
1907 } def
1908
1909 /pstrickactionR {
1910    exec
1911 } def
1912
1913 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1914 %%%%             geometrie basique                      %%%%
1915 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1916
1917 %% syntaxe~: [x1 y1 ... xn yn] ligne
1918 /ligne {
1919 gsave
1920    newpath
1921       dup 0 getp smoveto
1922       ligne_
1923       starfill
1924    stroke
1925 grestore
1926 } def
1927
1928 %% syntaxe~: [x1 y1 ... xn yn] ligne_
1929 /ligne_ {
1930    reversep
1931    aload length 2 idiv
1932    {
1933       slineto
1934    } repeat
1935 } def
1936
1937 %% syntaxe~: [x1 y1 ... xn yn] polygone
1938 /polygone* {
1939 1 dict begin
1940    /startest {true} def
1941    polygone
1942 end
1943 } def
1944
1945 /polygone {
1946    gsave
1947       newpath
1948          aload length 2 idiv
1949          3 copy pop
1950          smoveto
1951          {
1952             slineto
1953          } repeat
1954       closepath
1955       starfill
1956       currentlinewidth 0 eq {} {stroke} ifelse
1957    grestore
1958 } def
1959
1960 %% syntaxe : x y point
1961 /point {
1962 gsave
1963    1 setlinecap
1964    newpath
1965       smoveto
1966       0 0 rlineto
1967       5 setlinewidth
1968    stroke
1969 grestore
1970 } def
1971
1972 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1973 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1974 %%%%                                                    %%%%
1975 %%%%          insertion librairie jps                   %%%%
1976 %%%%                                                    %%%%
1977 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1978 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1979
1980 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1981 %%%%              le repere jps                         %%%%
1982 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1983
1984 %%%%% ### AAAopacity ###
1985 %% les parametres pour la gestion de la transparence
1986 /setstrokeopacity {
1987    /strokeopacity exch def
1988 } def
1989 /setfillopacity {
1990   /fillopacity exch def
1991 } def
1992 %% d apres un code de Jean-Michel Sarlat
1993 %% http://melusine.eu.org/syracuse/swf/pdf2swf/setdash/
1994 %% Mise en reserve de la procedure stroke originelle.
1995 /sysstroke {systemdict /stroke get exec} def
1996 /sysfill {systemdict /fill get exec} def
1997 % Mise en place de la nouvelle procedure
1998 /stroke {
1999    /strokeopacity where {
2000       /strokeopacity get
2001    } {
2002       1
2003    } ifelse
2004    .setopacityalpha sysstroke
2005 } def
2006 /fill {
2007    /fillopacity where {
2008       /fillopacity get
2009    } {
2010       1
2011    } ifelse
2012    .setopacityalpha sysfill
2013 } def
2014
2015 %%%%% ### AAAscale ###
2016 %%%%%%%%%%%%%%%% les deplacements a l echelle %%%%%%%%%%%%%%%%%%%
2017
2018  /v@ct_I {xunit 0} def
2019  /v@ct_J {angle_repere cos yunit mul angle_repere sin yunit mul} def
2020
2021 /xscale {} def
2022 /yscale {} def
2023
2024 /xscale-1 {} def
2025 /yscale-1 {} def
2026
2027 /gtransform {} def
2028 /gtransform-1 {} def
2029
2030 /jtoppoint {
2031 2 dict begin
2032    gtransform
2033    /y exch yscale def
2034    /x exch xscale def
2035    v@ct_I x mulv
2036    v@ct_J y mulv
2037    addv
2038 end
2039 } def
2040
2041 /rptojpoint {
2042    xtranslate ytranslate 
2043    3 1 roll         %% xA yB yA xB 
2044    4 1 roll         %% xB xA yB yA 
2045    sub neg 3 1 roll %% yB-yA xB xA 
2046    sub neg exch
2047    ptojpoint
2048 } def
2049
2050 /rptoppoint {
2051    xtranslate ytranslate 
2052    3 1 roll         %% xA yB yA xB 
2053    4 1 roll         %% xB xA yB yA 
2054    sub neg 3 1 roll %% yB-yA xB xA 
2055    sub neg exch
2056 } def
2057
2058 /ptojpoint {
2059 4 dict begin
2060    /Y exch yscale-1 def
2061    /X exch xscale-1 def
2062    /y Y yunit angle_repere sin mul div def
2063    /x X y yunit mul angle_repere cos mul sub xunit div def
2064    x y
2065    gtransform-1
2066 end
2067 } def
2068
2069 /smoveto {
2070    jtoppoint
2071    moveto
2072 } def
2073
2074 /srmoveto {
2075    jtoppoint
2076    rmoveto
2077 } def
2078
2079 /slineto {
2080    jtoppoint
2081    lineto
2082 } def
2083
2084 /srlineto {
2085    jtoppoint
2086    rlineto
2087 } def
2088
2089 /stranslate {
2090    jtoppoint
2091    translate
2092 } def
2093
2094 %%%%% ### fin insertion ###
2095
2096 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2097 %%%%                  les tests                         %%%%
2098 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2099
2100 %%%%% ### isbool ###
2101 %% syntaxe : any isbool --> booleen
2102 /isbool {
2103    type (booleantype) cvn eq
2104 } def
2105
2106 %%%%% ### isarray ###
2107 %% syntaxe : any isarray --> booleen
2108 /isarray {
2109    type (arraytype) cvn eq
2110 } def
2111
2112 %%%%% ### isstring ###
2113 %% syntaxe : any isstring --> booleen
2114 /isstring {
2115    type (stringtype) cvn eq
2116 } def
2117
2118 %%%%% ### isinteger ###
2119 %% syntaxe : any isinteger --> booleen
2120 /isinteger {
2121    type (integertype) cvn eq
2122 } def
2123
2124 %%%%% ### isnum ###
2125 %% syntaxe : any isnum --> booleen
2126 /isnum {
2127    dup isreal 
2128    exch isinteger or
2129 } def
2130
2131 %%%%% ### isreal ###
2132 %% syntaxe : any isreal --> booleen
2133 /isreal {
2134    type (realtype) cvn eq
2135 } def
2136
2137 %%%%% ### eq ###
2138 %% syntaxe : A B eqp3d --> booleen = true si les points A et B sont identiques
2139 /eqp3d {
2140                %% x1 y1 z1 x2 y2 z2
2141    4 -1 roll   %% x1 y1 x2 y2 z2 z1 
2142    eq {        %% x1 y1 x2 y2 
2143       eqp
2144    } {
2145       pop pop pop pop false
2146    } ifelse
2147 } def
2148
2149 %% syntaxe : A B eqp --> booleen = true si les points A et B sont identiques
2150 /eqp {
2151    3 -1 roll
2152    eq 
2153       {
2154          eq 
2155             {true} 
2156             {false}
2157          ifelse
2158       }
2159       {pop pop false}
2160    ifelse
2161 } def
2162
2163 %% syntaxe : z z' eqc --> true si z = z', false sinon
2164 /eqc {
2165    eqp
2166 } def
2167
2168 %%%%% ### fin insertion ###
2169
2170 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2171 %%%%                conversions de types                %%%%
2172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2173
2174 %%%%% ### astr2str ###
2175 %% syntaxe : array str astr2str --> str
2176 %% convertit le contenu de array en chaines de caracteres puis les
2177 %% concatene avec str, en inserant un caractere "space" apres chaque
2178 %% element du tableau array
2179 /astr2str {
2180 5 dict begin
2181    /str exch def
2182    /table exch def
2183    /n table length def
2184    n 0 eq {
2185       str
2186    } {
2187       table 0 n 1 sub getinterval
2188       table n 1 sub get (                               ) cvs
2189       ( ) append
2190       str append
2191       astr2str
2192    } ifelse
2193 end
2194 } def
2195
2196 %%%%% ### numstr2array ###
2197 %% syntaxe : str numstr2array -> array
2198 %% ou str est une chaine de nombres entiers separes par des espaces
2199 %% et array est constitue des elements numeriques entiers de string.
2200 %% exemple :
2201 %% (0 12 4 54) --> [0 12 4 54]
2202 /numstr2array {
2203 3 dict begin
2204    /str exch def
2205    /n str length def
2206    /j -1 def
2207    [
2208       0 1 n 1 sub {
2209          /i exch def
2210          /j j 1 add store
2211          str i get
2212          dup 32 eq {
2213             %% c est un espace
2214             /j -1 store
2215             pop
2216          } {
2217             j 1 ge {
2218                exch 10 mul 48 sub add
2219             } {
2220                48 sub
2221             } ifelse
2222          } ifelse
2223       } for
2224    ]
2225 end
2226 } def
2227
2228 %% syntaxe : array numstr2array -> array
2229 /arraynumstr2arrayarray {
2230    {numstr2array} apply
2231 } def
2232
2233 %%%%% ### fin insertion ###
2234
2235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2236 %%%%                macros de projection                %%%%
2237 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2238
2239 %%%%% ### projtext ###
2240  /initpr@jtext {
2241 5 dict begin
2242    dup isbool {
2243       /mybool exch def
2244    } {
2245       /mybool true def
2246    } ifelse
2247    dup isarray {
2248       %% c est un planprojpath
2249       /type_plan_proj true def
2250       /table exch def
2251       /z0 exch def
2252       /y0 exch def
2253       /x0 exch def
2254       0 0
2255    } {
2256       %% c est un solidprojpath
2257       /type_plan_proj false def
2258       %% y a-t-il un str2
2259       dup isstring {
2260          /str2 exch def
2261       } {
2262          /str2 {} def
2263       } ifelse
2264       %% y a-t-il un alpha
2265       2 copy pop issolid {
2266          /alpha 0 def
2267       } {
2268          /alpha exch def
2269       } ifelse
2270       /i exch def
2271       /solid exch def
2272       0 0
2273    } ifelse
2274 } def
2275  /closepr@jtext {
2276    type_plan_proj {
2277       x0 y0 z0 table mybool projpath
2278    } {
2279       solid i alpha str2 mybool projpath
2280    } ifelse
2281    fill
2282    stroke
2283 end
2284 } def
2285
2286 %% syntaxe : str x0 y0 z0 [normal_vect] ultextp3d --> -
2287 %% syntaxe : str x0 y0 z0 [normal_vect] bool ultextp3d --> -
2288 %% syntaxe : str1 solid i str2 ultextp3d --> -
2289 %% syntaxe : str1 solid i str2 bool ultextp3d --> -
2290 %% syntaxe : str1 solid i alpha str2 bool ultextp3d --> -
2291 /ultextp3d {initpr@jtext ultext_ closepr@jtext} def
2292 /cltextp3d {initpr@jtext cltext_ closepr@jtext} def
2293 /bltextp3d {initpr@jtext bltext_ closepr@jtext} def
2294 /dltextp3d {initpr@jtext bltext_ closepr@jtext} def
2295 /ubtextp3d {initpr@jtext ubtext_ closepr@jtext} def
2296 /cbtextp3d {initpr@jtext cbtext_ closepr@jtext} def
2297 /bbtextp3d {initpr@jtext bbtext_ closepr@jtext} def
2298 /dbtextp3d {initpr@jtext bbtext_ closepr@jtext} def
2299 /uctextp3d {initpr@jtext uctext_ closepr@jtext} def
2300 /cctextp3d {initpr@jtext cctext_ closepr@jtext} def
2301 /bctextp3d {initpr@jtext bctext_ closepr@jtext} def
2302 /dctextp3d {initpr@jtext bctext_ closepr@jtext} def
2303 /urtextp3d {initpr@jtext urtext_ closepr@jtext} def
2304 /crtextp3d {initpr@jtext crtext_ closepr@jtext} def
2305 /brtextp3d {initpr@jtext brtext_ closepr@jtext} def
2306 /drtextp3d {initpr@jtext brtext_ closepr@jtext} def
2307
2308 %%%%% ### currentppathtransform ###
2309 %% syntaxe : {f} currentppathtransform --> applique la transformation f
2310 %% au chemin courant
2311 /currentppathtransform {
2312 6 dict begin
2313    /warp exch def
2314    %% pour remplacer 'move'
2315    /warpmove{
2316       2 index {
2317         newpath
2318       } if
2319       warp moveto
2320       pop false
2321    } def
2322
2323    %% pour remplacer 'lineto'
2324    /warpline {
2325       warp lineto
2326    } bind def
2327
2328    %% pour remplacer 'curveto'
2329    /warpcurve {
2330       6 2 roll warp
2331       6 2  roll warp
2332       6 2 roll warp
2333       curveto
2334    }  bind def
2335
2336    true
2337    { warpmove } {  warpline } { warpcurve } { closepath } pathforall
2338    pop
2339 end
2340 } def
2341
2342 %% syntaxe : {f} currentpathtransform --> applique la transformation f
2343 %% au chemin courant
2344 /currentpathtransform {
2345 7 dict begin
2346    /transform exch def
2347    /warp {ptojpoint transform} def
2348    %% pour remplacer 'move'
2349    /warpmove{
2350       2 index {
2351         newpath
2352       } if
2353       warp smoveto
2354       pop false
2355    } def
2356
2357    %% pour remplacer 'lineto'
2358    /warpline {
2359       warp slineto
2360    } bind def
2361
2362    %% pour remplacer 'curveto'
2363    /warpcurve {
2364       6 2 roll warp
2365       6 2  roll warp
2366       6 2 roll warp
2367       scurveto
2368    }  bind def
2369
2370    true
2371    { warpmove } {  warpline } { warpcurve } { closepath } pathforall
2372    pop
2373 end
2374 } def
2375
2376 %%%%% ### normalvect_to_orthobase ###
2377 %% syntaxe : [normal_vect] normalvect_to_orthobase
2378 %%    --> imI imJ imK
2379 /normalvect_to_orthobase {
2380 4 dict begin
2381    dup length 3 eq {
2382       aload pop normalize3d /normal_vect defpoint3d
2383       normal_vect -1 0 0 eqp3d {
2384          /imageI {0 -1 0} def
2385          /imageK {-1 0 0} def
2386          /imageJ {0 0 1} def 
2387       } {
2388          %% on calcule l image de la base (I,J,K)
2389          /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def
2390          /imageK {normal_vect} def
2391          /imageI {imageJ imageK vectprod3d} def
2392          1 0 0 imageK angle3d 0 eq {
2393             0 1 0 normal_vect vectprod3d /imageI defpoint3d
2394             /imageJ {0 1 0} def
2395             normal_vect /imageK defpoint3d
2396          } if
2397       } ifelse
2398    } {
2399       dup length 6 eq {
2400          aload pop
2401          normalize3d /imageK defpoint3d
2402          normalize3d /imageI defpoint3d
2403          imageK imageI vectprod3d /imageJ defpoint3d
2404       } {
2405          dup length 7 eq {
2406             aload pop 
2407             /alpha exch 2 div def
2408             normalize3d /imageK defpoint3d
2409             normalize3d /imageI defpoint3d
2410             imageK imageI vectprod3d /imageJ defpoint3d
2411             %% et ensuite, on fait tourner la base autour de imageK
2412             imageI alpha cos mulv3d
2413             imageJ alpha sin mulv3d
2414             addv3d
2415    
2416             imageI alpha sin neg mulv3d
2417             imageJ alpha cos mulv3d
2418             addv3d
2419    
2420             /imageJ defpoint3d
2421             /imageI defpoint3d
2422          } {
2423             %% length = 4
2424             aload pop
2425             /alpha exch def
2426             normalize3d /normal_vect defpoint3d
2427    
2428             normal_vect -1 0 0 eqp3d {
2429                /imageI {0 -1 0} def
2430                /imageK {-1 0 0} def
2431                /imageJ {0 0 1} def 
2432             } {
2433                %% on calcule l image de la base (I,J,K)
2434                /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def
2435                /imageK {normal_vect} def
2436                /imageI {imageJ imageK vectprod3d} def
2437                1 0 0 imageK angle3d 0 eq {
2438                   0 1 0 normal_vect vectprod3d /imageI defpoint3d
2439                   /imageJ {0 1 0} def
2440                   normal_vect /imageK defpoint3d
2441                } if
2442             } ifelse
2443          } ifelse
2444
2445          %% et ensuite, on fait tourner la base autour de imageK
2446          imageI alpha cos mulv3d
2447          imageJ alpha sin mulv3d
2448          addv3d
2449
2450          imageI alpha sin neg mulv3d
2451          imageJ alpha cos mulv3d
2452          addv3d
2453
2454          /imageJ defpoint3d
2455          /imageI defpoint3d
2456       } ifelse
2457    } ifelse
2458    imageI
2459    imageJ
2460    imageK
2461 end
2462 } def
2463
2464 %%%%% ### projpath ###
2465 %% syntaxe : x y z [normal] projpath --> planprojpath
2466 %% syntaxe : x y z [normal] bool projpath --> planprojpath
2467 %% syntaxe : solid i projpath --> solidprojpath
2468 %% syntaxe : solid i bool projpath --> solidprojpath
2469 %% syntaxe : solid i str bool projpath --> solidprojpath
2470 %% syntaxe : solid i alpha str bool projpath --> solidprojpath
2471 /projpath {
2472 2 dict begin
2473    dup isbool {
2474       /mybool exch def
2475    } {
2476       /mybool true def
2477    } ifelse
2478    dup isarray {
2479       mybool planprojpath
2480    } {
2481       mybool solidprojpath
2482    } ifelse
2483 end
2484 } def
2485
2486 %% syntaxe : solid i str bool solidprojpath --> -
2487 %% ou
2488 %% syntaxe : solid i alpha str bool solidprojpath --> -
2489 %% projette le chemin courant sur la face i du solide, apres
2490 %% eventuellement une rotation d angle alpha autour de la normale
2491 %% bool : pour savoir si on tient compte de la visibilite
2492 /solidprojpath {
2493 5 dict begin
2494    /visibility exch def
2495    dup isstring {
2496       /option exch def
2497    } if
2498    2 copy pop
2499    issolid {
2500       /alpha 0 def
2501    } {
2502       /alpha exch def
2503    } ifelse
2504    /i exch def
2505    /solid exch def
2506    solid issolid not {
2507       (Error : mauvais type d argument dans solidprojpath) ==
2508    } if
2509    /n solid solidnombrefaces def
2510    i n 1 sub le {
2511       visibility not solid i solidfacevisible? or {
2512          currentdict /option known {
2513             option cvx exec
2514          } {
2515             solid i solidcentreface 
2516          } ifelse
2517          [
2518             solid 0 i solidgetsommetface 
2519             solid 1 i solidgetsommetface 
2520             vecteur3d normalize3d
2521             solid i solidnormaleface alpha 
2522          ] false planprojpath 
2523       } {
2524          newpath 0 0 smoveto
2525       } ifelse
2526    } {
2527       (Error : indice trop grand dans solidprojpath) ==
2528       quit
2529    } ifelse
2530 end
2531 } def
2532
2533 %% syntaxe : x y z [normal] bool planprojpath
2534 /planprojpath {
2535 6 dict begin
2536    /visibility exch def
2537    %% on calcule l image de la base (I,J,K)
2538    normalvect_to_orthobase
2539    /imageK defpoint3d
2540    /imageJ defpoint3d
2541    /imageI defpoint3d
2542    /z exch def
2543    /y exch def
2544    /x exch def
2545
2546    visibility not x y z imageK planvisible? or {
2547       {ptojpoint 0
2548       imageI
2549       imageJ
2550       imageK
2551       transformpoint3d
2552       x y z addv3d
2553       3dto2d jtoppoint} currentppathtransform
2554    } {
2555       newpath
2556    } ifelse
2557 end
2558 } def
2559
2560 %%%%% ### fin insertion ###
2561
2562 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2563 %%%%          fonctions numeriques                      %%%%
2564 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2565
2566 %%%%% ### courbeparam ###
2567 /setresolution {
2568    /resolution exch def
2569 } def
2570 /resolution 200 def
2571
2572 /courbe_dic 2 dict def
2573 courbe_dic /X {} put
2574 courbe_dic /Y {} put
2575
2576 %% syntaxe : tmin tmax C@urbeparam_
2577  /C@urbeparam_ {
2578 6 dict begin
2579    /tmax@ exch def
2580    /tmin@ exch def
2581    /t tmin@ def
2582    /dt tmax@ tmin@ sub resolution 1 sub div def
2583    tmin@ courbe_dic /X get exec
2584    pstrickactionR
2585    tmin@ courbe_dic /Y get exec
2586    pstrickactionR
2587    smoveto
2588    resolution 1 sub
2589    {
2590       t courbe_dic /X get exec
2591       pstrickactionR
2592       t courbe_dic /Y get exec
2593       pstrickactionR
2594       slineto
2595
2596       /t t dt add store                      %% on incremente
2597    }
2598    repeat
2599    tmax@ courbe_dic /X get exec
2600    pstrickactionR
2601    tmax@ courbe_dic /Y get exec
2602    pstrickactionR
2603    slineto
2604 end
2605 } def
2606
2607 %% syntaxe : tmin tmax {X} {Y} Courbeparam_
2608 /Courbeparam_ {
2609    courbe_dic exch /Y exch put
2610    courbe_dic exch /X exch put
2611    C@urbeparam_
2612 } def
2613
2614 %% syntaxe : {X} {Y} courbeparam_
2615 /courbeparam_ {
2616    tmin tmax
2617    4 -1 roll
2618    4 -1 roll
2619    Courbeparam_
2620 } def
2621
2622 %% syntaxe : tmin tmax {X} {Y} Courbeparam
2623 /Courbeparam {
2624 gsave
2625 6 dict begin
2626    dup isstring
2627       {
2628          /option exch def
2629       }
2630    if
2631    courbe_dic exch /Y exch put
2632    courbe_dic exch /X exch put
2633    /tmax exch def
2634    /tmin exch def
2635
2636    newpath
2637       tmin courbe_dic /X get exec
2638       pstrickactionR
2639       tmin courbe_dic /Y get exec
2640       pstrickactionR
2641       smoveto                        %% on commence le chemin
2642       tmin tmax C@urbeparam_
2643       starfill
2644
2645    stockcurrentcpath
2646    newarrowpath
2647    currentdict /option known
2648       {
2649          /dt tmax tmin sub resolution 1 sub div def
2650          tmin dt add courbe_dic /X get exec
2651          tmin dt add courbe_dic /Y get exec
2652          tmin courbe_dic /X get exec
2653          tmin courbe_dic /Y get exec
2654          arrowpath0
2655          tmax dt sub courbe_dic /X get exec
2656          tmax dt sub courbe_dic /Y get exec
2657          tmax courbe_dic /X get exec
2658          tmax courbe_dic /Y get exec
2659          currentdict /dt undef
2660          arrowpath1
2661          option
2662          gere_arrowhead
2663       }
2664    if
2665
2666    currentlinewidth 0 eq {} {stroke} ifelse
2667
2668 end
2669 grestore
2670 } def
2671
2672 %% syntaxe : {X} {Y} courbeparam
2673 /courbeparam {
2674    dup isstring
2675       {
2676          tmin tmax
2677          5 -1 roll
2678          5 -1 roll
2679          5 -1 roll
2680       }
2681       {
2682          tmin tmax
2683          4 -1 roll
2684          4 -1 roll
2685       }
2686    ifelse
2687    Courbeparam
2688 } def
2689
2690 %% syntaxe : tmin tmax {X} {Y} Courbeparam*
2691 /Courbeparam* {
2692 1 dict begin
2693    /startest {true} def
2694    Courbeparam
2695 end
2696 } def
2697
2698 %% syntaxe : {X} {Y} courbeparam*
2699 /courbeparam* {
2700 1 dict begin
2701    /startest {true} def
2702    courbeparam
2703 end
2704 } def
2705
2706 %%%%% ### courbe ###
2707 %% syntaxe : {f} courbe
2708 /courbe {
2709    dup isstring   %% y a-t-il une option de fin de ligne ?
2710       {
2711          xmin xmax 
2712          {} 
2713          5 -1 roll
2714          5 -1 roll
2715       }
2716       {
2717          xmin xmax 
2718          {} 
2719          4 -1 roll
2720       }
2721    ifelse
2722    Courbeparam
2723 } def
2724
2725 %% syntaxe : mini maxi {f} Courbe
2726 /Courbe {
2727    dup isstring {
2728       {}
2729       3 -1 roll
2730       3 -1 roll
2731    } {
2732       {}
2733       2 -1 roll
2734    } ifelse
2735    Courbeparam
2736 } def
2737
2738 %% syntaxe : {f} courbe_
2739 /courbe_ {
2740    xmin xmax 
2741    {} 
2742    4 -1 roll
2743    Courbeparam_
2744 } def
2745
2746 %% syntaxe : mini maxi {f} Courbe_
2747 /Courbe_ {
2748    {}
2749    2 -1 roll
2750    Courbeparam_
2751 } def
2752
2753 %% syntaxe : mini maxi {f} Courbe*
2754 /Courbe* {
2755 1 dict begin
2756    /startest {true} def
2757    Courbe
2758 end
2759 } def
2760
2761 %% syntaxe : {f} courbe*
2762 /courbe* {
2763 1 dict begin
2764    /startest {true} def
2765    courbe
2766 end
2767 } def
2768
2769 %%%%% ### courbeR2 ###
2770 %% syntaxe : tmin tmax C@urbeR2_
2771  /C@urbeR2_ {
2772 6 dict begin
2773    /tmax@ exch def
2774    /tmin@ exch def
2775    /t tmin@ def
2776    /dt tmax@ tmin@ sub resolution 1 sub div def
2777    tmin@ courbe_dic /X get exec
2778    pstrickactionR2
2779    smoveto
2780    /t t dt add store
2781    resolution 2 sub
2782    {
2783       t courbe_dic /X get exec
2784       pstrickactionR2
2785       slineto
2786       /t t dt add store                      %% on incremente
2787    }
2788    repeat
2789    tmax@ courbe_dic /X get exec
2790    pstrickactionR2
2791    slineto
2792 end
2793 } def
2794
2795 %% syntaxe : tmin tmax {X} CourbeR2_
2796 /CourbeR2_ {
2797    courbe_dic exch /X exch put
2798    C@urbeR2_
2799 } def
2800
2801 %% syntaxe : {X} courbeR2_
2802 /courbeR2_ {
2803    tmin tmax
2804    3 -1 roll
2805    3 -1 roll
2806    CourbeR2_
2807 } def
2808
2809 %% syntaxe : tmin tmax {X} CourbeR2
2810 /CourbeR2+ {
2811 2 dict begin
2812    /slineto {} def
2813    /smoveto {} def
2814    CourbeR2
2815 end
2816 } bind def
2817
2818 /CourbeR2 {
2819 gsave
2820 6 dict begin
2821    dup isstring
2822       {
2823          /option exch def
2824       }
2825    if
2826    courbe_dic exch /X exch put
2827    /tmax exch def
2828    /tmin exch def
2829
2830    newpath
2831       tmin tmax C@urbeR2_
2832       starfill
2833    currentlinewidth 0 eq {} {stroke} ifelse
2834
2835 end
2836 grestore
2837 } def
2838
2839 %% syntaxe : {X} courbeR2
2840 /courbeR2 {
2841    tmin tmax
2842    3 -1 roll
2843    CourbeR2
2844 } def
2845
2846 %% syntaxe : tmin tmax {X} CourbeR2*
2847 /CourbeR2* {
2848 1 dict begin
2849    /startest {true} def
2850    CourbeR2
2851 end
2852 } def
2853
2854 %% syntaxe : {X} {Y} courbeR2*
2855 /courbeR2* {
2856 1 dict begin
2857    /startest {true} def
2858    courbeR2
2859 end
2860 } def
2861
2862 %%%%% ### courbeR3 ###
2863 %% syntaxe : t1 t2 {f} (option) CourbeR3
2864 /CourbeR3 {
2865 2 dict begin
2866    dup isstring {
2867       /option exch def
2868    } if
2869    /lafonction exch def
2870    {lafonction 3dto2d}
2871    currentdict /option known
2872       {option}
2873    if
2874   CourbeR2
2875 end
2876 } def
2877
2878 %% syntaxe : {f} (option) CourbeR3
2879 /courbeR3 {
2880    tmin tmax 3 -1 roll CourbeR3
2881 } def
2882
2883 %%%%% ### fin insertion ###
2884
2885 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2886 %%%%      fonctions et constantes mathematiques         %%%%
2887 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2888
2889 %%%%% ### math ###
2890 %%%%%%%%%%% constantes mathematiques %%%%%%%%%%%%%%
2891
2892 /pi 3.14159 def
2893 /e 2.71828 def
2894
2895 %%%%%%%%%%% fonctions mathematiques %%%%%%%%%%%%%%%
2896
2897 /rd {180 pi div mul} def        %% transforme des rd en degres
2898 /deg {pi mul 180 div} def       %% transforme des degres en rd
2899 /log {ln 10 ln div} def
2900 /Exp {e exch exp} def
2901 /Cos {rd cos} def
2902 /Sin {rd sin} def
2903 /tan {dup sin exch cos div} def
2904 /cotan {dup cos exch sin div} def
2905 /Tan {dup Sin exch Cos div} def
2906 /Cotan {dup Cos exch Sin div} def
2907 /coTan {Cotan} def
2908 /arctan {
2909 dup 0 ge
2910    {1 atan}
2911    {neg 1 atan neg}
2912 ifelse
2913 } def
2914 /Arctan {arctan deg} def
2915 /arccos {
2916    dup
2917    dup mul neg 1 add sqrt
2918    exch
2919    atan
2920 } def
2921 /Arccos {arccos deg} def
2922 /arcsin {
2923    dup 1 eq {
2924       90
2925    } {
2926       dup
2927       dup mul neg 1 add sqrt
2928       atan
2929       dup 90 lt
2930          {}
2931          {360 sub}
2932       ifelse
2933    } ifelse
2934 } def
2935 /Arcsin {arcsin deg} def
2936 /cosh {dup Exp exch neg Exp add 2 div} def
2937 /sinh {dup Exp exch neg Exp sub 2 div} def
2938 /tanh {dup sinh exch cosh div} def
2939 /cotanh {dup cosh exch sinh div} def
2940 /argcosh {dup dup mul 1 sub sqrt add ln} def
2941 /argsinh {dup dup mul 1 add sqrt add ln} def
2942 /argtanh {
2943    setxvar
2944    x 1 add
2945    1 x sub
2946    div
2947    ln
2948    2 div
2949 } def
2950 /factorielle {
2951       dup 0 eq
2952          {pop 1}
2953          {dup 1 sub factorielle mul}
2954       ifelse
2955 } def
2956 /Gauss {
2957 3 dict begin
2958    /sigma exch def
2959    /m exch def
2960    /x exch def
2961    x m sub dup mul sigma dup mul 2 mul div neg Exp
2962    2 pi mul sigma dup mul mul sqrt div
2963 end
2964 } def
2965 %% syntaxe : a n modulo
2966 /modulo {
2967 2 dict begin
2968    /n exch def
2969    /a exch def
2970    {
2971       a 0 lt {
2972          /a a n add store
2973       } {
2974          exit
2975       } ifelse
2976    } loop
2977    a n mod
2978 end
2979 } def
2980
2981 %%%%% ### max ###
2982 /max {
2983    2 copy
2984    lt {exch} if
2985    pop
2986 } def
2987
2988 %%%%% ### min ###
2989 /min {
2990    2 copy
2991    gt {exch} if
2992    pop
2993 } def
2994
2995 %%%%% ### setcolor ###
2996 %% syntaxe : tableau setcolor
2997 /setcolor {
2998    dup length 4 eq
2999       {aload pop setcmykcolor}
3000       {aload pop setrgbcolor}
3001    ifelse
3002 } def
3003
3004 %%%%% ### in ###
3005 %% cherche si un elt donne appartient au tableau donne
3006 %% rque : utilise 3 variables locales
3007 %% syntaxe : elt array in --> index boolean
3008 /in {
3009 3 dict begin
3010    /liste exch def
3011    /elt exch def
3012    /i 0 def
3013    false                        %% la reponse a priori
3014    liste length {
3015       liste i get elt eq {
3016          pop                    %% en enleve la reponse
3017          i true                 %% pour mettre la bonne
3018          exit
3019       } if
3020       /i i 1 add store
3021    } repeat
3022 end
3023 } def
3024
3025 %%%%% ### starfill ###
3026 %% la procedure pour les objets "star"
3027 %% si c est "star" on fait le fillstyle, sinon non
3028 /starfill {
3029    startest {
3030       gsave
3031          clip
3032          fillstyle
3033       grestore
3034       /startest false def
3035    } if
3036 } def
3037
3038 %%%%% ### addv ###
3039 %% syntaxe : u v addv --> u+v
3040 /addv {         %% xA yA xB yB
3041    3 1 roll     %% xA yB yA xB 
3042    4 1 roll     %% xB xA yB yA 
3043    add 3 1 roll %% yB+yA xB xA 
3044    add exch
3045 } def
3046
3047 %%%%% ### continu ### 
3048 /continu {
3049    [] 0 setdash 
3050 } def
3051
3052 %%%%% ### trigospherique ### 
3053 %% passage spherique --> cartesiennes
3054 %% les formules de passage ont été récupérées ici :
3055 %%    http://fr.wikipedia.org/wiki/Coordonn%C3%A9es_polaires
3056 %% syntaxe : r theta phi rtp2xyz -> x y z
3057 /rtp2xyz {
3058 6 dict begin
3059    /phi exch def
3060    /theta exch def
3061    /r exch def
3062    /x phi sin theta cos mul r mul def 
3063    /y phi sin theta sin mul r mul def
3064    /z phi cos r mul def
3065    x y z
3066 end
3067 } def
3068
3069 %% trace d'un arc sur une sphere de centre O
3070 %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique
3071 /arcspherique {
3072 9 dict begin
3073    dup isstring {
3074       /option exch def
3075    } if
3076    /phi2 exch def
3077    /theta2 exch def
3078    pop
3079    /phi1 exch def
3080    /theta1 exch def
3081    /r exch def
3082    /n 12 def
3083
3084    1 theta1 phi1 rtp2xyz /u defpoint3d
3085    1 theta2 phi2 rtp2xyz /v defpoint3d
3086    u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
3087
3088    /sinalpha u v vectprod3d norme3d def
3089    /cosalpha u v scalprod3d def
3090    /alpha sinalpha cosalpha atan def
3091    /n 12 def
3092    /pas alpha n div def
3093
3094    gsave
3095       /t pas neg def
3096       [
3097          n 1 add {
3098             /t  t pas add store
3099             u t cos r mul mulv3d
3100             w t sin r mul mulv3d
3101             addv3d
3102          } repeat
3103       ] 
3104       currentdict /option known {
3105          option
3106       } if
3107       ligne3d
3108    grestore
3109 end
3110 } def
3111
3112 %% trace d'un arc sur une sphere de centre O
3113 %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique
3114 /arcspherique_ {
3115 8 dict begin
3116    /phi2 exch def
3117    /theta2 exch def
3118    pop
3119    /phi1 exch def
3120    /theta1 exch def
3121    /r exch def
3122    /n 12 def
3123
3124    1 theta1 phi1 rtp2xyz /u defpoint3d
3125    1 theta2 phi2 rtp2xyz /v defpoint3d
3126    u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
3127
3128    /sinalpha u v vectprod3d norme3d def
3129    /cosalpha u v scalprod3d def
3130    /alpha sinalpha cosalpha atan def
3131    /n 12 def
3132    /pas alpha n div def
3133
3134    /t pas neg def
3135    [
3136       n 1 add {
3137          /t  t pas add store
3138          u t cos r mul mulv3d
3139          w t sin r mul mulv3d
3140          addv3d
3141       } repeat
3142    ] ligne3d_
3143 end
3144 } def
3145
3146 %% trace d'une geodesique sur une sphere de centre O
3147 %% syntaxe : r theta1 phi1 r theta2 phi2 geodesique_sphere
3148 /geodesique_sphere {
3149 13 dict begin
3150    /phi2 exch def
3151    /theta2 exch def
3152    pop
3153    /phi1 exch def
3154    /theta1 exch def
3155    /r exch def
3156    /n 360 def
3157
3158    1 theta1 phi1 rtp2xyz /u defpoint3d
3159    1 theta2 phi2 rtp2xyz /v defpoint3d
3160    u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
3161
3162    /sinalpha u v vectprod3d norme3d def
3163    /cosalpha u v scalprod3d def
3164    /alpha sinalpha cosalpha atan def
3165    /pas 360 n div def
3166
3167    gsave
3168       /t pas neg def
3169       [
3170          n 1 add {
3171             /t  t pas add store
3172             u t cos r mul mulv3d
3173             w t sin r mul mulv3d
3174             addv3d
3175          } repeat
3176       ] ligne3d
3177    grestore
3178 end
3179 } def
3180
3181
3182 %% syntaxe : A B C trianglespherique --> trace le rtiangle ABC
3183 %% (coordonnees spheriques)
3184 /trianglespherique* {
3185 1 dict begin
3186    /startest {true} def
3187    trianglespherique
3188 end
3189 } def
3190
3191 /trianglespherique {
3192 10 dict begin
3193    /C defpoint3d
3194    /B defpoint3d
3195    /A defpoint3d
3196    gsave
3197    newpath
3198       A rtp2xyz 3dto2d smoveto
3199       A B arcspherique_
3200       B C arcspherique_
3201       C A arcspherique_
3202    closepath
3203    starfill
3204    currentlinewidth 0 eq {} {stroke} ifelse
3205    grestore
3206 end
3207 } def
3208
3209 %%%%% ### fin insertion ###
3210
3211 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3212 %%%%         operations sur les tableaux                %%%%
3213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3214
3215 %%%%% ### duparray ###
3216 /duparray {
3217 1 dict begin
3218    /table exch def
3219    table
3220    [ table aload pop ]
3221 end
3222 } def
3223
3224 %%%%% ### append ###
3225 %% syntaxe : string1 string2 append --> concatene les 2 chaines ou fusionne 2 tableaux
3226 /append {
3227 3 dict begin
3228    dup isarray {
3229       /tab2 exch def
3230       /tab1 exch def
3231       [ tab1 aload pop tab2 aload pop ]
3232    } {
3233       /str2 exch def
3234       /str1 exch def
3235       /result str1 length str2 length add string def
3236       str1 result copy pop
3237       result str1 length str2 putinterval
3238       result
3239    } ifelse
3240 end
3241 } def
3242
3243 %%%%% ### rollparray ###
3244 %% syntaxe : array n rollparray -> array
3245 %% opere une rotation de n sur les couplets du tableau array
3246 /rollparray {
3247 4 dict begin
3248    /k exch def
3249    /table exch def
3250    /n table length def
3251    k 0 eq {
3252        table
3253    } {
3254        k 0 ge {
3255           [ table aload pop 2 {n 1 roll} repeat ]
3256            k 1 sub
3257        } {
3258           [ table aload pop 2 {n -1 roll} repeat ]
3259            k 1 add
3260        } ifelse
3261        rollparray
3262    } ifelse
3263 end
3264 } def
3265
3266 %%%%% ### bubblesort ###
3267 %% syntaxe : array bubblesort --> array2 trie par ordre croissant
3268 %% code de Bill Casselman
3269 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
3270 /bubblesort {
3271 4 dict begin
3272    /a exch def
3273    /n a length 1 sub def
3274    n 0 gt {
3275       % at this point only the n+1 items in the bottom of a remain to
3276       % the sorted largest item in that blocks is to be moved up into
3277       % position n
3278       n {
3279          0 1 n 1 sub {
3280             /i exch def
3281             a i get a i 1 add get gt {
3282                % if a[i] > a[i+1] swap a[i] and a[i+1]
3283                a i 1 add
3284                a i get
3285                a i a i 1 add get
3286                % set new a[i] = old a[i+1]
3287                put
3288                % set new a[i+1] = old a[i]
3289                put
3290             } if
3291          } for
3292          /n n 1 sub def
3293       } repeat
3294    } if
3295    a
3296 end
3297 } def
3298
3299 %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est
3300 %% trie par ordre croissant et array2 correspond a la position des
3301 %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2]
3302 %% code de Bill Casselman, modifie par jpv, 15/08/2006
3303 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
3304 /doublebubblesort {
3305 5 dict begin
3306    /table exch def
3307    /n table length 1 sub def
3308    /indices [ 0 1 n {} for ] def
3309    n 0 gt {
3310       % at this point only the n+1 items in the bottom of a remain to
3311       % the sorted largest item in that blocks is to be moved up into
3312       % position n
3313       n {
3314          0 1 n 1 sub {
3315             /i exch def
3316             table i get table i 1 add get gt {
3317                % if a[i] > a[i+1] swap a[i] and a[i+1]
3318                table i 1 add
3319                table i get
3320                table i table i 1 add get
3321                % set new a[i] = old a[i+1]
3322                put
3323                % set new a[i+1] = old a[i]
3324                put
3325
3326                indices i 1 add
3327                indices i get
3328                indices i indices i 1 add get
3329                % set new a[i] = old a[i+1]
3330                put
3331                % set new a[i+1] = old a[i]
3332                put
3333             } if
3334          } for
3335          /n n 1 sub def
3336       } repeat
3337    } if
3338    indices table
3339 end
3340 } def
3341
3342 %%%%% ### quicksort ###
3343 %% src : http://www.math.ubc.ca/~cass/graphics/text/www/code/sort.inc
3344 %% code de Bill Casselman, modifie par jpv, 18/10/2007
3345
3346 /qsortdict 8 dict def
3347
3348 qsortdict begin
3349
3350 % args: /comp a L R x
3351 % effect: effects a partition into two pieces [L j] [i R]
3352 %     leaves i j on stack
3353
3354 /partition { 8 dict begin
3355 /x exch def
3356 /j exch def
3357 /i exch def
3358 /a exch def
3359 load /comp exch def
3360 {
3361   {
3362     a i get x comp exec not {
3363       exit
3364     } if
3365     /i i 1 add def
3366   } loop
3367   {
3368     x a j get comp exec not {
3369       exit
3370     } if
3371     /j j 1 sub def
3372   } loop
3373
3374   i j le {
3375     % swap a[i] a[j]
3376     a j a i get
3377     a i a j get
3378     put put
3379     indices j indices i get
3380     indices i indices j get
3381     put put
3382     /i i 1 add def
3383     /j j 1 sub def
3384   } if
3385   i j gt {
3386     exit
3387   } if
3388 } loop
3389 i j
3390 end } def
3391
3392 % args: /comp a L R
3393 % effect: sorts a[L .. R] according to comp
3394
3395 /subsort {
3396 % /c a L R
3397 [ 3 1 roll ] 3 copy
3398 % /c a [L R] /c a [L R]
3399 aload aload pop
3400 % /c a [L R] /c a L R L R
3401 add 2 idiv
3402 % /c a [L R] /c a L R (L+R)/2
3403 3 index exch get
3404 % /c a [L R] /c a L R x
3405 partition
3406 % /c a [L R] i j
3407 % if j > L subsort(a, L, j)
3408 dup
3409 % /c a [L R] i j j
3410 3 index 0 get gt {
3411   % /c a [L R] i j
3412   5 copy
3413   % /c a [L R] i j /c a [L R] i j
3414   exch pop
3415   % /c a [L R] i j /c a [L R] j
3416   exch 0 get exch
3417   % ... /c a L j
3418   subsort
3419 } if
3420 % /c a [L R] i j
3421 pop dup
3422 % /c a [L R] i i
3423 % if i < R subsort(a, i, R)
3424 2 index 1 get lt {
3425   % /c a [L R] i
3426   exch 1 get
3427   % /c a i R
3428   subsort
3429 }{
3430   4 { pop } repeat
3431 } ifelse
3432 } def
3433
3434 end
3435
3436 % args: /comp a
3437 % effect: sorts the array a
3438 % comp returns truth of x < y for entries in a
3439
3440 /quicksort { qsortdict begin
3441 dup length 1 gt {
3442 % /comp a
3443 dup
3444 % /comp a a
3445 length 1 sub
3446 % /comp a n-1
3447 0 exch subsort
3448 } {
3449 pop pop
3450 } ifelse
3451 end } def
3452
3453 % ----------------------------------------
3454
3455 %% fin du code de Bill Casselman
3456
3457 %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est
3458 %% trie par ordre croissant et array2 correspond a la position des
3459 %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2]
3460 %% code de Bill Casselman, modifie par jpv, 18/10/2007
3461 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
3462 /doublequicksort {
3463 qsortdict begin
3464    /comp exch
3465    /a exch def
3466    a dup length /n exch def
3467    /indices [0 1 n 1 sub {} for ] def
3468    dup length 1 gt {
3469       % /comp a
3470       dup
3471       % /comp a a
3472       length 1 sub
3473       % /comp a n-1
3474       0 exch subsort
3475    } {
3476       pop pop
3477    } ifelse
3478    indices a
3479 end
3480 } def
3481
3482 /comp {lt} def
3483
3484 %%%%% ### apply ###
3485 %% syntaxe : [x1 ... xn] (f) apply --> [f(x1) ... f(xn)]
3486 /apply {
3487 3 dict begin
3488    dup isstring
3489       {/fonction exch cvx def}
3490       {/fonction exch def}
3491    ifelse
3492    /liste exch def
3493    /@i 0 def
3494    [
3495    liste length {
3496       liste @i get fonction
3497       /@i @i 1 add store
3498    } repeat
3499    counttomark
3500    0 eq
3501       {pop}
3502       {]}
3503    ifelse
3504 end
3505 } def
3506
3507 %% syntaxe : [x1 ... xn] (f) papply
3508 /papply {
3509 3 dict begin
3510    dup isstring
3511       {/fonction exch cvx def}
3512       {/fonction exch def}
3513    ifelse
3514    /liste exch def
3515    /@i 0 def
3516    [
3517    liste length 2 idiv {
3518       liste @i get
3519       liste @i 1 add get
3520       fonction
3521       /@i @i 2 add store
3522    } repeat
3523    counttomark
3524    0 eq
3525       {pop}
3526       {]}
3527    ifelse
3528 end
3529 } def
3530
3531 %% syntaxe : [x1 ... xn] (f) capply 
3532 /capply {
3533 3 dict begin
3534    dup isstring
3535       {/fonction exch cvx def}
3536       {/fonction exch def}
3537    ifelse   
3538    /liste exch def
3539    /@i 0 def
3540    [
3541    liste length 3 idiv {
3542       liste @i get 
3543       liste @i 1 add get 
3544       liste @i 2 add get 
3545       fonction
3546       /@i @i 3 add store
3547    } repeat
3548    counttomark 
3549    0 eq
3550       {pop}
3551       {]}
3552    ifelse
3553 end
3554 } def
3555
3556 %%%%% ### reverse ###
3557 %% syntaxe : array reverse --> inverse l ordre des items dans
3558 %% le tableau
3559 /reverse {
3560 3 dict begin
3561    /le_tableau exch def
3562    /n le_tableau length def
3563    /i n 1 sub def
3564    [
3565       n {
3566          le_tableau i get
3567          /i i 1 sub store
3568       } repeat
3569    ]
3570 end
3571 } def
3572
3573 %% syntaxe : array_points reversep --> inverse l ordre des points dans
3574 %% le tableau
3575 /reversep {
3576 3 dict begin
3577    /le_tableau exch def
3578    /n le_tableau length 2 idiv def
3579    /i n 1 sub def
3580    [
3581       n {
3582          le_tableau i getp
3583          /i i 1 sub store
3584       } repeat
3585    ]
3586 end
3587 } def
3588
3589 %%%%% ### get ###
3590 %% syntaxe : array_points n getp --> le n-ieme point du tableau de
3591 %% points array_points
3592 /getp {
3593    2 copy
3594    2 mul get
3595    3 1 roll
3596    2 mul 1 add get
3597 } def
3598
3599 %%%%% ### fin insertion ###
3600
3601 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3602 %%%%             matrices                               %%%%
3603 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3604
3605 %%%%% ### linear ###
3606 %% syntaxe : M i j any --> depose any dans M en a_ij
3607 /put_ij {
3608 5 dict begin
3609    /a exch def
3610    /j exch def
3611    /i exch def
3612    /M exch def
3613    /L M i get_Li def
3614    L j a put
3615    M i L put_Li
3616 end
3617 } def
3618
3619 %% syntaxe : M i j get_ij --> le coeff c_ij
3620 /get_ij {
3621    3 1 roll   %% j M i
3622    get_Li     %% j L_i
3623    exch get
3624 } def
3625
3626 %% syntaxe : M i L put_Li --> remplace dans M la ligne Li par L
3627 /put_Li {
3628    put
3629 } def
3630
3631 %% syntaxe : M i get_Li --> la ligne Li de M
3632 /get_Li {
3633    get
3634 } def
3635
3636 %%%%% ### fin insertion ###
3637
3638 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3639 %%%%          geometrie 3d (calculs)                    %%%%
3640 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3641
3642 %%%%% ### dupp3d ### 
3643 %% duplique le vecteur 3d
3644 /dupp3d { %% x y z
3645         3 copy
3646 } def
3647 /dupv3d {dupp3d} def
3648
3649 %%%%% ### angle3d ###
3650 %% syntaxe : vect1 vect2 angle3d
3651 /angle3d {
3652 4 dict begin
3653    normalize3d /vect2 defpoint3d
3654    normalize3d /vect1 defpoint3d
3655    /cosalpha vect1 vect2 scalprod3d def
3656    /sinalpha vect1 vect2 vectprod3d norme3d def
3657    sinalpha cosalpha atan
3658 end
3659 } def
3660
3661 %%%%% ### transformpoint3d ###
3662 %% syntaxe : x y z a11 a21 a31 a12 a22 a32 a13 a23 a33
3663 %%    transformpoint3d -> X Y Z
3664 /transformpoint3d {
3665 12 dict begin
3666    /a33 exch def
3667    /a23 exch def
3668    /a13 exch def
3669    /a32 exch def
3670    /a22 exch def
3671    /a12 exch def
3672    /a31 exch def
3673    /a21 exch def
3674    /a11 exch def
3675    /z   exch def
3676    /y   exch def
3677    /x   exch def
3678    a11 x mul a12 y mul add a13 z mul add
3679    a21 x mul a22 y mul add a23 z mul add
3680    a31 x mul a32 y mul add a33 z mul add
3681 end
3682 } def
3683
3684 %%%%% ### normalize3d ###
3685 %% rend le vecteur 3d unitaire. Ne fait rien si u=0
3686 /unitaire3d { %% x y z
3687 2 dict begin
3688    /u defpoint3d
3689    /norme u norme3d def
3690    norme 0 eq {
3691       u
3692    } {
3693       u 1 norme div mulv3d
3694    } ifelse
3695 end
3696 } def
3697 /normalize3d {unitaire3d} def
3698
3699 %%%%% ### mulv ###
3700 %% syntaxe : u a mulv --> au
3701 /mulv {   %% xA, yA, a
3702    dup          %% xA, yA, a, a
3703    3 1 roll     %% xA, a, yA, a
3704    mul 3 1 roll %% ayA, xA, a
3705    mul exch
3706 } def
3707
3708 %%%%% ### geom3d ###
3709 %% syntaxe : A k1 B k2 barycentre3d -> G, barycentre du systeme
3710 %% [(A, k1) (B, k2)]
3711 /barycentre3d {
3712 4 dict begin
3713    /k2 exch def
3714    /B defpoint3d
3715    /k1 exch def
3716    /A defpoint3d
3717    A k1 mulv3d
3718    B k2 mulv3d
3719    addv3d
3720    1 k1 k2 add div mulv3d
3721 end
3722 } def
3723
3724 %% syntaxe : array isobarycentre3d --> G
3725 /isobarycentre3d {
3726 2 dict begin
3727    /table exch def
3728    /n table length 3 idiv def
3729    table 0 getp3d
3730    1 1 n 1 sub {
3731        table exch getp3d
3732        addv3d
3733    } for
3734    1 n div mulv3d
3735 end
3736 } def
3737
3738 %% syntaxe : M A alpha hompoint3d -> le point M' tel que AM' = alpha AM 
3739 /hompoint3d {
3740 3 dict begin
3741    /alpha exch def
3742    /A defpoint3d
3743    /M defpoint3d
3744    A M vecteur3d alpha mulv3d A addv3d
3745 end
3746 } def
3747
3748 %% syntaxe : M A sympoint3d -> le point M' tel que AM' = -AM
3749 /sympoint3d {
3750 2 dict begin
3751    /A defpoint3d
3752    /M defpoint3d
3753    A M vecteur3d -1 mulv3d A addv3d
3754 end
3755 } def
3756
3757 %% syntaxe : A u translatepoint3d --> B image de A par la translation de vecteur u
3758 /translatepoint3d {
3759    addv3d
3760 } def
3761
3762 /scaleOpoint3d {
3763 6 dict begin
3764    /k3 exch def
3765    /k2 exch def
3766    /k1 exch def
3767    /z exch def
3768    /y exch def
3769    /x exch def
3770    k1 x mul
3771    k2 y mul
3772    k3 z mul
3773 end
3774 } def
3775
3776 % syntaxe : M alpha_x alpha_y alpha_z rotateOpoint3d --> M'
3777 /rotateOpoint3d {
3778 21 dict begin
3779    /RotZ exch def
3780    /RotY exch def
3781    /RotX exch def
3782    /Zpoint exch def
3783    /Ypoint exch def
3784    /Xpoint exch def
3785    /c1 {RotX cos} bind def
3786    /c2 {RotY cos} bind def
3787    /c3 {RotZ cos} bind def
3788    /s1 {RotX sin} bind def
3789    /s2 {RotY sin} bind def
3790    /s3 {RotZ sin} bind def
3791    /M11 {c2 c3 mul} bind def
3792    /M12 {c3 s1 mul s2 mul c1 s3 mul sub} bind def
3793    /M13 {c1 c3 mul s2 mul s1 s3 mul add} bind def
3794    /M21 {c2 s3 mul} bind def
3795    /M22 {s1 s2 mul s3 mul c1 c3 mul add} bind def
3796    /M23 {s3 s2 mul c1 mul c3 s1 mul sub} bind def
3797    /M31 {s2 neg} bind def
3798    /M32 {s1 c2 mul} bind def
3799    /M33 {c1 c2 mul} bind def
3800    M11 Xpoint mul M12 Ypoint mul add M13 Zpoint mul add
3801    M21 Xpoint mul M22 Ypoint mul add M23 Zpoint mul add
3802    M31 Xpoint mul M32 Ypoint mul add M33 Zpoint mul add
3803 end
3804 } def
3805
3806 %%%%% ### vecteur3d ###
3807 %% creation du vecteur AB a partir de A et B
3808 /vecteur3d { %% xA yA zA xB yB zB
3809 6 dict begin
3810    /zB exch def
3811    /yB exch def
3812    /xB exch def
3813    /zA exch def
3814    /yA exch def
3815    /xA exch def
3816    xB xA sub
3817    yB yA sub
3818    zB zA sub
3819 end
3820 }def
3821
3822 %%%%% ### vectprod3d ###
3823 %% produit vectoriel de deux vecteurs 3d
3824 /vectprod3d { %% x1 y1 z1 x2 y2 z2
3825 6 dict begin
3826    /zp exch def
3827    /yp exch def
3828    /xp exch def
3829    /z exch def
3830    /y exch def
3831    /x exch def
3832    y zp mul z yp mul sub
3833    z xp mul x zp mul sub
3834    x yp mul y xp mul sub
3835 end
3836 } def
3837
3838 %%%%% ### scalprod3d ###
3839 %% produit scalaire de deux vecteurs 3d
3840 /scalprod3d { %% x1 y1 z1 x2 y2 z2
3841 6 dict begin
3842    /zp exch def
3843    /yp exch def
3844    /xp exch def
3845    /z exch def
3846    /y exch def
3847    /x exch def
3848    x xp mul y yp mul add z zp mul add
3849 end
3850 } def
3851
3852 %%%%% ### papply3d ###
3853 %% syntaxe : [A1 ... An] (f) papply3d --> [f(A1) ... f(An)]
3854 /papply3d {
3855 3 dict begin
3856    /fonction exch def
3857    /liste exch def
3858    /i 0 def
3859    [
3860    liste length 3 idiv {
3861       liste i get
3862       liste i 1 add get
3863       liste i 2 add get
3864       fonction
3865       /i i 3 add store
3866    } repeat
3867    counttomark
3868    0 eq
3869       {pop}
3870       {]}
3871    ifelse
3872 end
3873 } def
3874
3875 %%%%% ### defpoint3d ###
3876 %% creation du point A a partir de xA yA yB et du nom /A
3877 /defpoint3d { %% xA yA zA /nom
3878 1 dict begin
3879    /memo exch def
3880    [ 4 1 roll ] cvx memo exch
3881 end def
3882 }def
3883
3884 %%%%% ### distance3d ###
3885 /distance3d { %% A B
3886    vecteur3d norme3d
3887 } def
3888
3889 %%%%% ### get3d ###
3890 /getp3d { %% [tableau de points 3d] i --> donne le ieme point du tableau
3891    2 copy 2 copy
3892    3 mul get
3893    5 1 roll
3894    3 mul 1 add get
3895    3 1 roll
3896    3 mul 2 add get
3897 } def
3898
3899 %%%%% ### norme3d ###
3900 %% norme d un vecteur 3d
3901 /norme3d { %% x y z
3902 3 dict begin
3903    /z exch def
3904    /y exch def
3905    /x exch def
3906    x dup mul y dup mul add z dup mul add sqrt
3907 end
3908 } def
3909
3910 %%%%% ### mulv3d ###
3911 %% (scalaire)*(vecteur 3d) Attention : dans l autre sens !
3912 /mulv3d { %% x y z lambda
3913 4 dict begin
3914    /lambda exch def
3915    /z exch def
3916    /y exch def
3917    /x exch def
3918    x lambda mul
3919    y lambda mul
3920    z lambda mul
3921 end
3922 } def
3923
3924 %%%%% ### addv3d ###
3925 %% addition de deux vecteurs 3d
3926 /addv3d { %% x1 y1 z1 x2 y2 z2
3927 6 dict begin
3928    /zp exch def
3929    /yp exch def
3930    /xp exch def
3931    /z exch def
3932    /y exch def
3933    /x exch def
3934    x xp add
3935    y yp add
3936    z zp add
3937 end
3938 } def
3939
3940 %%%%% ### milieu3d ###
3941 /milieu3d { %% A B --> I le milieu de [AB]
3942    addv3d 0.5 mulv3d
3943 } def
3944
3945 %%%%% ### exch ###
3946 /exchp {
3947    4 -1 roll
3948    4 -1 roll
3949 } def
3950 /exchc {
3951    6 -1 roll
3952    6 -1 roll
3953    6 -1 roll
3954 } def
3955 /exchd {
3956    4 {8 -1 roll} repeat
3957 } def
3958 /exchp3d {
3959    6 -1 roll
3960    6 -1 roll
3961    6 -1 roll
3962 } def
3963
3964 %%%%% ### ABpoint3d ###
3965 %% syntaxe : A B k ABpoint3d --> M
3966 %% M tel que vect(AM) = k vect (AB)
3967 /ABpoint3d {
3968 3 dict begin
3969    /k exch def
3970    /B defpoint3d
3971    /A defpoint3d
3972    A B vecteur3d
3973    k mulv3d
3974    A addv3d 
3975 end
3976 } def
3977
3978 %%%%% ### angle3doriente ###
3979 %% syntaxe : vect1 vect2 vect3 angle3d
3980 %% vect3 est la normale au plan (vect1, vect2)
3981 /angle3doriente {
3982 4 dict begin
3983    normalize3d /vect3 defpoint3d
3984    normalize3d /vect2 defpoint3d
3985    normalize3d /vect1 defpoint3d
3986    /cosalpha vect1 vect2 scalprod3d def
3987    /sinalpha vect1 vect2 vectprod3d vect3 scalprod3d def
3988    sinalpha cosalpha atan
3989 end
3990 } def
3991
3992 %%%%% ### points3dalignes ###
3993 %% syntaxe : A B C points3dalignes -> bool
3994 /points3dalignes {
3995 3 dict begin
3996    /C defpoint3d
3997    /B defpoint3d
3998    /A defpoint3d
3999    A B vecteur3d /u defpoint3d
4000    A C vecteur3d /v defpoint3d
4001    u v vectprod3d norme3d 1E-7 lt
4002 end
4003 } def
4004
4005 %% syntaxe : M A B point3dsursegment --> true si M in [AB], false sinon
4006 /point3dsursegment {
4007 3 dict begin
4008    /B defpoint3d
4009    /A defpoint3d
4010    /M defpoint3d
4011    M A B points3dalignes {
4012       M A vecteur3d
4013       M B vecteur3d
4014       scalprod3d 0 lt {
4015          true
4016       } {
4017          false
4018       } ifelse
4019    } {
4020       false
4021    } ifelse
4022 end
4023 } def
4024
4025 %%%%% ### fin insertion ###
4026
4027 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4028 %%%%          geometrie 3d (dessins)                    %%%%
4029 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4030
4031 %%%%% ### point3d ###
4032 /point3d { %% A
4033    3dto2d point
4034 } def
4035
4036 /points3d { %% tableau de points3d
4037    tab3dto2d points
4038 } def
4039
4040 %%%%% ### ligne3d ###
4041 %% [tableau de points3d] option --> trace la ligne brisee
4042 /ligne3d { 
4043 1 dict begin
4044    dup isstring
4045       {/option exch def}
4046    if
4047    tab3dto2d
4048    currentdict /option known
4049       {option}
4050    if
4051    ligne
4052 end
4053 } def
4054
4055 %% [tableau de points3d] option --> trace la ligne brisee
4056 /ligne3d_ { 
4057 1 dict begin
4058    dup isstring
4059       {/option exch def}
4060    if
4061    tab3dto2d
4062    currentdict /option known
4063       {option}
4064    if
4065    ligne_
4066 end
4067 } def
4068
4069 %%%%% ### tab3dto2d ###
4070 %% transforme un tableau de points 3d en tableau de points 2d
4071 /tab3dto2d {
4072 2 dict begin
4073    /T exch def
4074    /n T length def
4075    [ T aload pop
4076    n 1 sub -1 n 3 idiv 2 mul
4077    { 1 dict begin
4078    /i exch def
4079    3dto2d i 2 roll
4080    end } for ]
4081 end
4082 } def
4083
4084 %%%%% ### polygone3d ###
4085 /polygone3d { %% tableau de points3d
4086    tab3dto2d polygone
4087 } def
4088
4089 /polygone3d* { %% tableau de points3d
4090    tab3dto2d polygone*
4091 } def
4092
4093 %%%%% ### fin insertion ###
4094
4095 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4096 %%%%                 gestion du texte                   %%%%
4097 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4098
4099 %%%%% ### pathtext ###
4100 %% syntaxe : string x y initp@thtext
4101  /initp@thtext {
4102 7 dict begin
4103    /y exch def
4104    /x exch def
4105    /str exch def
4106    str 0 0 show_dim
4107    /wy exch def
4108    /wx exch def
4109    /lly exch def
4110    /llx exch def
4111    pop pop pop
4112    newpath 
4113       x y  smoveto
4114 } def
4115  /closep@thtext {
4116       str true charpath
4117 end
4118 } def
4119
4120 %% syntaxe : string x y cctext_
4121 /cctext_ {
4122    initp@thtext
4123    llx wx add lly wy add -.5 mulv rmoveto
4124    closep@thtext
4125 } def
4126
4127 /brtext_ {
4128    initp@thtext
4129    hadjust 0 rmoveto
4130    llx neg 0 rmoveto
4131    closep@thtext
4132 } def
4133
4134 /bbtext_ {
4135    initp@thtext
4136    0 0 rmoveto
4137    0 0 rmoveto
4138    closep@thtext
4139 } def
4140
4141 /bltext_ {
4142    initp@thtext
4143    hadjust neg 0 rmoveto
4144    wx neg 0 rmoveto
4145    closep@thtext
4146 } def
4147
4148 /bctext_ {
4149    initp@thtext
4150    0 0 rmoveto
4151    wx llx add -.5 mul 0 rmoveto
4152    closep@thtext
4153 } def
4154
4155 /ubtext_ {
4156    initp@thtext
4157    0 vadjust rmoveto
4158    0 lly neg rmoveto
4159    closep@thtext
4160 } def
4161
4162 /urtext_ {
4163    initp@thtext
4164    hadjust vadjust rmoveto
4165    llx neg lly neg rmoveto
4166    closep@thtext
4167 } def
4168
4169 /ultext_ {
4170    initp@thtext
4171    hadjust neg vadjust rmoveto
4172    wx neg lly neg rmoveto
4173    closep@thtext
4174 } def
4175
4176 /uctext_ {
4177    initp@thtext
4178    0 vadjust rmoveto
4179    llx wx add -.5 mul lly neg rmoveto
4180    closep@thtext
4181 } def
4182
4183 /drtext_ {
4184    initp@thtext
4185    hadjust vadjust neg rmoveto
4186    llx neg wy neg rmoveto
4187    closep@thtext
4188 } def
4189
4190 /dbtext_ {
4191    initp@thtext
4192    0 vadjust neg rmoveto
4193    0 wy neg rmoveto
4194    closep@thtext
4195 } def
4196
4197 /dltext_ {
4198    initp@thtext
4199    hadjust neg vadjust neg rmoveto
4200    wx neg wy neg rmoveto
4201    closep@thtext
4202 } def
4203
4204 /dctext_ {
4205    initp@thtext
4206    0 vadjust neg rmoveto
4207    llx wx add -2 div wy neg rmoveto
4208    closep@thtext
4209 } def
4210
4211 /crtext_ {
4212    initp@thtext
4213    hadjust 0 rmoveto
4214    llx neg lly wy add -2 div rmoveto
4215    closep@thtext
4216 } def
4217
4218 /cbtext_ {
4219    initp@thtext
4220    0 0 rmoveto
4221    0 lly wy add -2 div rmoveto
4222    closep@thtext
4223 } def
4224
4225 /cltext_ {
4226    initp@thtext
4227    hadjust neg 0 rmoveto
4228    wx neg lly wy add -2 div rmoveto
4229    closep@thtext
4230 } def
4231
4232 /cctext_ {
4233    initp@thtext
4234    0 0 rmoveto
4235    llx wx add lly wy add -.5 mulv rmoveto
4236    closep@thtext
4237 } def
4238
4239 %%%%% ### fin insertion ###
4240
4241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4242 %%%%             bibliotheque sur les solides           %%%%
4243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4244
4245 %%%%% ### solide ###
4246 %% solid = [Sommets Faces Colors_Faces InOut_Table]
4247 /solidgetsommets {
4248    0 get
4249 } def
4250 /solidgetpointstable {solidgetsommets} def
4251
4252 /solidgetfaces {
4253    1 get
4254 } def
4255
4256 /solidgetface {
4257 1 dict begin
4258    /i exch def
4259    solidgetfaces i get
4260 end
4261 } def
4262
4263 /solidgetfcolors {
4264    2 get
4265 } def
4266
4267 %% syntaxe : solid i solidgetfcolor --> str
4268 /solidgetfcolor {
4269 1 dict begin
4270    /i exch def
4271    solidgetfcolors i get
4272 end
4273 } def
4274
4275 %% syntaxe : solid i str solidputfcolor --> -
4276 /solidputfcolor {
4277 2 dict begin
4278    /str exch def
4279    /i exch def
4280    solidgetfcolors i str put
4281 end
4282 } def
4283
4284 /solidgetinouttable {
4285    3 get
4286 } def
4287
4288 /solidputsommets {
4289    0 exch put
4290 } def
4291 /solidputpointstable {solidputsommets} def
4292
4293 /solidputfaces {
4294    1 exch put
4295 } def
4296
4297 /solidputfcolors {
4298    2 exch put
4299 } def
4300
4301 /solidputinouttable {
4302    3 exch put
4303 } def
4304
4305 %% syntaxe : any issolid --> booleen, vrai si any est de type solid
4306 /issolid {
4307 1 dict begin
4308    /candidat exch def
4309    candidat isarray {
4310       candidat length 4 eq {
4311          candidat 0 get isarray
4312          candidat 1 get isarray and
4313          candidat 2 get isarray and
4314          candidat 3 get isarray and
4315       } {
4316          false
4317       } ifelse
4318    } {
4319       false
4320    } ifelse
4321 end
4322 } def
4323
4324 /dupsolid {
4325 5 dict begin
4326    /solid exch def
4327    /S solid solidgetsommets def
4328    /F solid solidgetfaces def
4329    /FC solid solidgetfcolors def
4330    /IO solid solidgetinouttable def
4331    solid
4332    [
4333       S duparray exch pop
4334       F duparray exch pop
4335       FC duparray exch pop
4336       IO duparray exch pop
4337    ]
4338 end
4339 } def
4340
4341 %% syntaxe : solid array solidputinfaces --> -
4342 /solidputinfaces {
4343 4 dict begin
4344    /facesinternes exch def
4345    /solid exch def
4346    /n2 facesinternes length def
4347    /IO solid solidgetinouttable def
4348    /facesexternes solid solidgetoutfaces def
4349    /n1 facesexternes length def
4350    solid
4351       [facesexternes aload pop facesinternes aload pop]
4352       solidputfaces
4353    IO 0 0 put
4354    IO 1 n1 1 sub put
4355    IO 2 n1 put
4356    IO 3 n1 n2 add 1 sub put
4357 end
4358 } def
4359
4360 %% %% syntaxe : solid array solidputoutfaces --> -
4361 %% /solidputoutfaces {
4362 %% 4 dict begin
4363 %%    /facesexternes exch def
4364 %%    /solid exch def
4365 %%    /n1 facesexternes length def
4366 %%    /IO solid solidgetinouttable def
4367 %%    /facesinternes solid solidgetinfaces def
4368 %%    /n2 facesinternes length def
4369 %%    solid
4370 %%       [facesexternes aload pop facesinternes aload pop]
4371 %%       solidputfaces
4372 %%    IO 0 0 put
4373 %%    IO 1 n1 1 sub put
4374 %%    IO 2 n1 put
4375 %%    IO 3 n1 n2 add 1 sub put
4376 %% end
4377 %% } def
4378
4379 %% syntaxe : solid array solidputoutfaces --> -
4380 /solidputoutfaces {
4381 4 dict begin
4382    /facesexternes exch def
4383    /solid exch def
4384    /n1 facesexternes length def
4385    /IO solid solidgetinouttable def
4386    /facesinternes solid solidgetinfaces def
4387    /n2 facesinternes length def
4388    solid
4389       [facesexternes aload pop facesinternes aload pop]
4390       solidputfaces
4391    IO 0 0 put
4392    IO 1 n1 1 sub put
4393    IO 2 n1 put
4394    IO 3 n1 n2 add 1 sub put
4395 end
4396 } def
4397
4398 /solidnombreinfaces {
4399 1 dict begin
4400    /solid exch def
4401    solid solidwithinfaces {
4402       /IO solid solidgetinouttable def
4403       IO 3 get IO 2 get sub 1 add
4404    } {
4405       0
4406    } ifelse
4407 end
4408 } def
4409
4410 /solidnombreoutfaces {
4411 1 dict begin
4412    /solid exch def
4413    /IO solid solidgetinouttable def
4414    IO 1 get IO 0 get sub 1 add
4415 end
4416 } def
4417
4418 %% syntaxe : solid solidgetinfaces --> array
4419 /solidgetinfaces {
4420 4 dict begin
4421    /solid exch def
4422    solid issolid not {
4423       (Error : mauvais type d argument dans solidgetinfaces) ==
4424       quit
4425    } if
4426    solid solidwithinfaces {
4427       /IO solid solidgetinouttable def
4428       /F solid solidgetfaces def
4429       /n1 IO 2 get def
4430       /n2 IO 3 get def
4431       /n n2 n1 sub 1 add def
4432       F n1 n getinterval
4433    } {
4434       []
4435    } ifelse
4436 end
4437 } def
4438
4439 %% syntaxe : solid solidgetoutfaces --> array
4440 /solidgetoutfaces {
4441 4 dict begin
4442    /solid exch def
4443    solid issolid not {
4444       (Error : mauvais type d argument dans solidgetoutfaces) ==
4445       quit
4446    } if
4447    /IO solid solidgetinouttable def
4448    /F solid solidgetfaces def
4449    /n1 IO 0 get def
4450    /n2 IO 1 get def
4451    /n n2 n1 sub 1 add def
4452    F n1 n getinterval
4453 end
4454 } def
4455
4456 /tracelignedeniveau? false def
4457 /hauteurlignedeniveau 1 def
4458 /couleurlignedeniveau {rouge} def
4459 /linewidthlignedeniveau 4 def
4460
4461 /solidgrid true def
4462 /aretescachees true def
4463 /defaultsolidmode 2 def
4464 /solidgridOn {
4465    /solidgrid true def
4466 } def
4467 /solidgridOff {
4468    /solidgrid false def
4469 } def
4470
4471 %% syntaxe : solid i string solidputfcolor
4472 %% syntaxe : solid str outputcolors
4473 %% syntaxe : solid str1 str2 inoutputcolors
4474 %% syntaxe : solid string n solidputncolors
4475 %% syntaxe : solid array solidputincolors --> -
4476 %% syntaxe : solid array solidputoutcolors --> -
4477 %% syntaxe : solid solidgetincolors --> array
4478 %% syntaxe : solid solidgetoutcolors --> array
4479
4480 %% syntaxe : solid array solidputinfaces --> -
4481 %% syntaxe : solid array solidputoutfaces --> -
4482 %% syntaxe : solid solidgetinfaces --> array
4483 %% syntaxe : solid solidgetoutfaces --> array
4484
4485 %% syntaxe : solid1 solid2 solidfuz -> solid
4486
4487 %% syntaxe : solid i solidgetsommetsface -> array
4488 %% array = tableau de points 3d
4489 /solidgetsommetsface {
4490 1 dict begin
4491    /i exch def
4492    /solid exch def
4493    /F solid i solidgetface def
4494    [
4495       0 1 F length 1 sub {
4496          /k exch def
4497          solid F k get solidgetsommet
4498       } for
4499    ]
4500 end
4501 } def
4502
4503 %% syntaxe : solid index table solidputface -> -
4504 /solidputface {
4505 1 dict begin
4506    /table exch def
4507    /i exch def
4508    solidgetfaces i table put
4509 end
4510 } def
4511
4512 %% syntaxe : solid table solidaddface -> -
4513 %% on ne se preoccupe pas des faces internes
4514 /solidaddface {
4515 1 dict begin
4516    /table exch def
4517    /solid exch def
4518    /IO solid solidgetinouttable def
4519    /n2 IO 1 get def
4520    /FC solid solidgetoutcolors def
4521    IO 1 n2 1 add put
4522    solid [ solid solidgetfaces aload pop table ] solidputfaces
4523    solid IO solidputinouttable
4524 %   solid solidnombrefaces
4525     solid [
4526       FC aload pop () 
4527     ] solidputoutcolors 
4528 end
4529 } def
4530
4531 /solidnombrefaces {
4532 1 dict begin
4533    /solid exch def
4534    solid solidnombreinfaces
4535    solid solidnombreoutfaces
4536    add 
4537 end
4538 } def
4539
4540 %% syntaxe : solid M solidaddsommetexterne -> -
4541 %% on ajoute le sommet sans se preoccuper de rien
4542 /solidaddsommetexterne {
4543 2 dict begin
4544    /M defpoint3d
4545    /solid exch def
4546    solid
4547    [ solid solidgetsommets aload pop M ]
4548    solidputsommets
4549 end
4550 } def
4551
4552 %% syntaxe : solid array solidaddsommets -> -
4553 /solidaddsommets {
4554 2 dict begin
4555    /table exch def
4556    /solid exch def
4557    /n table length 3 idiv def
4558    0 1 0 {
4559       /i exch def
4560       solid table i getp3d solidaddsommet pop
4561    } for
4562 end
4563 } def
4564
4565 %% syntaxe : solid M solidaddsommet -> k
4566 %% on ajoute le sommet M. Si il est deja sur une arete,
4567 %% on l incorpore a la face concernee 
4568 %% s il est deja present, on ne le rajoute pas.
4569 %% Renvoie l indice du sommet rajoute.
4570 /solidaddsommet {
4571 10 dict begin
4572    /M defpoint3d
4573    /solid exch def
4574    /nbf solid solidnombrefaces def
4575    /N solid solidnombresommets def
4576    /sortie -1 def
4577    %% le sommet est-il deja dans la structure
4578    0 1 N 1 sub {
4579       /i exch def
4580 %%       (addsommet) ==
4581 %%       solid i solidgetsommet == == == 
4582 %%       M == == ==
4583 %%       solid i solidgetsommet M eqp3d ==
4584    
4585 %      solid i solidgetsommet M eqp3d {
4586       solid i solidgetsommet M distance3d 1e-7 le {
4587          %% oui => c est fini
4588          /sortie i store
4589       } if
4590    } for
4591    sortie 0 lt {
4592       %% non => on le rajoute
4593       /sortie N def
4594       solid M solidaddsommetexterne
4595       %% est il sur une arete deja codee
4596       0 1 nbf 1 sub {
4597          %% face d indice i
4598          /i exch def
4599          solid i solidgetface /F exch def
4600          /nbsf F length def
4601          0 1 nbsf 1 sub {
4602             /j exch def
4603             M
4604             solid j i solidgetsommetface 
4605             solid j 1 add nbsf mod i solidgetsommetface 
4606             point3dsursegment {
4607                %% il est sur l arete concernee
4608                solid i [
4609                   0 1 j {
4610                      /k exch def
4611                      F k get
4612                   } for
4613                   N
4614                   j 1 add nbsf mod dup 0 eq {
4615                      pop
4616                   } {
4617                      1 nbsf 1 sub {
4618                         /k exch def
4619                         F k get
4620                      } for
4621                   } ifelse
4622                ]  solidputface
4623                exit
4624             } if
4625          } for 
4626       } for
4627    } if
4628    sortie
4629 end
4630 } def
4631
4632 %%%%% ### solidrmsommet ###
4633 %% syntaxe : solid i solidrmsommet -> -
4634 /solidrmsommet {
4635 5 dict begin
4636    /i exch def
4637    /solid exch def
4638    solid issolid not {
4639       (Erreur : mauvais type d argument dans solidrmsommet) ==
4640       quit 
4641    } if
4642    solid i solidsommetsadjsommet length 0 gt {
4643       (Erreur : sommet non isole dans solidrmsommet) ==
4644       quit 
4645    } if
4646
4647    %% on s occupe des sommets
4648    /n solid solidnombresommets def
4649    /S [
4650       0 1 n 1 sub {
4651          /j exch def
4652          j i ne {
4653             solid j solidgetsommet
4654          } if
4655       } for
4656    ] def
4657    solid S solidputsommets
4658    %% on s occupe des faces
4659    /n solid solidnombrefaces def
4660    /F [
4661       0 1 n 1 sub {
4662          %% face d indice j
4663          /j exch def
4664          /Fj solid j solidgetface def
4665          [0 1 Fj length 1 sub {
4666             %% sommet d indice k de la face Fj
4667             /k exch def
4668             Fj k get dup i gt {
4669                1 sub
4670             } if
4671          } for]
4672       } for
4673    ] def
4674    solid F solidputfaces
4675 end
4676 } def
4677
4678 %%%%% ### solidsommetsadjsommet ###
4679 %% syntaxe : solid i solidsommetsadjsommet --> array
4680 %% array est le tableau des indices des sommets adjacents au
4681 %% sommet d indice i
4682 /solidsommetsadjsommet {
4683 6 dict begin
4684    /no exch def
4685    /solid exch def
4686    solid no solidfacesadjsommet /facesadj exch def
4687    /sommetsadj [] def
4688    /nbadj facesadj length def
4689    0 1 nbadj 1 sub {
4690       /j exch def
4691       %% examen de la jieme face
4692       %/j 0 def
4693       /F solid facesadj j get solidgetface def
4694       /nbsommetsface F length def
4695       no F in {
4696          /index exch def
4697          /i1 F index 1 sub nbsommetsface modulo get def
4698          /i2 F index 1 add nbsommetsface mod get def
4699          %% si i1 n est pas deja note, on le rajoute
4700          i1 sommetsadj in {
4701             pop
4702          } {
4703             /sommetsadj [ sommetsadj aload pop i1 ] store
4704          } ifelse
4705          %% si i2 n est pas deja note, on le rajoute
4706          i2 sommetsadj in {
4707             pop
4708          } {
4709             /sommetsadj [ sommetsadj aload pop i2 ] store
4710          } ifelse
4711       } {
4712          (Error : bug dans solidsommetsadjsommet) ==
4713          quit
4714       } ifelse
4715    } for
4716    sommetsadj
4717 end
4718 } def
4719
4720 %%%%% ### solidfacesadjsommet ###
4721 %% syntaxe : solid i solidfacesadjsommet --> array
4722 %% array est le tableau des indices des faces adjacentes au
4723 %% sommet d indice i
4724 /solidfacesadjsommet {
4725 6 dict begin
4726    /no exch def
4727    /solid exch def
4728    /n solid solidnombrefaces def
4729    /indicesfacesadj [] def
4730    0 1 n 1 sub {
4731       /j exch def
4732       /F solid j solidgetface def
4733       no F in {
4734          pop
4735          /indicesfacesadj [ indicesfacesadj aload pop j ] store
4736       } if
4737    } for
4738    indicesfacesadj
4739 end
4740 } def
4741
4742 %%%%% ### fin insertion ###
4743
4744 %% /tracelignedeniveau? false def
4745 %% /hauteurlignedeniveau 1 def
4746 %% /couleurlignedeniveau {rouge} def
4747 %% /linewidthlignedeniveau 4 def
4748 %% 
4749 %% /solidgrid true def
4750 %% /aretescachees true def
4751 %% /defaultsolidmode 2 def
4752
4753 %%%%% ### newsolid ###
4754 %% syntaxe : newsolid --> depose le solide nul sur la pile
4755 /newsolid {
4756    [] [] generesolid
4757 } def
4758
4759 %%%%% ### generesolid ###
4760 /generesolid {
4761 2 dict begin
4762    /F exch def
4763    /S exch def
4764    [S F [F length {()} repeat] [0 F length 1 sub -1 -1]]
4765 end
4766 } def
4767
4768 %%%%% ### nullsolid ###
4769 %% syntaxe : solide nullsolid -> booleen, vrai si le solide est nul
4770 /nullsolid {
4771 1 dict begin
4772    /candidat exch def
4773    candidat issolid not {
4774       (Error type argument dans "nullsolid") ==
4775       quit
4776    } if
4777    candidat solidgetsommets length 0 eq {
4778       true
4779    } {
4780       false
4781    } ifelse
4782 end
4783 } def
4784
4785 %%%%% ### solidnombreoutfaces ###
4786 /solidnombreoutfaces {
4787 4 dict begin
4788    /solid exch def
4789    solid issolid not {
4790       (Error : mauvais type d argument dans solidnombreoutfaces) ==
4791       quit
4792    } if
4793    solid nullsolid {
4794       0
4795    } {
4796       /IO solid solidgetinouttable def
4797       IO 1 get
4798       IO 0 get sub
4799       1 add
4800    } ifelse
4801 end
4802 } def
4803
4804 %%%%% ### solidnombreinfaces ###
4805 /solidnombreinfaces {
4806 4 dict begin
4807    /solid exch def
4808    solid issolid not {
4809       (Error : mauvais type d argument dans solidnombreinfaces) ==
4810       quit
4811    } if
4812    solid solidwithinfaces {
4813       /IO solid solidgetinouttable def
4814       IO 3 get
4815       IO 2 get sub
4816       1 add
4817    } {
4818       0
4819    } ifelse
4820 end
4821 } def
4822
4823 %%%%% ### solidtests ###
4824 %% syntaxe : solid solidwithinfaces --> bool, true si le solide est vide
4825 /solidwithinfaces {
4826 2 dict begin
4827    /solid exch def
4828    solid issolid not {
4829       (Error : mauvais type d argument dans solidwithinfaces) ==
4830       quit
4831    } if
4832    /table solid solidgetinouttable def
4833    table 2 get -1 ne {
4834       true
4835    } {
4836       false
4837    } ifelse
4838 end
4839 } def
4840
4841 %%%%% ### solidgetsommet ###
4842 %% syntaxe : solid i j solidgetsommetface --> sommet i de la face j
4843 /solidgetsommetface {
4844 6 dict begin
4845    /j exch def
4846    /i exch def
4847    /solid exch def
4848    solid issolid not {
4849       (Error : mauvais type d argument dans solidgetsommetface) ==
4850       quit
4851    } if
4852    /table_faces solid solidgetfaces def
4853    /table_sommets solid solidgetsommets def
4854    /k table_faces j get i get def
4855    table_sommets k getp3d
4856 end
4857 } def
4858
4859 %% syntaxe : solid i solidgetsommetsface --> array, tableau des
4860 %% sommets de la face i du solide
4861 /solidgetsommetsface {
4862 6 dict begin
4863    /i exch def
4864    /solid exch def
4865    solid issolid not {
4866       (Error : mauvais type d argument dans solidgetsommetsface) ==
4867       quit
4868    } if
4869    /table_faces solid solidgetfaces def
4870    /table_sommets solid solidgetsommets def
4871    /table_indices table_faces i get def
4872    [
4873       0 1 table_indices length 1 sub {
4874          /j exch def
4875          table_sommets table_indices j get getp3d
4876       } for
4877    ]
4878 end
4879 } def
4880
4881 %% syntaxe : solid i solidgetsommet --> sommet i du solide
4882 /solidgetsommet {
4883 3 dict begin
4884    /i exch def
4885    /solid exch def
4886    solid issolid not {
4887       (Error : mauvais type d argument dans solidgetsommet) ==
4888       quit
4889    } if
4890    /table_sommets solid solidgetsommets def
4891    table_sommets i getp3d
4892 end
4893 } def
4894
4895 %%%%% ### solidcentreface ###
4896 %% syntaxe : solid i solidcentreface --> M
4897 /solidcentreface {
4898    solidgetsommetsface isobarycentre3d
4899 } def
4900
4901 %%%%% ### solidnombre ###
4902 /solidnombresommets {
4903    solidgetsommets length 3 idiv
4904 } def
4905
4906 /solidfacenombresommets {
4907    solidgetface length
4908 } def
4909
4910 /solidnombrefaces {
4911    solidgetfaces length
4912 } def
4913
4914 %%%%% ### solidshowsommets ###
4915 /solidshowsommets {
4916 8 dict begin
4917    dup issolid not {
4918       %% on a un argument
4919       /option exch def
4920    } if
4921    /sol exch def
4922    /n sol solidnombresommets def
4923    /m sol solidnombrefaces def
4924    currentdict /option known not {
4925       /option [0 1 n 1 sub {} for] def
4926    } if
4927    0 1 option length 1 sub {
4928       /k exch def
4929       option k get /i exch def       %% indice du sommet examine
4930       sol i solidgetsommet point3d
4931    } for
4932 end
4933 } def
4934
4935 %%%%% ### solidnumsommets ###
4936 /solidnumsommets {
4937 8 dict begin
4938 %   Font findfont 10 scalefont setfont
4939    dup issolid not {
4940       %% on a un argument
4941       /option exch def
4942    } if
4943    /sol exch def
4944    /n sol solidnombresommets def
4945    /m sol solidnombrefaces def
4946    currentdict /option known not {
4947       /option [0 1 n 1 sub {} for] def
4948    } if
4949    /result [
4950       n {false} repeat
4951    ] def
4952    0 1 option length 1 sub {
4953       /k exch def
4954       option k get /i exch def       %% indice du sommet examine
4955       0 1 m 1 sub {
4956          /j exch def %% indice de la face examinee
4957          i sol j solidgetface in {
4958             %% le sommet i est dans la face j
4959             pop
4960             exit
4961          } if
4962       } for
4963       %% le sommet i est dans la face j
4964       sol j solidcentreface /G defpoint3d
4965       sol i solidgetsommet /S defpoint3d
4966       i (   ) cvs
4967       G S vecteur3d normalize3d
4968       15 dup ptojpoint pop
4969       mulv3d
4970       S addv3d
4971       3dto2d cctext
4972    } for
4973 end
4974 } def
4975
4976 %%%%% ### gestionsolidmode ###
4977 %% table = [ [vars] [mode0] [mode1] [mode2] [mode3] [mode4] ]
4978 /gestionsolidmode {
4979 5 dict begin
4980    /table exch def
4981    dup xcheck {
4982       /mode exch def
4983    } {
4984       dup isarray {
4985          /tableaffectation exch def
4986          /mode -1 def
4987       } {
4988          /mode defaultsolidmode def
4989       } ifelse
4990    } ifelse
4991    /vars table 0 get def
4992    /nbvars vars length def
4993    mode 0 ge {
4994       /tableaffectation table mode 1 add 5 min get def
4995    } if
4996    0 1 nbvars 1 sub {
4997       /i exch def
4998       vars i get
4999       tableaffectation i get
5000    } for
5001    nbvars 
5002 end
5003    {def} repeat
5004 } def
5005
5006 %%%%% ### solidfuz ###
5007 %% syntaxe : solid1 solid2 solidfuz -> solid
5008 /solidfuz {
5009 5 dict begin
5010    /solid2 exch def
5011    /solid1 exch def
5012    /S1 solid1 solidgetsommets def
5013    /S2 solid2 solidgetsommets def
5014    /n S1 length 3 idiv def
5015
5016    %% les sommets
5017    /S S1 S2 append def
5018
5019    %% les faces internes et leurs couleurs
5020    /FI1 solid1 solidgetinfaces def
5021    /FIC1 solid1 solidgetincolors def
5022    solid2 solidnombreinfaces 0 eq {
5023       /FI2 [] def
5024       /FIC2 [] def
5025    } {
5026       /FI2 solid2 solidgetinfaces {{n add} apply} apply def
5027       /FIC2 solid2 solidgetincolors def
5028    } ifelse
5029    /FI [FI1 aload pop FI2 aload pop] def
5030    /FIC [FIC1 aload pop FIC2 aload pop] def
5031
5032    %% les faces externes et leurs couleurs
5033    /FO1 solid1 solidgetoutfaces def
5034    /FOC1 solid1 solidgetoutcolors def
5035    /FO2 solid2 solidgetoutfaces {{n add} apply} apply def
5036    /FOC2 solid2 solidgetoutcolors def
5037    /FO [FO1 aload pop FO2 aload pop] def
5038    /FOC [FOC1 aload pop FOC2 aload pop] def
5039
5040    /F [FO aload pop FI aload pop] def
5041    /FC [FOC aload pop FIC aload pop] def
5042    /IO [0 FO length 1 sub dup 1 add dup FI length add 1 sub] def
5043
5044    S F generesolid
5045    dup FC solidputfcolors
5046    dup IO solidputinouttable
5047 end
5048 } def
5049
5050 %%%%% ### solidnormaleface ###
5051 %% syntaxe : solid i solidnormaleface --> u, vecteur normale a la
5052 %% face d indice i du solide
5053 /solidnormaleface {
5054 4 dict begin
5055    /i exch def
5056    /solid exch def
5057    solid issolid not {
5058       (Error : mauvais type d argument dans solidgetsommetface) ==
5059       quit
5060    } if
5061 %%    solid 0 i solidgetsommetface /G defpoint3d
5062 %%    G
5063 %%    solid 1 i solidgetsommetface
5064 %%    vecteur3d
5065 %%    G
5066 %%    solid 2 i solidgetsommetface
5067 %%    vecteur3d
5068
5069    /n solid i solidfacenombresommets def
5070    solid i solidcentreface /G defpoint3d
5071   %% debug %%   G 3dto2d point
5072    G
5073    solid 0 i solidgetsommetface
5074    /A defpoint3d
5075   %   gsave bleu A point3d grestore
5076    A
5077    vecteur3d normalize3d
5078    G
5079    solid 1 i solidgetsommetface
5080    /A defpoint3d
5081   %   gsave orange A point3d grestore
5082    A
5083    vecteur3d normalize3d
5084    vectprod3d
5085    /resultat defpoint3d
5086    resultat normalize3d
5087 end
5088 } def
5089
5090 %%%%% ### solidtransform ###
5091 %% syntaxe : solid1 {f} solidtransform --> solid2, solid2 est le
5092 %% transforme de solid1 par la transformation f : R^3 -> R^3
5093 /solidtransform {
5094 3 dict begin
5095    /f exch def
5096    /solid exch def
5097    solid issolid not {
5098       (Error : mauvais type d argument dans solidtransform) ==
5099       quit
5100    } if
5101    /les_sommets
5102       solid solidgetsommets {f} papply3d
5103    def
5104    solid les_sommets solidputsommets
5105    solid
5106 end
5107 } def
5108
5109 %%%%% ### solidputcolor ###
5110 %% syntaxe : solid i string solidputfcolor
5111 /solidputfcolor {
5112 3 dict begin
5113    /str exch def
5114    /i exch def
5115    /solid exch def
5116    /FC solid solidgetfcolors def
5117    i FC length lt {
5118       FC i str put
5119    } if
5120 end
5121 } def
5122
5123 %% syntaxe : solid solidgetincolors --> array
5124 /solidgetincolors {
5125 3 dict begin
5126    /solid exch def
5127    solid issolid not {
5128       (Error : mauvais type d argument dans solidgetincolors) ==
5129       quit
5130    } if
5131    solid solidwithinfaces {
5132       /fcol solid solidgetfcolors def
5133       /IO solid solidgetinouttable def
5134       /n1 IO 2 get def
5135       /n2 IO 3 get def
5136       /n n2 n1 sub 1 add def
5137       fcol n1 n getinterval
5138    } {
5139       []
5140    } ifelse
5141 end
5142 } def
5143
5144 %% syntaxe : solid solidgetoutcolors --> array
5145 /solidgetoutcolors {
5146 3 dict begin
5147    /solid exch def
5148    solid issolid not {
5149       (Error : mauvais type d argument dans solidgetoutcolors) ==
5150       quit
5151    } if
5152    /fcol solid solidgetfcolors def
5153    /IO solid solidgetinouttable def 
5154    /n1 IO 0 get def
5155    /n2 IO 1 get def
5156    /n n2 n1 sub 1 add def
5157    fcol n1 n getinterval 
5158 end
5159 } def
5160  
5161 %% syntaxe : solid array solidputincolors --> -
5162 /solidputincolors {
5163 4 dict begin
5164    /newcolorstable exch def
5165    /solid exch def
5166    solid issolid not {
5167       (Error : mauvais type d argument dans solidputincolors) ==
5168       quit
5169    } if
5170    /n newcolorstable length def
5171    n solid solidnombreinfaces ne {
5172       (Error : mauvaise longueur de tableau dans solidputincolors) ==
5173       quit
5174    } if
5175    n 0 ne {
5176       /FC solid solidgetfcolors def
5177       /IO solid solidgetinouttable def
5178       /n1 IO 2 get def
5179       FC n1 newcolorstable putinterval
5180    } if
5181 end
5182 } def
5183
5184 %% syntaxe : solid array solidputoutcolors --> -
5185 /solidputoutcolors {
5186 4 dict begin
5187    /newcolorstable exch def
5188    /solid exch def
5189    solid issolid not {
5190       (Error : mauvais type d argument dans solidputoutcolors) ==
5191       quit
5192    } if
5193    /n newcolorstable length def
5194    n solid solidnombreoutfaces ne {
5195       (Error : mauvaise longueur de tableau dans solidputoutcolors) ==
5196       quit
5197    } if
5198    n 0 ne {
5199       /FC solid solidgetfcolors def
5200       /IO solid solidgetinouttable def
5201       /n1 IO 0 get def
5202       FC n1 newcolorstable putinterval
5203    } if
5204 end
5205 } def
5206
5207 %% syntaxe : solid str outputcolors
5208 /outputcolors {
5209 5 dict begin
5210    /color exch def
5211    /solid exch def
5212    solid issolid not {
5213       (Error : mauvais type d argument dans inoutputcolors) ==
5214       quit
5215    } if
5216    /n solid solidnombreoutfaces def
5217    solid [ n {color} repeat ] solidputoutcolors
5218 end
5219 } def
5220
5221 %% syntaxe : solid str inputcolors
5222 /inputcolors {
5223 5 dict begin
5224    /color exch def
5225    /solid exch def
5226    solid issolid not {
5227       (Error : mauvais type d argument dans inoutputcolors) ==
5228       quit
5229    } if
5230    /n solid solidnombreinfaces def
5231    solid [ n {color} repeat ] solidputincolors
5232 end
5233 } def
5234
5235 %% syntaxe : solid str1 str2 inoutputcolors
5236 /inoutputcolors {
5237 5 dict begin
5238    /colout exch def
5239    /colin exch def
5240    /solid exch def
5241    solid colin inputcolors
5242    solid colout outputcolors
5243 end
5244 } def
5245
5246 %% syntaxe : solid array solidputoutcolors --> -
5247 /solidputoutcolors {
5248 4 dict begin
5249    /newcolorstable exch def
5250    /solid exch def
5251    solid issolid not {
5252       (Error : mauvais type d argument dans solidputoutcolors) ==
5253       quit
5254    } if
5255    /n newcolorstable length def
5256    n solid solidnombreoutfaces ne {
5257       (Error : mauvaise longueur de tableau dans solidputoutcolors) ==
5258       quit
5259    } if
5260    n 0 ne {
5261       /FC solid solidgetfcolors def
5262       /IO solid solidgetinouttable def
5263       /n1 IO 0 get def
5264       FC length n n1 add lt {
5265          solid newcolorstable solidputfcolors
5266       } {
5267          FC n1 newcolorstable putinterval
5268       } ifelse
5269    } if
5270 end
5271 } def
5272
5273 %%%%% ### solidputhuecolors ###
5274 %% syntaxe : solid table solidputhuecolors --> -
5275 /solidputhuecolors {
5276 1 dict begin
5277    2 copy pop
5278    solidgetinouttable /IO exch def
5279    IO 0 get
5280    IO 1 get
5281    s@lidputhuec@l@rs
5282 end
5283 } def
5284
5285 /solidputinhuecolors {
5286 2 dict begin
5287    /table exch def
5288    /solid exch def
5289    solid solidgetinouttable /IO exch def
5290    solid solidwithinfaces {
5291       solid table
5292       IO 2 get
5293       IO 3 get
5294       s@lidputhuec@l@rs
5295    } if
5296 end
5297 } def
5298
5299 /solidputinouthuecolors {
5300 1 dict begin
5301    2 copy pop
5302    solidgetinouttable /IO exch def
5303    IO 0 get
5304    IO 3 get IO 1 get max
5305    s@lidputhuec@l@rs
5306 end
5307 } def
5308
5309 %% syntaxe : solid table n1 n2 s@lidputhuec@l@rs --> -
5310 %% affecte les couleurs des faces d indice n1 a n2 du solid solid, par
5311 %% un degrade defini par la table.
5312  /s@lidputhuec@l@rs {
5313 9 dict begin
5314    /n2 exch def
5315    /n1 exch def
5316    /table exch def
5317    /solid exch def
5318    /n n2 n1 sub def
5319
5320    table length 2 eq {
5321        /a0 table 0 get def
5322        /a1 table 1 get def
5323        a1 isstring {
5324           /lacouleurdepart {
5325              gsave
5326                 [a0 cvx exec] length 0 eq {
5327                    a0 cvx exec currentrgbcolor
5328                 } {
5329                    a0 cvx exec
5330                 } ifelse 
5331              grestore
5332           } def
5333           /lacouleurarrivee {
5334              gsave
5335                 [a1 cvx exec] length 0 eq {
5336                    a1 cvx exec currentrgbcolor
5337                 } {
5338                    a1 cvx exec
5339                 } ifelse 
5340              grestore
5341           } def
5342           /table [lacouleurdepart lacouleurarrivee] def
5343        } {
5344           /A {a0 i a1 a0 sub mul n 1 sub div add} def
5345           /B {1} def
5346           /C {1} def
5347           /D {} def
5348           /espacedecouleurs (sethsbcolor) def
5349        } ifelse
5350    } if
5351
5352    table length 4 eq {
5353        /a0 table 0 get def
5354        /a1 table 1 get def
5355        /A {a0 i a1 a0 sub mul n 1 sub div add} def
5356        /B table 2 get def
5357        /C table 3 get def
5358        /D {} def
5359        /espacedecouleurs (sethsbcolor) def
5360    } if
5361
5362    table length 6 eq {
5363        /a0 table 0 get def
5364        /b0 table 1 get def
5365        /c0 table 2 get def
5366        /a1 table 3 get def
5367        /b1 table 4 get def
5368        /c1 table 5 get def
5369        /A {a0 i a1 a0 sub mul n 1 sub div add} def
5370        /B {b0 i b1 b0 sub mul n 1 sub div add} def
5371        /C {c0 i c1 c0 sub mul n 1 sub div add} def
5372        /D {} def
5373        /espacedecouleurs (setrgbcolor) def
5374    } if
5375
5376    table length 7 eq {
5377        /a0 table 0 get def
5378        /b0 table 1 get def
5379        /c0 table 2 get def
5380        /a1 table 3 get def
5381        /b1 table 4 get def
5382        /c1 table 5 get def
5383        /A {a0 i a1 a0 sub mul n 1 sub div add} def
5384        /B {b0 i b1 b0 sub mul n 1 sub div add} def
5385        /C {c0 i c1 c0 sub mul n 1 sub div add} def
5386        /D {} def
5387        /espacedecouleurs (sethsbcolor) def
5388    } if
5389
5390    table length 8 eq {
5391        /a0 table 0 get def
5392        /b0 table 1 get def
5393        /c0 table 2 get def
5394        /d0 table 3 get def
5395        /a1 table 4 get def
5396        /b1 table 5 get def
5397        /c1 table 6 get def
5398        /d1 table 7 get def
5399        /A {a0 i a1 a0 sub mul n 1 sub div add} def
5400        /B {b0 i b1 b0 sub mul n 1 sub div add} def
5401        /C {c0 i c1 c0 sub mul n 1 sub div add} def
5402        /D {d0 i d1 d0 sub mul n 1 sub div add} def
5403        /espacedecouleurs (setcmykcolor) def
5404    } if
5405
5406    n1 1 n2 {
5407       /i exch def
5408       solid i
5409       [A B C D] espacedecouleurs astr2str
5410       solidputfcolor
5411    } for
5412    
5413 end
5414 } def
5415
5416 %%%%% ### solidrmface ###
5417 %% syntaxe : solid i solidrmface -> -
5418 /solidrmface {
5419 5 dict begin
5420    /i exch def
5421    /solid exch def
5422    solid issolid not {
5423       (Error : mauvais type d argument dans solidrmface) ==
5424       quit
5425    } if
5426    %% on enleve la face
5427    /F solid solidgetfaces def
5428    F length 1 sub i lt {
5429       (Error : indice trop grand dans solidrmface) ==
5430       quit
5431    } if
5432    [
5433       0 1 F length 1 sub {
5434          /j exch def
5435          i j ne {
5436             F j get
5437          } if
5438       } for
5439    ]
5440    /NF exch def
5441    solid NF solidputfaces
5442    %% on enleve la couleur correspondante
5443    /FC solid solidgetfcolors def
5444    [
5445       0 1 FC length 1 sub {
5446          /j exch def
5447          i j ne {
5448             FC j get
5449          } if
5450       } for
5451    ]
5452    /NFC exch def
5453    solid NFC solidputfcolors
5454    %% on ajuste la table inout
5455    /IO solid solidgetinouttable def
5456    solid i solidisoutface {
5457       IO 1 IO 1 get 1 sub put 
5458       solid solidwithinfaces {
5459          IO 2 IO 2 get 1 sub put
5460          IO 3 IO 3 get 1 sub put
5461       } if
5462    } if
5463    solid i solidisinface {
5464       IO 1 IO 1 get 1 sub put
5465       IO 2 IO 2 get 1 sub put
5466       IO 3 IO 3 get 1 sub put
5467    } if
5468    solid IO solidputinouttable
5469 end
5470 } def
5471
5472 %% syntaxe : solid table solidrmfaces --> -
5473 /solidrmfaces {
5474 2 dict begin
5475    /table exch bubblesort reverse def
5476    /solid exch def
5477    table {solid exch solidrmface} apply
5478 end
5479 } def
5480
5481 %%%%% ### videsolid ###
5482 %% syntaxe : solid videsolid -> -
5483 /videsolid {
5484 5 dict begin
5485    /solid exch def
5486    solid issolid not {
5487       (Error : mauvais type d argument dans videsolid) ==
5488       quit
5489    } if
5490    solid solidwithinfaces not {
5491       /IO solid solidgetinouttable def
5492       /FE solid solidgetfaces def
5493       /n FE length def
5494       IO 2 n put
5495       IO 3 2 n mul 1 sub put
5496       solid IO solidputinouttable
5497       %% on inverse chaque face
5498       /FI FE {reverse} apply def
5499       solid FE FI append solidputfaces
5500       %% et on rajoute autant de couleurs vides que de faces
5501       /FEC solid solidgetfcolors def
5502 %      /FIC [FI length {()} repeat] def
5503 %      solid FEC FIC append solidputfcolors
5504       solid FEC duparray append solidputfcolors
5505    } if 
5506 end
5507 } def
5508
5509 %%%%% ### solidnumfaces ###
5510 %% syntaxe : solid array solidnumfaces
5511 %% syntaxe : solid array bool solidnumfaces
5512 %% array, le tableau des indices des faces a numeroter, est optionnel
5513 %% si bool=true, on ne numerote que les faces visibles
5514 /solidnumfaces {
5515 5 dict begin
5516    dup isbool {
5517       /bool exch def
5518    } {
5519       /bool true def
5520    } ifelse
5521    setTimes
5522    dup issolid not {
5523       %% on a un argument
5524       /option exch def 
5525    } if
5526    /sol exch def
5527    /n sol solidnombrefaces def
5528    currentdict /option known not {
5529       /option [0 1 n 1 sub {} for] def
5530    } if
5531
5532    0 1 option length 1 sub {
5533       /i exch def
5534       /j option i get def
5535       j (     ) cvs sol j bool cctextp3d
5536    } for
5537 end
5538 } def
5539
5540 %%%%% ### creusesolid ###
5541 %% syntaxe : solid creusesolid -> -
5542 /creusesolid {
5543 5 dict begin
5544    /solid exch def
5545    solid issolid not {
5546       (Error : mauvais type d argument dans creusesolid) ==
5547       quit
5548    } if
5549    %% on enleve le fond et le chapeau
5550    solid 1 solidrmface
5551    solid 0 solidrmface
5552    %% on inverse chaque face
5553    solid videsolid
5554 end
5555 } def
5556
5557 %%%%% ### fin insertion ###
5558
5559 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5560 %%%%                 dessin des solides                 %%%%
5561 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5562
5563 %%%%% ### solidisinface ###
5564 %% syntaxe : solid i solidisinface --> bool
5565 %% true si i est l indice d une face interne, false sinon
5566 /solidisinface {
5567 4 dict begin
5568    /i exch def
5569    solidgetinouttable /IO exch def
5570    /n1 IO 2 get def
5571    /n2 IO 3 get def
5572    n1 i le 
5573    i n2 le and
5574 end
5575 } def
5576
5577 %%%%% ### solidisoutface ###
5578 %% syntaxe : solid i solidisoutface --> bool
5579 %% true si i est l indice d une face externe, false sinon
5580 /solidisoutface {
5581 4 dict begin
5582    /i exch def
5583    solidgetinouttable /IO exch def
5584    /n1 IO 0 get def
5585    /n2 IO 1 get def
5586    n1 i le 
5587    i n2 le and
5588 end
5589 } def
5590
5591 %%%%% ### planvisible ###
5592 %% syntaxe : A k planvisible? --> true si le plan est visible
5593 /planvisible? {
5594 4 dict begin
5595    /normale_plan defpoint3d
5596    /origine defpoint3d
5597    /ligne_de_vue {
5598       origine
5599       GetCamPos
5600       vecteur3d
5601    } def
5602    ligne_de_vue normale_plan scalprod3d 0 gt
5603 end
5604 } def
5605
5606 %%%%% ### solidlight ###
5607 %/lightintensity 1 def
5608 %/lightsrc {10 15 20} def
5609
5610 /setlightintensity {
5611    /lightintensity exch def
5612 } def
5613
5614 /setlightsrc {
5615    /lightsrc defpoint3d
5616 } def
5617
5618 /setlight {
5619 1 dict begin
5620 gsave
5621    exec
5622    [ currentrgbcolor ] /lightcolor exch 
5623 grestore
5624 end
5625 def
5626 } def
5627
5628 %%%%% ### drawsolid ###
5629 %% syntaxe : solid i solidfacevisible? --> true si la face est visible
5630 /solidfacevisible? {
5631 4 dict begin
5632    /i exch def
5633    /solid exch def
5634    solid issolid not {
5635       (Error : mauvais type d argument dans solidgetsommetface) ==
5636       quit
5637    } if
5638    solid i solidgetface length 2 le {
5639       true
5640    } {
5641       /ligne_de_vue {
5642          solid i solidcentreface
5643          GetCamPos
5644          vecteur3d
5645       } def
5646    
5647       /normale_face {
5648          solid i solidnormaleface
5649       } def
5650       ligne_de_vue normale_face scalprod3d 0 gt
5651    } ifelse
5652 end
5653 } def
5654
5655 %% syntaxe : solid i affectecouleursolid_facei --> si la couleur de
5656 %% la face i est definie, affecte fillstyle a cette couleur
5657 /affectecouleursolid_facei {
5658 3 dict begin
5659    /i exch def
5660    /solid exch def
5661    solid solidgetfcolors /FC exch def
5662    FC length 1 sub i ge {
5663       FC i get length 1 ge {
5664          /fillstyle FC i get ( fill) append cvx
5665          true
5666       } {
5667          false
5668       } ifelse
5669    } {
5670       false
5671    } ifelse
5672 end
5673 {def} if
5674 } def
5675
5676 %% syntaxe : A solid i dessinefacecachee
5677 /dessinefacecachee {
5678 6 dict begin
5679    /i exch def
5680    /solid exch def
5681    solid issolid not {
5682       (Error : mauvais type d argument dans dessinefacecachee) ==
5683       quit
5684    } if
5685    /A exch def
5686
5687    /F solid solidgetfaces def
5688    /S solid solidgetsommets def
5689
5690    solid i solidfacevisible? not {
5691       %% face cachee => on prend chacune des aretes de la face et on
5692       %% regarde si elle est deja dessinee.
5693       4 dict begin
5694          /n F i get length def %% nb de sommets de la face
5695          0 1 n 1 sub {
5696          /k exch def
5697             /k1 F i k get_ij def              %% indice sommet1
5698             /k2 F i k 1 add n mod get_ij def  %% indice sommet2
5699             A k1 k2 get_ij not {
5700                gsave
5701                   currentlinewidth .5 mul setlinewidth
5702                   pointilles
5703                   [S k1 getp3d
5704                   S k2 getp3d] ligne3d
5705                   A k1 k2 true put_ij
5706                   A k2 k1 true put_ij
5707                grestore
5708             } if
5709          } for
5710       end
5711    } if
5712 end
5713 } def
5714
5715 %% syntaxe : A solid i dessinefacevisible
5716 /dessinefacevisible {
5717 8 dict begin
5718    /i exch def
5719    /solid exch def
5720    /A exch def
5721    solid issolid not {
5722       (Error : mauvais type d argument dans dessinefacevisible) ==
5723       quit
5724    } if
5725    /F solid solidgetfaces def
5726    /S solid solidgetsommets def
5727
5728    solid i solidfacevisible? {
5729       /n F i get length def %% nb de sommets de la face
5730
5731       startest {
5732          %% choix de la couleur
5733          /lightcolor where {
5734             pop
5735             /coeff
5736                lightintensity
5737                solid i solidnormaleface normalize3d
5738                solid i solidcentreface lightsrc vecteur3d normalize3d
5739                scalprod3d mul
5740                0 max 1 min
5741             def
5742             /fillstyle {
5743                 lightcolor {coeff mul} apply setcolor fill
5744             } def
5745             solidgrid not {
5746                lightcolor {coeff mul} apply setcolor
5747             } if
5748          } {
5749             /lightsrc where {
5750                pop
5751                /coeff
5752                   lightintensity
5753                   solid i solidnormaleface normalize3d
5754                   solid i solidcentreface lightsrc vecteur3d normalize3d
5755                   scalprod3d mul
5756                   0 max 1 min
5757                def
5758                /lacouleur [
5759                   gsave
5760                      solid solidgetfcolors i get cvx exec currentrgbcolor
5761                   grestore
5762                ] def
5763                /fillstyle {
5764                   lacouleur {coeff mul} apply setcolor fill
5765                } def
5766                solidgrid not {
5767                   lacouleur {coeff mul} apply setcolor
5768                } if
5769             } {
5770   %               solid F i get length affectecouleursolid_ncotes
5771                solid i affectecouleursolid_facei
5772             } ifelse
5773
5774          } ifelse
5775       } if
5776
5777       /face_a_dessiner [  %% face visible : F [i]
5778          0 1 n 1 sub {
5779             /j exch def
5780             solid j i solidgetsommetface
5781          } for
5782       ] def 
5783       face_a_dessiner polygone3d
5784       /lignedeniveau [] def
5785
5786       %% trace de la ligne de niveau
5787       tracelignedeniveau? {
5788          gsave
5789             linewidthlignedeniveau setlinewidth
5790             couleurlignedeniveau
5791             0 1 n 1 sub {
5792                /j exch def
5793                face_a_dessiner j getp3d
5794                face_a_dessiner j 1 add n mod getp3d
5795                hauteurlignedeniveau segment_inter_planz {
5796                1 dict begin
5797                   /table exch def
5798                   /lignedeniveau [ 
5799                      lignedeniveau aload pop 
5800                      table 0 getp3d
5801                      table length 4 ge {
5802                         table 1 getp3d
5803                      } if
5804                   ] store
5805                end
5806                } if
5807             } for
5808             lignedeniveau length 4 ge 
5809                {lignedeniveau ligne3d}
5810             if
5811          grestore
5812       } if
5813
5814       %% on marque les aretes
5815       aretescachees {
5816          0 1 n 1 sub {
5817             /j exch def
5818             /k1 F i j get_ij def              %% indice sommet1
5819             /k2 F i j 1 add n mod get_ij def  %% indice sommet2
5820             A k1 k2 true put_ij
5821             A k2 k1 true put_ij
5822          } for
5823       } if
5824    } if
5825 end
5826 } def
5827
5828 /drawsolid* {
5829 1 dict begin
5830    /startest {true} def
5831    drawsolid
5832 end
5833 } def
5834
5835 /peintrealgorithme false def
5836
5837 /drawsolid** {
5838 2 dict begin
5839    /aretescachees false def
5840    /peintrealgorithme true def
5841    drawsolid*
5842 end
5843 } def
5844
5845 %% syntaxe : solid array drawsolid
5846 %% array est en option, il indique les faces triees
5847 /drawsolid {
5848 8 dict begin
5849    dup issolid not {
5850       /ordre exch def
5851    } if
5852    /solid exch def
5853    solid issolid not {
5854       (Error : mauvais type d argument dans drawsolid) ==
5855       quit
5856    } if
5857    solid nullsolid not {
5858       solid solidgetfaces
5859       /F exch def
5860       solid solidgetsommets
5861       /S exch def
5862       /n S length 3 idiv def
5863       %% tableau des aretes
5864       /A [
5865          aretescachees {
5866             n {
5867                [n {false} repeat]
5868             } repeat
5869          } if
5870        ] def
5871
5872       currentdict /ordre known not {
5873          peintrealgorithme {
5874             %% tri des indices des faces par distance decroissante
5875             [
5876                0 1 F length 1 sub {
5877                   /i exch def
5878                   solid i solidcentreface
5879                   GetCamPos
5880                   distance3d
5881                } for
5882             ] doublequicksort pop reverse
5883          } {
5884             [
5885                0 1 F length 1 sub {
5886                } for
5887             ]
5888          } ifelse
5889          /ordre exch def
5890       } if
5891
5892       0 1 F length 1 sub {
5893          /k exch def
5894          /i ordre k get def
5895          gsave
5896          A solid i dessinefacevisible
5897          grestore
5898       } for
5899       aretescachees {
5900          0 1 F length 1 sub {
5901             /k exch def
5902             /i ordre k get def
5903             A solid i dessinefacecachee
5904          } for
5905       } if
5906 %%       %% si on veut repasser les traits des faces visibles
5907 %%       0 1 F length 1 sub {
5908 %%          /k exch def
5909 %%          /i ordre k get def
5910 %%          gsave
5911 %%          1 dict begin
5912 %%             /startest false def
5913 %%             A solid i dessinefacevisible
5914 %%          end
5915 %%          grestore
5916 %%       } for
5917    } if
5918 end
5919 } def
5920
5921 %%%%% ### segment_inter_planz ###
5922 %% syntaxe : A B k segment_inter_planz --> array true ou false
5923 /segment_inter_planz {
5924 4 dict begin
5925    /k exch def
5926    /B defpoint3d
5927    /A defpoint3d
5928    A /zA exch def pop pop
5929    B /zB exch def pop pop
5930    zA k sub zB k sub mul dup 0 gt {
5931       %% pas d intersection
5932       pop
5933       false
5934    } {
5935       0 eq {
5936          %% intersection en A ou en B
5937          [ 
5938             zA k eq {A} if
5939             zB k eq {B} if
5940          ] true
5941       } {
5942          %% intersection entre A et B
5943          [
5944             A B vecteur3d
5945             k zA sub zB zA sub div mulv3d
5946             A addv3d
5947          ] true
5948       } ifelse
5949    } ifelse
5950 end
5951 } def
5952
5953 %%%%% ### fin insertion ###
5954
5955 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5956 %%%%     operations sur des solides particuliers        %%%%
5957 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5958
5959 %%%%% ### dualpolyedre ###
5960 %% syntaxe : solid dualpolyedreregulier --> solid
5961 %% syntaxe : solid r dualpolyedreregulier --> solid
5962 %% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r
5963 /dualpolyedreregulier {
5964 20 dict begin
5965    dup isnum {
5966       /r exch def
5967       /projection true def
5968    } {
5969       /projection false def
5970    } ifelse
5971    /solid exch def
5972    solid dupsolid /result exch def pop
5973    /n solid solidnombrefaces def
5974    /N solid solidnombresommets def
5975    /facesaenlever [] def
5976    %% pour chacun des sommets
5977    0 1 N 1 sub {
5978       %% sommet d indice i
5979       /i exch def
5980       %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i
5981       /indicesfacesadj solid i solidfacesadjsommet def
5982       %% on recupere les centres des faces concernees
5983       /nouveauxsommets [
5984          0 1 indicesfacesadj length 1 sub {
5985             /k exch def 
5986             solid indicesfacesadj k get solidgetsommetsface isobarycentre3d
5987          } for
5988       ] def
5989       %% et on pose G = barycentre de ces points
5990       nouveauxsommets isobarycentre3d /G defpoint3d
5991       %% il faut ordonner ces sommets
5992       nouveauxsommets 0 getp3d /ptref defpoint3d
5993       G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d
5994       nouveauxsommets duparray exch pop
5995       {1 dict begin
5996          /M defpoint3d
5997          G ptref vecteur3d
5998          G M vecteur3d
5999          vecteurnormal angle3doriente
6000       end} papply3d
6001       doublebubblesort pop
6002       %% nos sommets sont tries
6003       /indicesommetstries exch def
6004       projection {
6005          %% on projette les sommets sur la sphere
6006          /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store
6007       } if
6008       %% puis on les rajoute au solide
6009       /nouveauxindices [
6010          0 1 nouveauxsommets length 3 idiv 1 sub {
6011             /k exch def
6012             result nouveauxsommets k getp3d solidaddsommet
6013          } for
6014       ] def
6015       %% ainsi que la face concernee
6016       result [
6017          0 1 indicesommetstries length 1 sub {
6018             /k exch def
6019          nouveauxindices indicesommetstries k get get
6020          } for 
6021       ] solidaddface
6022       /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store
6023    } for
6024    result [0 1 n 1 sub {} for] solidrmfaces
6025    [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply
6026    result
6027 end
6028 } def
6029
6030 %%%%% ### solidchampfreine ###
6031 %% syntaxe : solid coeff i solidchampfreine -> -
6032 %% syntaxe : solid coeff array solidchampfreine -> -
6033 %% syntaxe : solid coeff solidchampfreine -> -
6034 %% syntaxe : solid coeff str solidchampfreine -> -
6035 %% syntaxe : solid coeff bool solidchampfreine -> -
6036 /solidchampfreine {
6037 10 dict begin
6038    dup isbool {
6039       /rmfacecentrale exch def
6040    } {
6041       /rmfacecentrale true def
6042    } ifelse
6043    dup isstring {
6044       /couleurface exch def
6045    } if
6046    2 copy pop issolid {
6047       %% 2 arguments --> on champfreine tout
6048       2 copy pop solidnombrefaces /n exch def
6049       /table [n 1 sub -1 0 {} for] def 
6050    } {
6051       %% 1 tableau --> il donne les faces a enlever
6052       dup isarray {
6053          /table exch bubblesort reverse def
6054       } {
6055       %% 1 seule face a enlever
6056          [ exch ] /table exch def
6057       } ifelse
6058    } ifelse
6059    /coeff exch def
6060    /solid exch def
6061    0 1 table length 1 sub {
6062       /i exch def
6063       solid coeff table i get 
6064       currentdict /couleurface known {
6065          couleurface 
6066       } if
6067       rmfacecentrale s@lidchampfreineface
6068    } for
6069 end
6070 } def
6071
6072 %% syntaxe : solid coeff i s@lidchampfreineface
6073  /s@lidchampfreineface {
6074 10 dict begin
6075    /rmfacecentrale exch def
6076    dup isstring {
6077       /couleurface exch def
6078    } if
6079    /indice_a_chamfreiner exch def
6080    /i indice_a_chamfreiner def
6081    /coeff exch def
6082    /solid exch def
6083    solid issolid not {
6084       (Erreur : mauvais type d argument dans champfreine) ==
6085       quit
6086    } if
6087    /n solid solidnombresommets def
6088    /F solid i solidgetsommetsface def
6089    /Findex solid i solidgetface def
6090    /ni F length 3 idiv def
6091    /couleurfaceorigine solid i solidgetfcolor def
6092    F isobarycentre3d /G defpoint3d
6093    %% on ajoute les nouveaux sommets
6094    /Sindex [] def
6095    0 1 ni 1 sub {
6096       /j exch def
6097       /Sindex [ Sindex aload pop
6098          solid G F j getp3d vecteur3d coeff mulv3d G addv3d solidaddsommet
6099       ] store
6100    } for
6101    %% Sindex contient les indices des nouveaux sommets
6102    %% on prepare les faces a ajouter
6103    /facestoadd [] def
6104    /facestoadd [facestoadd aload pop
6105    0 1 ni 1 sub {
6106       /j exch def
6107       [Findex j get
6108       Findex j 1 add ni mod get
6109       Sindex j 1 add ni mod get
6110       Sindex j get]
6111    } for
6112    ] store
6113    0 1 ni 1 sub {
6114       /i exch def
6115       solid facestoadd i get solidaddface
6116    } for
6117    %% on enleve la face d origine
6118    solid indice_a_chamfreiner solidrmface
6119    %% on ajuste les couleurs des nouvelles faces
6120    /N solid solidnombrefaces def
6121    0 1 ni 1 sub {
6122       /i exch def
6123       solid N 1 sub i sub couleurfaceorigine solidputfcolor
6124    } for
6125    %% puis on ajoute eventuellement la face centrale
6126    rmfacecentrale not {
6127       solid
6128       [0 1 ni 1 sub {
6129          /j exch def
6130          Sindex j get
6131       } for]
6132       solidaddface
6133       %% en ajustant la couleur de cette derniere
6134       solid N
6135       currentdict /couleurface known {
6136             couleurface 
6137       } {
6138          couleurfaceorigine
6139       } ifelse
6140       solidputfcolor
6141    } if
6142 end
6143 } def
6144
6145 %%%%% ### solidtronque ###
6146 %% syntaxe : solid indicesommet k solidtronque --> solid
6147 %% syntaxe : solid array k solidtronque --> solid
6148 %% syntaxe : solid k solidtronque --> solid
6149 %% k entier > 0, array = tableau des indices des sommets
6150 /solidtronque {
6151 10 dict begin
6152    /coeff exch def
6153    dup issolid {
6154       dup solidnombresommets /N exch def
6155       /table [0 1 N 1 sub {} for] def
6156    } {
6157       dup isarray {
6158          /table exch def
6159       } {
6160          [ exch ] /table exch def
6161       } ifelse
6162    } ifelse
6163    /solid exch def
6164    solid dupsolid /result exch def pop
6165    /n solid solidnombrefaces def
6166    0 1 table length 1 sub {
6167       table exch get /no exch def
6168       result no solidgetsommet /sommetvise defpoint3d
6169       %% on recup les sommets adjacents au sommet vise
6170       /sommetsadj solid no solidsommetsadjsommet def
6171       %% on calcule les nouveaux sommets
6172       /nouveauxsommets [
6173          0 1 sommetsadj length 1 sub {
6174             /i exch def
6175             solid sommetsadj i get solidgetsommet
6176          } for
6177       ] {sommetvise exchp3d coeff ABpoint3d} papply3d def 
6178       %% on pose G = barycentre de ces points
6179       nouveauxsommets isobarycentre3d /G defpoint3d
6180       %% il faut ordonner ces sommets
6181       nouveauxsommets 0 getp3d /ptref defpoint3d
6182       G result no solidgetsommet vecteur3d /vecteurnormal defpoint3d
6183       %% on construit le tableau des angles ordonnes par rapport
6184       %% a la normale
6185       nouveauxsommets duparray exch pop
6186       {1 dict begin
6187          /M defpoint3d
6188          G ptref vecteur3d
6189          G M vecteur3d
6190          vecteurnormal angle3doriente
6191       end} papply3d
6192       doublebubblesort pop
6193       %% nos sommets sont tries
6194       /indicesommetstries exch def
6195       %% on rajoute les sommets au solide, et on note les nouveaux indices
6196       /nouveauxindices [
6197          0 1 nouveauxsommets length 3 idiv 1 sub {
6198             /k exch def
6199             result nouveauxsommets k getp3d solidaddsommet
6200          } for
6201       ] def
6202       %% on ajoute la face concernee
6203       result [
6204          0 1 indicesommetstries length 1 sub {
6205             /k exch def
6206          nouveauxindices indicesommetstries k get get
6207          } for 
6208       ] solidaddface
6209       result no solidfacesadjsommet /lesfaces exch def
6210       %% on examine la face d indice i, et on elimine le
6211       %% sommet vise
6212       0 1 lesfaces length 1 sub {
6213          /i exch def
6214          /j lesfaces i get def
6215          /F result j solidgetface def 
6216          result [
6217             0 1 F length 1 sub {
6218                /k exch def 
6219                F k get dup no eq {pop} if
6220             } for
6221          ] j exch solidputface 
6222       } for
6223    } for
6224    table bubblesort reverse {result exch solidrmsommet} apply
6225    result
6226 end
6227 } def
6228
6229 %%%%% ### dualpolyedre ###
6230 %% syntaxe : solid dualpolyedreregulier --> solid
6231 %% syntaxe : solid r dualpolyedreregulier --> solid
6232 %% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r
6233 /dualpolyedreregulier {
6234 20 dict begin
6235    dup isnum {
6236       /r exch def
6237       /projection true def
6238    } {
6239       /projection false def
6240    } ifelse
6241    /solid exch def
6242    solid dupsolid /result exch def pop
6243    /n solid solidnombrefaces def
6244    /N solid solidnombresommets def
6245    /facesaenlever [] def
6246    %% pour chacun des sommets
6247    0 1 N 1 sub {
6248       %% sommet d indice i
6249       /i exch def
6250       %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i
6251       /indicesfacesadj solid i solidfacesadjsommet def
6252       %% on recupere les centres des faces concernees
6253       /nouveauxsommets [
6254          0 1 indicesfacesadj length 1 sub {
6255             /k exch def 
6256             solid indicesfacesadj k get solidgetsommetsface isobarycentre3d
6257          } for
6258       ] def
6259       %% et on pose G = barycentre de ces points
6260       nouveauxsommets isobarycentre3d /G defpoint3d
6261       %% il faut ordonner ces sommets
6262       nouveauxsommets 0 getp3d /ptref defpoint3d
6263       G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d
6264       nouveauxsommets duparray exch pop
6265       {1 dict begin
6266          /M defpoint3d
6267          G ptref vecteur3d
6268          G M vecteur3d
6269          vecteurnormal angle3doriente
6270       end} papply3d
6271       doublebubblesort pop
6272       %% nos sommets sont tries
6273       /indicesommetstries exch def
6274       projection {
6275          %% on projette les sommets sur la sphere
6276          /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store
6277       } if
6278       %% puis on les rajoute au solide
6279       /nouveauxindices [
6280          0 1 nouveauxsommets length 3 idiv 1 sub {
6281             /k exch def
6282             result nouveauxsommets k getp3d solidaddsommet
6283          } for
6284       ] def
6285       %% ainsi que la face concernee
6286       result [
6287          0 1 indicesommetstries length 1 sub {
6288             /k exch def
6289          nouveauxindices indicesommetstries k get get
6290          } for 
6291       ] solidaddface
6292       /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store
6293    } for
6294    result [0 1 n 1 sub {} for] solidrmfaces
6295    [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply
6296    result
6297 end
6298 } def
6299
6300 %%%%% ### newgeode ###
6301 %% syntaxe : solid r newgeode --> solid
6302 %% syntaxe : N r newgeode --> solid
6303 %% N in {3,4,5} -> polyhedre de depart, r = niveau de recursion
6304 /newgeode {
6305 2 dict begin
6306    /r exch def
6307    dup issolid not {
6308       /N exch def
6309       N 3 eq {
6310          1 newtetraedre
6311       } {
6312          N 4 eq {
6313             1 newoctaedre
6314          } {
6315             1 newicosaedre
6316          } ifelse
6317       } ifelse
6318    } if
6319
6320    r {
6321       15 dict begin   
6322          /solid exch def
6323          solid dupsolid /result exch def pop
6324          /n solid solidnombrefaces def
6325          n 1 sub -1 0 {
6326             /i exch def
6327             %% la face d indice i
6328             solid i solidgetface /F exch def
6329             /i0 F 0 get def
6330             /i1 F 1 get def
6331             /i2 F 2 get def
6332             solid i0 solidgetsommet /A0 defpoint3d
6333             solid i1 solidgetsommet /A1 defpoint3d
6334             solid i2 solidgetsommet /A2 defpoint3d
6335             A0 A1 milieu3d normalize3d /A01 defpoint3d
6336             A1 A2 milieu3d normalize3d /A12 defpoint3d
6337             A2 A0 milieu3d normalize3d /A20 defpoint3d
6338             result A01 solidaddsommet /i01 exch def
6339             result A12 solidaddsommet /i12 exch def
6340             result A20 solidaddsommet /i20 exch def
6341             result i solidrmface
6342             result [i0 i01 i20] solidaddface
6343             result [i01 i1 i12] solidaddface
6344             result [i01 i12 i20] solidaddface
6345             result [i20 i12 i2] solidaddface
6346          } for
6347          result
6348       end
6349    } repeat
6350 end
6351 } def
6352
6353 %% syntaxe : N r newdualgeode --> solid
6354 /newdualgeode {
6355    newgeode 1
6356    dualpolyedreregulier
6357 } def
6358
6359 %%%%% ### fin insertion ###
6360
6361
6362 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6363 %%%%             quelques solides precalcules           %%%%
6364 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6365
6366 %%%%% ### newface ### 
6367 %% syntaxe : array newmonoface -> solid
6368 %% ou array = tableau de points 2d
6369 /newmonoface {
6370 4 dict begin
6371    /table exch def
6372    /n table length 2 idiv def
6373    /S table {0} papply def
6374
6375    /F [
6376        [0 1 n 1 sub {} for]
6377    ] def
6378    S F generesolid
6379 end
6380 } def
6381
6382 %% syntaxe : array newbiface -> solid
6383 %% ou array = tableau de points 2d
6384 /newbiface {
6385    newmonoface
6386    dup videsolid
6387 } def
6388
6389 %%%%% ### newpolreg ### 
6390 %% syntaxe : r n newpolreg --> solid
6391 /newpolreg {
6392 5 dict begin
6393    /n exch def
6394    /r exch def
6395    /S [
6396        0 360 n div 360 360 n div sub {
6397            /theta exch def
6398            theta cos r mul
6399            theta sin r mul
6400            0
6401        } for
6402    ] def
6403    /F [
6404        [0 1 n 1 sub {} for]
6405    ] def
6406
6407    S F generesolid
6408    dup videsolid
6409 end
6410 } def
6411
6412 %%%%% ### newgrille ### 
6413 %% syntaxe : xmin xmax ymin ymax [dx dy] newgrille -> solid
6414 %% syntaxe : xmin xmax ymin ymax [nx ny] newgrille -> solid
6415 %% syntaxe : xmin xmax ymin ymax {mode} newgrille -> solid
6416 %% syntaxe : xmin xmax ymin ymax newgrille -> solid
6417 /newgrille {
6418 10 dict begin
6419    [[/nx /ny] [1 1] [1. 1.] [1. 1.] [1. 1.] [.5 .5]] gestionsolidmode
6420    %% ny nb d etages en y
6421    %% nx nb d etages en x
6422    /biface false def
6423    [nx ny] {0} newsurfaceparametree
6424 end
6425 } def
6426
6427 %% %% syntaxe : xmin xmax ymin ymax [dx dy] {f} newsurface -> solid
6428 %% %% f : R^2 -> R
6429 /newsurface {
6430    true newsurfaceparametree
6431 } def
6432
6433 /biface true def
6434
6435 /newsurfaceparametree {
6436 10 dict begin
6437    dup isbool {
6438       pop /surfz true def
6439    } {
6440       /surfz false def
6441    } ifelse
6442    /f_surface exch def
6443    [[/nx /ny] [2 2] [4 4] [1. 1.] [1. 1.] [.25 .25]] gestionsolidmode
6444    %% ny nb d etages en y
6445    %% nx nb d etages en x
6446    /ymax exch def
6447    /ymin exch def
6448    /xmax exch def
6449    /xmin exch def
6450
6451    nx isinteger not {
6452        %% alors nx est un dx
6453        /nx xmax xmin sub nx div cvi store
6454    } if
6455    ny isinteger not {
6456        %% alors ny est un dy
6457        /ny ymax ymin sub ny div cvi store
6458    } if
6459    /dy ymax ymin sub ny div def %% le pas sur y
6460    /dx xmax xmin sub nx div def %% le pas sur x
6461
6462    /S [
6463        0 1 nx {
6464            /i exch def
6465            0 1 ny {
6466                /j exch def
6467                /u xmin i dx mul add def
6468                /v ymin j dy mul add def
6469                u v
6470                surfz {2 copy} if
6471                f_surface
6472                pstrickactionR3
6473            } for
6474        } for
6475    ] def
6476
6477    /F [
6478        0 1 nx 1 sub {
6479           /i exch def
6480           0 1 ny 1 sub {
6481              /j exch def
6482              [
6483                 j 1 add        i ny 1 add mul add
6484                 j              i ny 1 add mul add
6485                 j ny 1 add add i ny 1 add mul add
6486                 j ny 2 add add i ny 1 add mul add
6487              ]
6488           } for
6489        } for
6490 %%       0 1 0 {%nx 1 sub {
6491 %%          /i exch def
6492 %%          0 1 0 {%ny 2 sub {
6493 %%             /j exch def
6494 %%             [
6495 %%             j 1 add        %% i ny mul add
6496 %%             j              %% i ny mul add
6497 %%             ny 1 add j add       %% i ny mul add
6498 %%             ny 2 add j add     %% i ny mul add
6499 %%             ]
6500 %%          } for
6501 %%       } for
6502    ] def
6503    S F generesolid
6504    biface {dup videsolid} if
6505 end
6506 } def
6507
6508 %%%%% ### newgrillecirculaire ### 
6509 %% syntaxe : r option newgrillecirculaire -> solid
6510 /newgrillecirculaire {
6511 6 dict begin
6512    [[/K /N] [6 6] [6 8] [10 8] [16 12] [16 36]] gestionsolidmode
6513
6514    %% N = nb de meridiens (diviseur de 360 = 2^4 * 3^2 * 5)
6515    %% K = nb d horizontales (diviseur de 160 = 2^5 * 5)
6516
6517    /r exch def
6518    /F [
6519        %% 1er etage
6520        1 1 N {
6521            /i exch def
6522            [0 i i N mod 1 add]
6523        } for
6524        %% etages suivants
6525        0 1 K 2 sub {
6526            /j exch def
6527            1 1 N {
6528                /i exch def
6529                [i      j N mul add
6530                i N add j N mul add
6531                i N mod N add 1 add j N mul add
6532                i N mod 1 add j N mul add]
6533            } for
6534       } for
6535    ] def
6536
6537    %% tableau des sommets
6538    /S [
6539        0 0 0
6540        1 1 K {
6541            /j exch def
6542            1 1 N {
6543              /i exch def
6544              /theta i 360 mul N div def
6545              theta cos r j mul K div mul
6546              theta sin r j mul K div mul
6547              2 copy exch atan 90 div
6548           } for
6549        } for
6550    ] def
6551
6552    S F generesolid
6553 end
6554 } def
6555
6556 %%%%% ### newruban ### 
6557 %% syntaxe : array h u [n] newruban -> solid d axe (O, u), de maillage vertical n
6558 %% syntaxe : array h u newruban -> solid d axe (O, u),
6559 %% syntaxe : array h newruban -> solid d axe (O, k),
6560 %% ou array tableau de points 2d
6561 /newruban {
6562 7 dict begin
6563    %% N = nb d etages
6564    [[/N] [1] [1] [1] [3] [4]] gestionsolidmode
6565    2 copy pop isarray {
6566       /u {0 0 1} def
6567    } {
6568       /u defpoint3d
6569    } ifelse
6570    u 0 eq {
6571       (Error : 3eme composante nulle dans le vecteur pour newruban) ==
6572       quit
6573    } if
6574    pop pop
6575    /h exch def
6576    /table exch def
6577    %% n = indice du dernier point
6578    /n table length 2 idiv 1 sub def
6579    %% vecteur de translation
6580    u
6581    h u norme3d div
6582    mulv3d /v defpoint3d
6583
6584    %% tableau des sommets
6585    /S [
6586       0 1 N {
6587          /j exch def
6588          0 1 n {
6589              /i exch def
6590              table i getp
6591              0
6592              v N j sub N div mulv addv3d
6593          } for
6594       } for
6595    ] def
6596
6597    /F [
6598       %% faces etage
6599       1 1 N {
6600          /j exch def
6601          1 1 n {
6602              /i exch def
6603              [i                   j 1 sub n 1 add mul add
6604               i 1 sub             j 1 sub n 1 add mul add
6605               n 1 add i add 1 sub j 1 sub n 1 add mul add
6606               n 1 add i add       j 1 sub n 1 add mul add]
6607          } for
6608      } for
6609    ] def
6610
6611    S F generesolid
6612    dup videsolid
6613 end
6614 } def
6615
6616 %%%%% ### newicosaedre ### 
6617 /newicosaedre {
6618 3 dict begin
6619    /a exch def
6620    /S [
6621       0.8944271  0              0.4472137
6622       0.2763932  0.8506507      0.4472137
6623       -0.7236067 0.5257311      0.4472137
6624       -0.7236067 -0.5257311     0.4472137
6625       0.2763932  -0.8506507     0.4472137
6626       0          0              1
6627       0          0              -1
6628       -0.8944271 0              -0.4472137
6629       -0.2763932 -0.8506507     -0.4472137
6630       0.7236067  -0.5257311     -0.4472137
6631       0.7236067  0.5257311      -0.4472137
6632       -0.2763932 0.8506507      -0.4472137
6633    ] {a mulv3d} papply3d def
6634
6635    /F [
6636       [0 1 5]   %% 1  2 6  ]
6637       [1 2 5]   %% 2  3 6  ]
6638       [2 3 5]   %% 3  4 6  ]
6639       [3 4 5]   %% 4  5 6  ]
6640       [4 0 5]   %% 5  1 6  ]
6641       [9 0 4]   %% 10 1 5  ]
6642       [0 9 10]  %% 1  10 11]
6643       [10 1 0]  %% 11 2 1  ]
6644       [1 10 11] %% 2  11 12]
6645       [11 2 1]  %% 12 3 2  ]
6646       [2 11 7]  %% 3  12 8 ]
6647       [2 7 3]   %% 3  8 4  ]
6648       [3 7 8]   %% 4  8 9  ]
6649       [3 8 4]   %% 4  9 5  ]
6650       [4 8 9]   %% 5  9 10 ]
6651       [6 7 11]  %% 7  8 12 ]
6652       [6 8 7]   %% 7  9 8  ]
6653       [6 9 8]   %% 7  10 9 ]
6654       [6 10 9]  %% 7  11 10]
6655       [6 11 10] %% 7  12 11]
6656    ] def
6657
6658    S F generesolid
6659 end
6660 } def
6661
6662 %%%%% ### newdodecaedre ### 
6663 /newdodecaedre {
6664 3 dict begin
6665    /a exch def
6666    /S [
6667       0          0.607062   0.7946545
6668       -0.5773503 0.1875925  0.7946545
6669       -0.3568221 -0.4911235 0.7946545
6670       0.3568221  -0.4911235 0.7946545
6671       0.5773503  0.1875925  0.7946545
6672       0          0.982247   0.1875925
6673       -0.9341724 0.303531   0.1875925
6674       -0.5773503 -0.7946645 0.1875925
6675       0.5773503  -0.7946645 0.1875925
6676       0.9341724  0.303531   0.1875925
6677       0          -0.982247  -0.1875925
6678       0.9341724  -0.303531  -0.1875925
6679       0.5773503  0.7946545  -0.1875925
6680       -0.5773503 0.7946545  -0.1875925
6681       -0.9341724 -0.303531  -0.1875925
6682       -0.5773503 -0.1875925 -0.7946545
6683       -0.3568221 0.4911235  -0.7946545
6684       0.3568221  0.4911235  -0.7946545
6685       0.5773503  -0.1875925 -0.7946545
6686       0          -0.607062  -0.7946545
6687    ] {a mulv3d} papply3d def
6688
6689    /F [
6690       [0 1 2 3 4]
6691       [4 3 8 11 9]
6692       [4 9 12 5 0]
6693       [0 5 13 6 1]
6694       [1 6 14 7 2]
6695       [2 7 10 8 3]
6696       [10 19 18 11 8]
6697       [11 18 17 12 9]
6698       [12 17 16 13 5]
6699       [13 16 15 14 6]
6700       [14 15 19 10 7]
6701       [15 16 17 18 19]
6702    ] def
6703    S F generesolid
6704 end
6705 } def
6706
6707 %%%%% ### newoctaedre ### 
6708 /newoctaedre {
6709 3 dict begin
6710    /a exch def
6711    %%Sommets
6712    /S [
6713       0  0  1
6714       1  0  0
6715       0  1  0
6716       -1 0  0
6717       0  -1 0
6718       0  0  -1
6719    ] {a mulv3d} papply3d def
6720
6721    /F [
6722       [0 4 1]
6723       [1 2 0]
6724       [0 2 3]
6725       [3 4 0]
6726       [1 5 2]
6727       [2 5 3]
6728       [3 5 4]
6729       [4 5 1]
6730    ] def
6731
6732    S F generesolid
6733 end
6734 } def
6735
6736 %%%%% ### newtetraedre ### 
6737 /newtetraedre {
6738 3 dict begin
6739    /r exch def
6740    %%Tetraedre
6741    /S [
6742       0          0          1
6743       -0.4714045 -0.8164965 -1 3 div
6744       0.942809   0          -1 3 div
6745       -0.4714045 0.8164965  -1 3 div
6746    ] {r mulv3d} papply3d def
6747
6748    /F [
6749       [0 1 2]
6750       [0 2 3]
6751       [0 3 1]
6752       [1 3 2]
6753    ] def
6754
6755    S F generesolid
6756 end
6757 } def
6758
6759 %%%%% ### newcube ### 
6760 /newcube {
6761 3 dict begin
6762    [[/n] [1] [1] [1] [3] [4]] gestionsolidmode
6763    /a exch 2 div def
6764
6765    n 1 le {
6766       /F [
6767      [0 1 2 3]
6768      [0 4 5 1]
6769      [1 5 6 2]
6770      [2 6 7 3]
6771      [0 3 7 4]
6772      [4 7 6 5]
6773       ] def
6774
6775       %% tableau des sommets
6776       /S [
6777       1  1  1 %% 0
6778      -1  1  1 %% 1
6779      -1 -1  1 %% 2
6780       1 -1  1 %% 3
6781       1  1 -1 %% 4
6782      -1  1 -1 %% 5
6783      -1 -1 -1 %% 6
6784       1 -1 -1 %% 7
6785       ] {a mulv3d} papply3d def
6786       S F generesolid
6787    } {
6788       /dl 2 n div def
6789       /N n dup mul n add 4 mul def
6790       /n1 n 1 sub dup mul def %% nb sommets centre d une face
6791
6792       %% tableau des sommets
6793       /S1 [
6794      0 1 n 1 sub {
6795         /j exch def
6796         0 1 n {
6797            /i exch def
6798            -1 i dl mul add
6799            -1 j dl mul add
6800         1
6801         } for
6802      } for
6803       ] def
6804
6805       /S2 S1 {-90 0 0 rotateOpoint3d} papply3d def
6806       /S3 S2 {-90 0 0 rotateOpoint3d} papply3d def
6807       /S4 S3 {-90 0 0 rotateOpoint3d} papply3d def
6808
6809       /S5 [
6810      1 1 n 1 sub {
6811         /j exch def
6812         1 1 n 1 sub {
6813            /i exch def
6814         1
6815            -1 i dl mul add
6816            -1 j dl mul add
6817         } for
6818      } for
6819       ] def
6820
6821       /S6 [
6822      1 1 n 1 sub {
6823         /j exch def
6824         1 1 n 1 sub {
6825            /i exch def
6826            -1
6827            -1 i dl mul add
6828            -1 j dl mul add
6829         } for
6830      } for
6831       ] def
6832
6833       %% tableau des faces
6834       /F1 [
6835      0 1 n 1 sub {
6836         /j exch def
6837         0 1 n 1 sub {
6838            /i exch def
6839            [
6840           i n 1 add j mul add
6841           dup 1 add
6842           dup n 1 add add
6843           dup 1 sub
6844            ]
6845         } for
6846      } for
6847       ] def
6848
6849       %% syntaxe : i sommettourgauche --> l indice du i-eme sommet du tour
6850       %% de la face gauche (en commencant par l indice 0). ATTENTION :
6851       %% utilise la variable globale n = nb d etages
6852       /sommettourgauche {
6853       1 dict begin
6854      /i exch def
6855      i 4 n mul ge {
6856         i
6857         (Error: indice trop grand dans sommettourgauche) ==
6858         exit
6859      } if
6860      n n 1 add i mul add
6861       end
6862       } def
6863
6864       %% syntaxe : i sommetcentregauche --> l indice du i-eme sommet du centre
6865       %% de la face gauche (en commencant par l indice 0). ATTENTION :
6866       %% utilise les variables globales n = nb d etages, et N = nb sommets
6867       %% des 4 1eres faces
6868       /sommetcentregauche {
6869       1 dict begin
6870      /i exch def
6871      i n 1 sub dup mul ge {
6872         i
6873         (Error: indice trop grand dans sommetcentregauche) ==
6874         exit
6875      } if
6876      N i add
6877       end
6878       } def
6879
6880       /F5 [
6881      %%%%% la face gauche %%%%%
6882      %% le coin superieur gauche
6883      [
6884         1 sommettourgauche
6885         0 sommettourgauche
6886         n 4 mul 1 sub sommettourgauche
6887         n1 n 1 sub sub sommetcentregauche
6888      ]
6889
6890      %% la bande superieure (i from 1 to n-2)
6891      1 1 n 2 sub {
6892         /i exch def
6893         [
6894            i 1 add sommettourgauche
6895            i sommettourgauche
6896            n1 n sub i add sommetcentregauche
6897            n1 n sub i 1 add add sommetcentregauche
6898         ]
6899      } for
6900
6901      %% le coin superieur droit
6902      [
6903         n sommettourgauche
6904         n 1 sub sommettourgauche
6905         n1 1 sub sommetcentregauche
6906         n 1 add sommettourgauche
6907      ]
6908
6909      %% la descente gauche
6910      %% j from 1 to n-2
6911      1 1 n 2 sub {
6912         /j exch def
6913         [
6914            n1 n 1 sub j mul sub sommetcentregauche
6915            n 4 mul j sub sommettourgauche
6916            n 4 mul j 1 add sub sommettourgauche
6917            n1 n 1 sub j 1 add mul sub sommetcentregauche
6918         ]
6919      } for
6920
6921      %% les bandes centrales (j from 1 to n-2 et i from 1 to n-2)
6922      1 1 n 2 sub {
6923         /j exch def
6924         1 1 n 2 sub {
6925            /i exch def
6926            [
6927           n1 i n 1 sub j 1 sub mul add sub sommetcentregauche
6928           n1 i 1 add n 1 sub j 1 sub mul add sub sommetcentregauche
6929           n1 i 1 add n 1 sub j mul add sub sommetcentregauche
6930           n1 i n 1 sub j mul add sub sommetcentregauche
6931            ]
6932         } for
6933      } for
6934
6935      %% la descente droite
6936      1 1 n 2 sub {
6937         /j exch def
6938         [
6939            n j add sommettourgauche
6940            n1 1 sub j 1 sub n 1 sub mul sub sommetcentregauche
6941            n1 1 sub j n 1 sub mul sub sommetcentregauche
6942            n j 1 add add sommettourgauche
6943         ]
6944      } for
6945
6946      %% le coin inferieur gauche
6947      [
6948         0 sommetcentregauche
6949         n 3 mul 1 add sommettourgauche
6950         n 3 mul sommettourgauche
6951         n 3 mul 1 sub sommettourgauche
6952      ]
6953
6954      %% la bande inferieure (i from 1 to n-2)
6955      1 1 n 2 sub {
6956         /i exch def
6957         [
6958            i sommetcentregauche
6959            i 1 sub sommetcentregauche
6960            n 3 mul i sub sommettourgauche
6961            n 3 mul i sub 1 sub sommettourgauche
6962         ]
6963      } for
6964
6965      %% le coin inferieur droit
6966      [
6967         n 2 mul 1 sub sommettourgauche
6968         n 2 sub sommetcentregauche
6969         n 2 mul 1 add sommettourgauche
6970         n 2 mul sommettourgauche
6971      ]
6972       ] def
6973
6974       %% syntaxe : i sommettourdroit --> l indice du i-eme sommet du tour
6975       %% de la face droit (en commencant par l indice 0). ATTENTION :
6976       %% utilise la variable globale n = nb d etages
6977       /sommettourdroit {
6978       1 dict begin
6979      /i exch def
6980      i 4 n mul ge {
6981         i
6982         (Error: indice trop grand dans sommettourdroit) ==
6983         exit
6984      } if
6985      n 1 add i mul
6986       end
6987       } def
6988
6989       %% syntaxe : i sommetcentredroit --> l indice du i-eme sommet du centre
6990       %% de la face droit (en commencant par l indice 0). ATTENTION :
6991       %% utilise les variables globales n = nb d etages, et N = nb sommets
6992       %% des 4 1eres faces
6993       /sommetcentredroit {
6994       1 dict begin
6995      /i exch def
6996      i n 1 sub dup mul ge {
6997         i
6998         (Error: indice trop grand dans sommetcentredroit) ==
6999         exit
7000      } if
7001      N n1 add i add
7002       end
7003       } def
7004
7005       /F6 [
7006      %% coin superieur droit
7007      [
7008         0 sommettourdroit
7009         1 sommettourdroit
7010         n1 n 1 sub sub sommetcentredroit
7011         4 n mul 1 sub sommettourdroit
7012      ]
7013      %% coin superieur gauche
7014      [
7015         n 1 sub sommettourdroit
7016         n sommettourdroit
7017         n 1 add sommettourdroit
7018         n1 1 sub sommetcentredroit
7019      ]
7020      %% coin inferieur gauche
7021      [
7022         n 2 sub sommetcentredroit
7023         2 n mul 1 sub sommettourdroit
7024         2 n mul sommettourdroit
7025         2 n mul 1 add sommettourdroit
7026      ]
7027      %% coin inferieur droit
7028      [
7029         3 n mul 1 add sommettourdroit
7030         0 sommetcentredroit
7031         3 n mul 1 sub sommettourdroit
7032         3 n mul sommettourdroit
7033      ]
7034      %% bande superieure
7035      1 1 n 2 sub {
7036         /i exch def
7037         [
7038            i sommettourdroit
7039            i 1 add sommettourdroit
7040            n 1 sub n 2 sub mul i add sommetcentredroit
7041            n 1 sub n 2 sub mul i 1 sub add sommetcentredroit
7042         ]
7043      } for
7044      %% bande inferieure
7045      1 1 n 2 sub {
7046         /i exch def
7047         [
7048            i 1 sub sommetcentredroit
7049            i sommetcentredroit
7050            3 n mul 1 sub i sub sommettourdroit
7051            3 n mul i sub sommettourdroit
7052         ]
7053      } for
7054      %% descente gauche
7055      1 1 n 2 sub {
7056         /i exch def
7057         [
7058            n1 1 sub i 1 sub n 1 sub mul sub sommetcentredroit
7059            n i add sommettourdroit
7060            n i 1 add add sommettourdroit
7061            n1 1 sub i n 1 sub mul sub sommetcentredroit
7062         ]
7063      } for
7064      %% descente droite
7065      1 1 n 2 sub {
7066         /i exch def
7067         [
7068            4 n mul i sub sommettourdroit
7069            n 1 sub n 1 sub i sub mul sommetcentredroit
7070            n 1 sub n 2 sub i sub mul sommetcentredroit
7071            4 n mul i sub 1 sub sommettourdroit
7072         ]
7073      } for
7074      %% bandes interieures
7075      1 1 n 2 sub {
7076         /j exch def
7077         1 1 n 2 sub {
7078            /i exch def
7079            [
7080           n 1 sub j mul i 1 sub add sommetcentredroit
7081           n 1 sub j mul i add sommetcentredroit
7082           n 1 sub j 1 sub mul i add sommetcentredroit
7083           n 1 sub j 1 sub mul i 1 sub add sommetcentredroit
7084            ]
7085         } for
7086      } for
7087
7088       ] def
7089
7090       /F2 F1 {{n dup mul n add add} apply} apply def
7091       /F3 F2 {{n dup mul n add add} apply} apply def
7092       /F4 F3 {{n dup mul n add add} apply} apply def
7093
7094
7095       S1 S2 append S3 append S4 append S5 append S6 append {a mulv3d} papply3d
7096       F1 F2 append F3 append F4 append {{N mod} apply} apply F5 append F6 append
7097       generesolid
7098    } ifelse
7099 end
7100 } def
7101
7102 %%%%% ### newparallelepiped ### 
7103 % 14 octobre 2006
7104 /newparallelepiped {
7105 2 dict begin
7106    /c exch 2 div def
7107    /b exch 2 div def
7108    /a exch 2 div def
7109    /F [
7110       [0 1 2 3]
7111       [0 4 5 1]
7112       [1 5 6 2]
7113       [2 6 7 3]
7114       [0 3 7 4]
7115       [4 7 6 5]
7116     ] def
7117
7118     %% tableau des sommets
7119     /S [
7120        a     b     c %% 0
7121        a neg b     c %% 1
7122        a neg b neg c %% 2
7123        a     b neg c %% 3
7124        a     b     c neg %% 4
7125        a neg b     c neg %% 5
7126        a neg b neg c neg %% 6
7127        a     b neg c neg %% 7
7128     ] def
7129     S F generesolid
7130 } def
7131
7132 %%%%% ### newcylindre ### 
7133 %% syntaxe : z0 r0 z1 newcylindre -> solide
7134 /newcylindre {
7135    dup xcheck {
7136       2 index exch
7137    } {
7138       dup isarray {
7139          2 index exch
7140       } {
7141          1 index
7142       } ifelse
7143    } ifelse
7144    newtronccone
7145 } def
7146
7147 %% syntaxe : z0 r0 z1 newcylindrecreux -> solide
7148 /newcylindrecreux {
7149    newcylindre
7150    dup creusesolid
7151 } def
7152
7153 %%%%% ### newtronccone ### 
7154 %% syntaxe : z0 r0 z1 r1 newtronccone -> solid
7155 /newtronccone {
7156 11 dict begin
7157    [[/n /N] [1 6] [1 8] [1 10] [3 12] [5 18]] gestionsolidmode
7158
7159    /r1 exch def
7160    /z1 exch def
7161    /r0 exch def
7162    /z0 exch def
7163    /dz z1 z0 sub n div def
7164    /dr r1 r0 sub n div def
7165
7166    /FE [
7167       [0 1 N 1 sub {} for]
7168       [n 1 add N mul 1 sub -1 n N mul {} for]
7169
7170       0 1 n 1 sub {
7171       /k exch def
7172          k N mul 1 add 1 k 1 add N mul 1 sub {
7173              /i exch def
7174              [i i 1 sub N i add 1 sub N i add]
7175          } for
7176          [k N mul k 1 add N mul 1 sub k 2 add N mul 1 sub k 1 add N mul]
7177       } for
7178
7179    ] def
7180
7181    %% tableau des sommets
7182    /S [
7183       n -1 0 {
7184          /k exch def
7185          0 1 N 1 sub {
7186              /i exch def
7187              360 N idiv i mul cos r0 dr k mul add mul
7188              360 N idiv i mul sin r0 dr k mul add mul
7189              z0 dz k mul add
7190          } for
7191       } for
7192    ] def
7193    S FE generesolid
7194 end
7195 } def
7196
7197 %% syntaxe : z0 r0 z1 r1 newtroncconecreux -> solid
7198 /newtroncconecreux {
7199    newtronccone
7200    dup creusesolid
7201 } def
7202
7203 %%%%% ### newcone ### 
7204 %% syntaxe : z0 r0 z1 newcone -> solid
7205 /newcone {
7206 11 dict begin
7207    [ [/n /N] [1 6] [1 8] [1 10] [3 12] [5 18] ] gestionsolidmode
7208
7209    /z1 exch def
7210    /r0 exch def
7211    /z0 exch def
7212    /dz z1 z0 sub n div def
7213    /dr r0 n div def
7214
7215    /F [
7216       %% la base
7217       [N 1 sub -1 0 {} for]
7218       %% le dernier etage
7219       n 1 sub N mul 1 add 1 n N mul 1 sub {
7220            /i exch def
7221            [i 1 sub i n N mul]
7222       } for
7223       [n N mul 1 sub n 1 sub N mul n N mul]
7224       %% les autres etages
7225       0 1 n 2 sub {
7226          /j exch def
7227          0 N j mul add 1 N N j mul add 2 sub {
7228             /i exch def
7229             [i i 1 add dup N add dup 1 sub]
7230          } for
7231          [N N j mul add 1 sub N j mul dup N add dup N add 1 sub]
7232       } for
7233    ] def
7234
7235    %% tableau des sommets
7236    /S [
7237       %% etage no j (in [1; n])
7238       0 1 n 1 sub {
7239          /j exch def
7240          0 1 N 1 sub {
7241              /i exch def
7242              360 N idiv i mul cos r0 dr j mul sub mul
7243              360 N idiv i mul sin r0 dr j mul sub mul
7244              z0 dz j mul add
7245          } for
7246       } for
7247       0 0 z1
7248    ] def
7249    S F generesolid
7250 end
7251 } def
7252
7253 %% syntaxe : z0 r0 z1 newconecreux -> solid
7254 /newconecreux {
7255    newcone
7256    dup 0 solidrmface
7257    dup videsolid
7258 } def
7259
7260 %%%%% ### newtore ### 
7261 %% syntaxe : r R newtore -> solid
7262 /newtore {
7263 10 dict begin
7264    [[/n1 /n2] [4 5] [6 10] [8 12] [9 18] [18 36]] gestionsolidmode
7265    /n2 n2 3 max store
7266    /n1 n1 2 max store
7267    /R exch def
7268    /r exch def
7269    /S [
7270          0 1 n1 1 sub {
7271             /i exch def
7272             360 n1 div i mul cos r mul R add
7273             360 n1 div i mul sin r mul
7274          } for
7275       ]
7276    def
7277    S [n2] newanneau
7278 end
7279 } def
7280
7281 %%%%% ### newprisme ### 
7282 /newprismedroit {
7283    [[/N] [1] [1] [1] [3] [6]] gestionsolidmode
7284    0 0 1 [N] newprisme
7285 } def
7286
7287 %% syntaxe : array N z0 z1 u newprisme -> solid d axe (O, u),
7288 %% ou array tableau de points 2d
7289 /newprisme {
7290 7 dict begin
7291    [[/N] [1] [1] [1] [3] [6]] gestionsolidmode
7292    dup 0 eq {
7293       (Error : 3eme composante nulle dans le vecteur pour newprisme) ==
7294       quit
7295    } if
7296    /u defpoint3d
7297    /z1 exch def
7298    /z0 exch def
7299    %% N = nb d etages
7300    /table exch def
7301    %% n = indice du dernier point
7302    /n table length 2 idiv 1 sub def
7303    %% vecteur de translation
7304    u
7305    z1 z0 sub u norme3d div
7306    mulv3d /v defpoint3d
7307
7308    %% tableau des sommets
7309    /S [
7310       0 1 N {
7311          /j exch def
7312          0 1 n {
7313              /i exch def
7314              table i getp
7315              z0
7316              v N j sub N div mulv addv3d
7317          } for
7318       } for
7319    ] def
7320
7321    /F [ 
7322       %% face superieure
7323       [0 1 n {} for]
7324       %% base
7325       [N 1 add n 1 add mul 1 sub -1 N n 1 add mul {} for]
7326       %% faces etage
7327       1 1 N {
7328          /j exch def
7329          1 1 n {
7330              /i exch def
7331              [i                   j 1 sub n 1 add mul add
7332               i 1 sub             j 1 sub n 1 add mul add
7333               n 1 add i add 1 sub j 1 sub n 1 add mul add
7334               n 1 add i add       j 1 sub n 1 add mul add]
7335          } for
7336          [0            j 1 sub n 1 add mul add
7337          n             j 1 sub n 1 add mul add
7338          2 n mul 1 add j 1 sub n 1 add mul add
7339          n 1 add       j 1 sub n 1 add mul add]
7340      } for
7341    ] def
7342
7343    S F generesolid
7344 end
7345 } def
7346
7347 %%%%% ### newsphere ### 
7348 %% syntaxe : r option newsphere -> solid
7349 /newsphere {
7350 2 dict begin
7351    [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
7352    -90 90 [K N] newcalottesphere
7353 end
7354 } def
7355
7356 %% syntaxe : r phi theta option newcalottesphere -> solid
7357 /newcalottesphere {
7358 6 dict begin
7359    [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
7360
7361    %% test de beta (ex-theta)
7362    dup 90 eq {
7363       /beta exch def
7364       /idebut 1 def
7365    } {
7366       /beta exch 80 min -80 max def
7367       /idebut 0 def
7368    } ifelse
7369    %% test de alpha (ex-phi)
7370    dup -90 eq {
7371       /alpha exch def
7372    } {
7373       /alpha exch beta min -80 max def
7374    } ifelse
7375    /r exch def
7376    beta 90 eq {
7377        alpha -90 eq {
7378            /ifin K def
7379           /db alpha beta sub K 1 add div def
7380        } {
7381            /ifin K def
7382           /db alpha beta sub K div def
7383        } ifelse
7384    } {
7385        alpha -90 eq {
7386            /ifin K 1 sub def
7387           /db alpha beta sub K div def
7388        } {
7389            /ifin K 1 sub def
7390           /db alpha beta sub K 1 sub div def
7391        } ifelse
7392    } ifelse
7393
7394    %% nombre de sommets -2
7395    /nb N K mul def
7396
7397    %% tableau des sommets
7398    /S [
7399        idebut 1 ifin {
7400            /j exch def
7401            /phi beta j db mul add def
7402            phi cos r mul /r_tmp exch def
7403            0 1 N 1 sub {
7404                 /i exch def
7405                 360 N idiv i mul cos r_tmp mul
7406                 360 N idiv i mul sin r_tmp mul
7407                 phi sin r mul
7408             } for
7409        } for
7410       0 0 r neg
7411       0 0 r
7412    ] def
7413
7414    /F [
7415      %% calotte inferieure
7416      alpha -90 eq {
7417          1 1 N 1 sub {
7418          /i exch def
7419             [
7420                 nb
7421                 nb i sub
7422                 nb i 1 add sub
7423             ]
7424          } for
7425          [nb nb N sub nb 1 sub]
7426      } {
7427         [nb 1 sub -1 nb N sub {} for ]
7428      } ifelse
7429
7430      %% calotte superieure
7431      beta 90 eq {
7432          0 1 N 1 sub {
7433             /i exch def
7434              [i i 1 add N mod N K mul 1 add]
7435          } for
7436       } {
7437          [0 1 N 1 sub {} for]
7438       } ifelse
7439
7440      1 1 K 1 sub {
7441           /j exch def
7442        [
7443            j N mul
7444            j N mul 1 add
7445            j 1 sub N mul 1 add
7446            j 1 sub N mul
7447        ]
7448        N 2 sub {dup {1 add} apply} repeat
7449        [
7450            j 1 add N mul 1 sub
7451            j N mul
7452            j 1 sub N mul
7453            j N mul 1 sub
7454        ]
7455     } for
7456    ] def
7457
7458    S F generesolid
7459 end
7460 } def
7461
7462 %% syntaxe : r phi theta option newcalottespherecreuse -> solid
7463 /newcalottespherecreuse {
7464 6 dict begin
7465    [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
7466
7467    %% test de beta (ex-theta)
7468    dup 90 eq {
7469       /beta exch def
7470       /idebut 1 def
7471    } {
7472       /beta exch 80 min -80 max def
7473       /idebut 0 def
7474    } ifelse
7475    %% test de alpha (ex-phi)
7476    dup -90 eq {
7477       /alpha exch def
7478    } {
7479       /alpha exch beta min -80 max def
7480    } ifelse
7481    /r exch def
7482    beta 90 eq {
7483        alpha -90 eq {
7484            /ifin K def
7485           /db alpha beta sub K 1 add div def
7486        } {
7487            /ifin K def
7488           /db alpha beta sub K div def
7489        } ifelse
7490    } {
7491        alpha -90 eq {
7492            /ifin K 1 sub def
7493           /db alpha beta sub K div def
7494        } {
7495            /ifin K 1 sub def
7496           /db alpha beta sub K 1 sub div def
7497        } ifelse
7498    } ifelse
7499
7500    %% nombre de sommets -2
7501    /nb N K mul def
7502
7503    %% tableau des sommets
7504    /S [
7505        idebut 1 ifin {
7506            /j exch def
7507            /phi beta j db mul add def
7508            phi cos r mul /r_tmp exch def
7509            0 1 N 1 sub {
7510                 /i exch def
7511                 360 N idiv i mul cos r_tmp mul
7512                 360 N idiv i mul sin r_tmp mul
7513                 phi sin r mul
7514             } for
7515        } for
7516       0 0 r neg
7517       0 0 r
7518    ] def
7519
7520    /F [
7521      %% calotte inferieure
7522      alpha -90 eq {
7523          1 1 N 1 sub {
7524          /i exch def
7525             [
7526                 nb
7527                 nb i sub
7528                 nb i 1 add sub
7529             ]
7530          } for
7531          [nb nb N sub nb 1 sub]
7532      } {
7533 %        [nb 1 sub -1 nb N sub {} for ]
7534      } ifelse
7535
7536      %% calotte superieure
7537      beta 90 eq {
7538          0 1 N 1 sub {
7539             /i exch def
7540              [i i 1 add N mod N K mul 1 add]
7541          } for
7542       } {
7543 %         [0 1 N 1 sub {} for]
7544       } ifelse
7545
7546      1 1 K 1 sub {
7547           /j exch def
7548        [
7549            j N mul
7550            j N mul 1 add
7551            j 1 sub N mul 1 add
7552            j 1 sub N mul
7553        ]
7554        N 2 sub {dup {1 add} apply} repeat
7555        [
7556            j 1 add N mul 1 sub
7557            j N mul
7558            j 1 sub N mul
7559            j N mul 1 sub
7560        ]
7561     } for
7562    ] def
7563
7564    S F generesolid
7565    dup videsolid
7566 end
7567 } def
7568
7569 %%%%% ### newanneau ### 
7570 %% syntaxe : array n newanneau --> solid
7571 %% syntaxe : array {mode} newanneau --> solid
7572 %% ou array est un tableau de points de R^2 et n un nombre entier positif
7573 /newanneau {
7574 10 dict begin
7575    dup isnum {
7576       /n exch def
7577       [n]
7578    } if
7579    [[/n2] [6] [12] [24] [32] [36]] gestionsolidmode
7580    /n2 n2 3 max store
7581    %% on plonge la section dans R^3 par projection sur yOz
7582    /S1 exch {0 3 1 roll} papply def
7583    %% nombre de sommets
7584    /n1 S1 length 3 idiv def
7585
7586    /S S1
7587       n2 {
7588          duparray
7589          {0 0 360 n2 div rotateOpoint3d} papply3d
7590       } repeat
7591       n2 {append} repeat
7592    def
7593
7594    /F [
7595       0 1 n2 1 sub {
7596          /j exch def
7597          n1 j mul 1 j 1 add n1 mul 2 sub {
7598             /i exch def
7599             [i 1 add i dup n1 add i n1 1 add add]
7600          } for
7601          [n1 j mul j 1 add n1 mul 1 sub j 2 add n1 mul 1 sub j 1 add n1 mul]
7602       } for
7603    ] def
7604
7605    S F generesolid
7606 end
7607 } def
7608
7609 %%%%% ### newvecteur ### 
7610 %% syntaxe : x y z newvecteur
7611 /newvecteur {
7612 4 dict begin
7613    /A defpoint3d
7614    %%Sommets
7615    /S [0 0 0 A] def
7616    /F [
7617       [0 1]
7618    ] def
7619    S F generesolid
7620 %%   /axe exch def
7621    [ A ]
7622    normalvect_to_orthobase
7623    /imK defpoint3d
7624    /imJ defpoint3d
7625    /imI defpoint3d
7626
7627    A norme3d /z exch .3 sub def 
7628    0 .1 .3 [1 8] newcone
7629    dup (noir) outputcolors
7630    {0 0 z translatepoint3d} solidtransform
7631    {imI imJ imK transformpoint3d} solidtransform
7632    solidfuz
7633 end
7634 } def
7635
7636 %%%%% ### readsolidfile ###
7637 %% syntaxe : str readsolidfile -> solid
7638 /readsolidfile {
7639 1 dict begin
7640    /str exch def
7641    [str (-sommets.dat) append run] 
7642    [str (-faces.dat) append run]
7643    generesolid
7644    dup [str (-couleurs.dat) append run] solidputfcolors
7645    dup [str (-io.dat) append run] solidputinouttable
7646 end
7647 } def
7648
7649 %%%%% ### writesolidfile ###
7650 %% syntaxe : solid str writesolidfile -> -
7651 /writesolidfile {
7652 10 dict begin
7653    /str exch def
7654    /solid exch def
7655    solid issolid not {
7656       (Error : mauvais type d argument dans writesolidfile) ==
7657       quit
7658    } if
7659    str (-sommets.dat) append (w) file /lefichiersommets exch def
7660    str (-faces.dat) append (w) file /lefichierfaces exch def
7661    str (-couleurs.dat) append (w) file /lefichiercouleurs exch def
7662    str (-io.dat) append (w) file /lefichierio exch def
7663
7664    /S solid solidgetsommets def
7665    0 1 S length 3 idiv 1 sub {
7666       /i exch def
7667       solid i solidgetsommet
7668       /z exch def
7669       /y exch def
7670       /x exch def
7671       lefichiersommets x chaine cvs writestring
7672       lefichiersommets 32 write %% espace
7673       lefichiersommets y chaine cvs writestring
7674       lefichiersommets 32 write %% espace
7675       lefichiersommets z chaine cvs writestring
7676       lefichiersommets 10 write %% CR
7677    } for
7678    lefichiersommets closefile
7679
7680    /F solid solidgetfaces def
7681    0 1 F length 1 sub {
7682       /i exch def
7683       /Fi solid i solidgetface def
7684       lefichierfaces 91 write %% [
7685       0 1 Fi length 1 sub {
7686          /j exch def
7687          lefichierfaces Fi j get chaine cvs writestring
7688          lefichierfaces 32 write %% espace
7689       } for
7690       lefichierfaces 93 write %% ]
7691       lefichierfaces 10 write %% CR
7692    } for
7693    lefichierfaces closefile
7694
7695    /C solid solidgetfcolors def
7696    0 1 C length 1 sub {
7697       /i exch def
7698       lefichiercouleurs 40 write %% (
7699       lefichiercouleurs C i get writestring
7700       lefichiercouleurs 41 write %% )
7701       lefichiercouleurs 10 write %% CR
7702    } for
7703    lefichiercouleurs closefile
7704
7705    /IO solid solidgetinouttable def
7706    0 1 3 {
7707       /i exch def
7708       lefichierio IO i get chaine cvs writestring
7709       lefichierio 32 write %% space
7710    } for
7711    lefichierio closefile
7712 end
7713 } def
7714
7715 %%%%% ### writeobjfile ###
7716 %% syntaxe : solid str writeobjfile -> -
7717 /writeobjfile {
7718 10 dict begin
7719    /str exch (.obj) append def
7720    /solid exch def
7721    solid issolid not {
7722       (Erreur : mauvais type d argument dans writeobjfile) ==
7723       quit
7724    } if
7725    /n solid solidnombresommets def
7726    str (w) file /lefichier exch def
7727    0 1 n 1 sub {
7728       /i exch def
7729       solid i solidgetsommet
7730       /z exch def
7731       /y exch def
7732       /x exch def
7733       lefichier (v ) writestring
7734       lefichier x chaine cvs writestring
7735       lefichier 32 write %% espace
7736       lefichier y chaine cvs writestring
7737       lefichier 32 write %% espace
7738       lefichier z chaine cvs writestring
7739       lefichier 10 write %% CR
7740    } for
7741    /n solid solidnombrefaces def
7742    0 1 n 1 sub {
7743       /i exch def
7744       lefichier (f ) writestring
7745       /F solid i solidgetface def
7746       F {
7747          lefichier exch
7748          chaine cvs writestring
7749          lefichier  32  write %% espace
7750       } apply
7751       lefichier  10  write %% CR
7752    } for
7753    lefichier closefile
7754 end
7755 } def
7756
7757 %%%%% ### newobjfile ###
7758 /newobjfile {
7759 3 dict begin
7760    /objfilename exch (.obj) append def
7761    /v {} def
7762    /ok true def
7763    /f {
7764        ok {
7765         %% 1ere fois
7766            ] %% ferme les sommets
7767         [ [ %% ouvre les faces
7768         /ok false store
7769        } {
7770         %% les autres fois
7771            ] %% ferme la face
7772         [ %% ouvre la nouvelle
7773        } ifelse
7774    } def
7775    [ %0 0 0
7776    objfilename run
7777    ]]
7778    /F exch def
7779    /S exch def
7780
7781    S F generesolid
7782 %   dup videsolid
7783 end
7784 } def
7785
7786 %%%%% ### newtube ###
7787  /tub@dernierk1 [1 0 0] def
7788  /tub@dernierk2 [0 1 0] def
7789  /tub@dernierk3 [0 0 1] def
7790
7791 /inittube {
7792 2 dict begin
7793    normalize3d /vect3 defpoint3d
7794    normalize3d /vect2 defpoint3d
7795    normalize3d /vect1 defpoint3d
7796    vect1 norme3d 0 eq {
7797       vect2 vect3 vectprod3d /vect1 defpoint3d
7798    } if
7799    vect2 norme3d 0 eq {
7800       vect3 vect1 vectprod3d /vect2 defpoint3d
7801    } if
7802    vect3 norme3d 0 eq {
7803       vect1 vect2 vectprod3d /vect3 defpoint3d
7804    } if
7805    /tub@dernierk1 [vect1] store
7806    /tub@dernierk2 [vect2] store
7807    /tub@dernierk3 [vect3] store
7808 end
7809 } def
7810  
7811 %% syntaxe : tmin tmax (f) array r newtube -> solid
7812 %% array = [K N]
7813 /newtube {
7814 10 dict begin
7815    /table exch def
7816    /K table 0 get def %% nb d etages
7817    /N table 1 get def         %% nb de points sur le perimetre
7818    /@r exch def       %% le rayon du tube
7819    /str exch def
7820    /lafonction str cvx def
7821    /laderivee str (') append cvx def
7822    /laderivee2nd str ('') append cvx def
7823    /tmax exch def
7824    /tmin exch def
7825    /pas tmax tmin sub K 1 sub div def
7826
7827    %% definition des sommets
7828    [
7829    tmin pas tmax {
7830       /a0 exch def
7831    
7832       %% definition du repere de Frenet (k1, k2, k3) au point f(a)
7833       a0 lafonction pstrickactionR3 /M defpoint3d
7834       a0 laderivee normalize3d pstrickactionR3 /k1 defpoint3d
7835       a0 laderivee2nd normalize3d pstrickactionR3 /k2 defpoint3d
7836       k1 norme3d 0 eq {
7837          tub@dernierk1 aload pop pstrickactionR3 /k1 defpoint3d
7838       } {
7839          /tub@dernierk1 [k1] store
7840       } ifelse
7841       k2 norme3d 0 eq {
7842          tub@dernierk2 aload pop pstrickactionR3 /k2 defpoint3d
7843       } {
7844          /tub@dernierk2 [k2] store
7845       } ifelse
7846       k1 k2 vectprod3d normalize3d pstrickactionR3 /k3 defpoint3d
7847       k3 norme3d 0 eq {
7848           tub@dernierk3 aload pop pstrickactionR3 /k3 defpoint3d
7849       } {
7850          /tub@dernierk3 [k3] store
7851       } ifelse
7852       k3 k1 vectprod3d normalize3d pstrickactionR3 /k2 defpoint3d
7853       /tub@dernierk2 [k2] store
7854       /@n 360 N div def %% le pas angulaire
7855       0 @n 360 @n sub {
7856          /@i exch def
7857          M
7858          k2 @i cos @r mul mulv3d addv3d
7859          k3 @i sin @r mul mulv3d addv3d
7860       } for
7861    } for
7862    ]
7863
7864    dup length 3 idiv /nb exch def
7865    %% definition des faces
7866    [
7867       %% face de depart
7868       [N 1 sub -1 0 {} for]
7869       %% face d arrivee
7870       [nb 1 sub N 1 sub {dup 1 sub} repeat] reverse
7871    
7872       %% les etages
7873       /j 0 def
7874       tmin pas tmax pas sub {
7875          pop 
7876          0 1 N 1 sub {
7877             /i exch def
7878             [
7879                i                   N j mul add
7880                i 1 add N mod       N j mul add
7881                i 1 add N mod N add N j mul add
7882                i N add             N j mul add
7883             ]
7884          } for
7885          /j j 1 add store
7886       } for
7887    ]
7888    generesolid
7889 end
7890 } def
7891
7892 %%%%% ### fin insertion ###
7893
7894 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7895 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7896 %%%%                                                    %%%%
7897 %%%%      fin insertion librairie jps                   %%%%
7898 %%%%                                                    %%%%
7899 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7900 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7901
7902 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7903 %%%%          gestion de chaine de caracteres           %%%%
7904 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7905
7906 /Times-Roman findfont 
7907 dup length dict begin
7908    {
7909    1 index /FID ne 
7910       {def}
7911       {pop pop} 
7912    ifelse
7913    } forall
7914    /Encoding ISOLatin1Encoding def
7915    currentdict
7916 end
7917 /Times-Roman-ISOLatin1 exch definefont pop
7918
7919 /setTimesRoman {
7920    /Times-Roman-ISOLatin1 findfont 
7921    fontsize scalefont 
7922    setfont
7923 } def
7924
7925 /setTimes {
7926    setTimesRoman
7927 } def
7928
7929 %% syntaxe : string x y cctext
7930 /cctext {
7931 5 dict begin
7932    /y exch def
7933    /x exch def
7934    /str exch def
7935    str stringwidth
7936    /wy exch def
7937    /wx exch def
7938    gsave
7939       x y smoveto
7940       wx -2 div wy -2 div rmoveto
7941       str show
7942    grestore
7943 end
7944 } def
7945
7946 %% syntaxe : str x y show_dim --> str x y llx lly wx wy 
7947 %% attention, doit laisser la pile intacte
7948 /show_dim {
7949    3 copy pop pop
7950    newpath
7951       0 0 moveto
7952       true charpath flattenpath pathbbox 
7953    closepath
7954    newpath
7955 } def
7956
7957 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7958 %%%%             procedures pour PSTricks               %%%%
7959 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7960
7961 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7962 %%%%             procedures pour \psSolid               %%%%
7963 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7964
7965 /all (all) def
7966
7967 /draw {drawsolid} def
7968 /draw* {drawsolid*} def
7969 /draw** {drawsolid**} def
7970 /writeobj {solidfilename writeobjfile} def
7971 /writesolid {solidfilename writesolidfile} def
7972 /none {pop} def
7973
7974 /gere_pstricks_color_inout {
7975    gsave
7976       dup  [fillincolor] (setrgbcolor) astr2str
7977          [fillcolor] (setrgbcolor) astr2str inoutputcolors
7978    grestore
7979 } def
7980
7981 /gere_pstricks_color_out {
7982    gsave
7983       dup  [fillcolor] (setrgbcolor) astr2str outputcolors
7984    grestore
7985 } def
7986
7987 /gere_pstricks_opt {
7988 %   /CourbeR2 {CourbeR2+} def
7989    linecolor
7990    solidlinewidth setlinewidth
7991    RotX 0 ne RotY 0 ne or RotZ 0 ne or {
7992       {RotX RotY RotZ rotateOpoint3d} solidtransform
7993    } if
7994    CX 0 ne CY 0 ne or CZ 0 ne or {
7995       {CX CY CZ translatepoint3d} solidtransform
7996    } if
7997    /rmfaces rmfaces bubblesort reverse store
7998    0 1 rmfaces length 1 sub {
7999       /i exch def
8000       dup rmfaces i get solidrmface
8001    } for
8002    solidhollow {
8003       dup videsolid
8004    } if
8005    activationgestioncouleurs {
8006       dup solidwithinfaces {
8007          gere_pstricks_color_inout 
8008       } {
8009          gere_pstricks_color_out 
8010       } ifelse
8011    } if
8012
8013    0 1 fcol length 2 idiv 1 sub {
8014       /i exch def 
8015       dup fcol 2 i mul get fcol 2 i mul 1 add get solidputfcolor
8016    } for
8017    tx@Dict /pst-transformoption known {
8018       dup {pst-transformoption} solidtransform 
8019    } if
8020    solidinouthue length 0 gt { 
8021       dup solidinouthue solidputinouthuecolors 
8022    } {
8023       solidhue length 0 gt {
8024          dup solidhue solidputhuecolors
8025       } if
8026       solidinhue length 0 gt {
8027          dup solidinhue solidputinhuecolors
8028       } if
8029    } ifelse
8030    dup action
8031    noir
8032    solidnumf length 0 ne {
8033       solidnumf 0 get isstring {
8034          dup projectionsifacevisible solidnumfaces
8035       } {
8036          dup solidnumf projectionsifacevisible solidnumfaces
8037       } ifelse
8038    } if
8039    solidshow length 0 ne {
8040       solidshow 0 get isstring {
8041          dup solidshowsommets
8042       } {
8043          dup solidshow solidshowsommets
8044       } ifelse
8045    } if
8046    solidnum length 0 ne {
8047       solidnum 0 get isstring {
8048          dup solidnumsommets
8049       } {
8050          dup solidnum solidnumsommets
8051       } ifelse
8052    } {
8053       %% pop
8054    } ifelse
8055    tx@Dict /solidname known {
8056       solidname exch bind def
8057       tx@Dict /solidname undef
8058    } {
8059       pop
8060    } ifelse
8061 } def
8062
8063 /pst-octahedron {
8064    a newoctaedre
8065    gere_pstricks_opt
8066 } def
8067
8068 /pst-dodecahedron {
8069    a newdodecaedre
8070    gere_pstricks_opt
8071 } def
8072
8073 /pst-icosahedron {
8074    a newicosaedre
8075    gere_pstricks_opt
8076 } def
8077
8078 /pst-cube {
8079    a
8080    ngrid length 1 eq {
8081       ngrid
8082    } {
8083       {Mode}
8084    } ifelse
8085    newcube 
8086 %%    solidhollow {
8087 %%       dup videsolid
8088 %%    } if
8089    gere_pstricks_opt
8090 } def
8091
8092 /pst-parallelepiped {
8093    a b c
8094    newparallelepiped
8095    gere_pstricks_opt
8096 } def
8097
8098 /pst-tetrahedron {
8099    r newtetraedre
8100    gere_pstricks_opt
8101 } def
8102
8103 /pst-tore {
8104    r0 r1
8105    ngrid length 2 eq {
8106       ngrid
8107    } {
8108       {Mode}
8109    } ifelse
8110    newtore
8111    gere_pstricks_opt
8112 } def
8113
8114 /pst-sphere {
8115    % rayon
8116    % mode
8117   %   r {Mode} newsphere
8118    r
8119    ngrid length 2 eq {
8120       ngrid
8121    } {
8122       {Mode}
8123    } ifelse
8124    newsphere
8125    gere_pstricks_opt
8126 } def
8127
8128 /pst-cylindre {
8129    % rayon
8130    % mode
8131    0 r h
8132    ngrid length 2 eq {
8133       ngrid
8134    } {
8135       {Mode}
8136    } ifelse
8137    newcylindre
8138    solidhollow {
8139       dup creusesolid
8140    } if
8141    gere_pstricks_opt
8142 } def
8143
8144 /pst-cylindrecreux {
8145    % rayon
8146    % mode
8147    0 r h
8148    ngrid length 2 eq {
8149       ngrid
8150    } {
8151       {Mode}
8152    } ifelse
8153    newcylindre
8154    dup creusesolid
8155    gere_pstricks_opt
8156 } def
8157
8158 /pst-cone {
8159    % rayon
8160    % mode
8161    0 r h
8162    ngrid length 2 eq {
8163       ngrid
8164    } {
8165       {Mode}
8166    } ifelse
8167    solidhollow {
8168       newconecreux
8169    } {
8170       newcone
8171    } ifelse
8172    gere_pstricks_opt
8173 } def
8174
8175 /pst-tronccone {
8176    % rayon
8177    % mode
8178    0 r0 h r1
8179    ngrid length 2 eq {
8180       ngrid
8181    } {
8182       {Mode}
8183    } ifelse
8184    solidhollow {
8185       newtroncconecreux
8186    } {
8187       newtronccone
8188    } ifelse
8189    gere_pstricks_opt
8190 } def
8191
8192 /pst-troncconecreux {
8193    % rayon
8194    % mode
8195    0 r0 h r1
8196    ngrid length 2 eq {
8197       ngrid
8198    } {
8199       {Mode}
8200    } ifelse
8201    newtroncconecreux
8202    gere_pstricks_opt
8203 } def
8204
8205 /pst-conecreux {
8206    % rayon
8207    % mode
8208    0 r h
8209    ngrid length 2 eq {
8210       ngrid
8211    } {
8212       {Mode}
8213    } ifelse
8214    newconecreux
8215    gere_pstricks_opt
8216 } def
8217
8218 /pst-anneau {
8219    [ section ]
8220    ngrid length 1 ge {
8221       [ngrid 0 get]
8222    } {
8223       [24]
8224    } ifelse
8225    newanneau
8226    gere_pstricks_opt
8227 } def
8228
8229
8230 /pst-prisme {
8231    % tableau des points de la base
8232    % h hauteur du prisme
8233    % axe : vecteur direction de l axe
8234    base decal rollparray
8235    0 h axe
8236    ngrid length 1 ge {
8237       [ngrid 0 get]
8238    } if
8239    newprisme
8240    solidhollow {
8241       dup creusesolid
8242    } if
8243    gere_pstricks_opt
8244 } def
8245
8246 /pst-prismecreux {
8247    % tableau des points de la base
8248    % h hauteur du prisme
8249    % axe : vecteur direction de l axe
8250    base
8251    0 h axe
8252    ngrid length 1 ge {
8253       [ngrid 0 get]
8254    } if
8255    newprisme
8256    dup creusesolid
8257    gere_pstricks_opt
8258 } def
8259
8260 /pst-grille {
8261    base aload pop
8262    ngrid length 2 ge {
8263       [ngrid 0 get ngrid 1 get]
8264    } {
8265       ngrid length 1 eq {
8266          [ngrid 0 get dup]
8267       } if
8268    } ifelse
8269    newgrille
8270    gere_pstricks_opt
8271 } def
8272
8273 %% syntaxe : array N h u newruban -> solid d axe (O, u),
8274 /pst-ruban {
8275    % tableau des points de la base
8276    % h hauteur du prisme
8277    % axe : vecteur direction de l axe
8278    base
8279    h axe 
8280    ngrid length 1 ge {
8281       [ngrid 0 get]
8282    } if
8283    newruban
8284    gere_pstricks_opt
8285 } def
8286
8287 %% syntaxe : r phi option newcalottesphere -> solid
8288 /pst-calottesphere {
8289    % rayon
8290    % mode
8291    % r phi theta option newcalottesphere
8292    r
8293    phi theta
8294    ngrid length 2 eq {
8295       ngrid
8296    } {
8297       {Mode}
8298    } ifelse
8299    solidhollow {
8300       newcalottespherecreuse
8301    } {
8302       newcalottesphere
8303    } ifelse
8304    gere_pstricks_opt
8305 } def
8306
8307 %% syntaxe : r phi option newcalottesphere -> solid
8308 /pst-calottespherecreuse {
8309    % rayon
8310    % mode
8311    % r phi theta option newcalottespherecreuse
8312    r
8313    phi theta
8314    ngrid length 2 eq {
8315       ngrid
8316    } {
8317       {Mode}
8318    } ifelse
8319    newcalottespherecreuse
8320    gere_pstricks_opt
8321 } def
8322
8323 /pointtest{2 2 2} def
8324
8325 /pst-face {
8326    % tableau des points de la base
8327    % h hauteur du prisme
8328    % axe : vecteur direction de l axe
8329    base
8330    solidbiface {
8331       newbiface
8332    } {
8333       newmonoface 
8334    } ifelse
8335    gere_pstricks_opt
8336 } def
8337
8338 /pst-surface {
8339    base
8340    base aload pop
8341    ngrid length 2 ge {
8342       [ngrid 0 get ngrid 1 get]
8343    } {
8344       ngrid length 1 eq {
8345          [ngrid 0 get dup]
8346       } ifelse
8347    } ifelse
8348    {f} newsurface
8349    solidbiface {
8350       dup videsolid
8351    } if
8352    gere_pstricks_opt
8353 } def
8354
8355 /pst-polygoneregulier {
8356    r ngrid 0 get
8357    newpolreg
8358    solidbiface {
8359    } {
8360       dup 1 solidrmface
8361    } ifelse
8362    gere_pstricks_opt
8363 } def
8364
8365 /pst-fusion {
8366 1 dict begin
8367    /activationgestioncouleurs false def
8368    /n base length def
8369    base aload pop n 1 sub {solidfuz} repeat
8370    gere_pstricks_opt
8371 end
8372 } def
8373
8374 /pst-new {
8375    sommets faces
8376    generesolid
8377 %%    solidhollow {
8378 %%       dup videsolid
8379 %%    } if
8380    gere_pstricks_opt
8381 } def
8382
8383 /pst-courbe {
8384    solidlinewidth setlinewidth
8385    r 0 eq {
8386       range aload pop {function cvx exec} CourbeR3
8387    } {
8388       range aload pop function r ngrid newtube
8389       gere_pstricks_opt %% r function [36 12] newtube
8390    } ifelse
8391 } def
8392
8393 /pst-surfaceparametree {
8394    base aload pop
8395    ngrid length 2 ge {
8396       [ngrid 0 get ngrid 1 get]
8397    } {
8398       ngrid length 1 eq {
8399          [ngrid 0 get dup]
8400       } if
8401    } ifelse
8402    { function cvx exec } newsurfaceparametree
8403    dup videsolid
8404    gere_pstricks_opt
8405 } def
8406
8407 /pst-vecteur {
8408 gsave
8409    solidlinewidth setlinewidth
8410    1 setlinejoin
8411    1 setlinecap
8412    linecolor
8413    linestyle
8414    args newvecteur
8415    dup
8416       [linecolor currentrgbcolor] ( ) astr2str (setrgbcolor) append 
8417       outputcolors
8418    gere_pstricks_opt
8419 grestore
8420 } def
8421
8422 /pst-ligne {
8423    newpath
8424       base 0 get
8425       base 1 get
8426       base 2 get
8427       3dto2d smoveto
8428       base ligne3d_
8429 } def
8430
8431 /pst-objfile {
8432    solidfilename newobjfile
8433 %   dup {1 1 div mulv3d} solidtransform
8434 %%    solidhollow {
8435 %%       dup videsolid
8436 %%    } if
8437    gere_pstricks_opt
8438 } def
8439
8440 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8441 %%%%         procedures pour \psProjection              %%%%
8442 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8443
8444 /gere_pstricks_proj_opt {
8445       /solidprojname where {
8446          /solidprojname get noface phi 
8447          xorigine 0 eq
8448          yorigine 0 eq and
8449          zorigine 0 eq and 
8450          xorigine isinteger not and
8451          yorigine isinteger not and
8452          yorigine isinteger not and {
8453          } {
8454             [xorigine yorigine zorigine] (                 ) astr2str 
8455          } ifelse
8456          projectionsifacevisible solidprojpath
8457       } {
8458          xorigine yorigine zorigine [ normale ] projectionsifacevisible planprojpath
8459       } ifelse
8460 } def
8461
8462 /proj-pst-chemin {
8463    solidlinewidth setlinewidth
8464    newpath
8465       path
8466       linecolor
8467       gere_pstricks_proj_opt
8468 } def
8469
8470 /proj-pst-courbeR2 {
8471    solidlinewidth setlinewidth
8472    newpath
8473       linecolor
8474       range aload pop { function cvx exec } CourbeR2_
8475       gere_pstricks_proj_opt
8476 } def
8477
8478 /proj-pst-courbe {
8479    solidlinewidth setlinewidth
8480    newpath
8481       linecolor
8482       range aload pop {} { function cvx exec } Courbeparam_
8483       gere_pstricks_proj_opt
8484 } def
8485
8486 /proj-pst-texte {
8487 2 dict begin
8488       setTimes 
8489       solidlinewidth setlinewidth
8490       newpath
8491       linecolor
8492       texte 0 0 
8493       pos (text_) append cvx exec
8494       gere_pstricks_proj_opt
8495 fill
8496 end
8497 } def
8498
8499 /pst-trigospherique {
8500 3 dict begin
8501 gsave
8502    solidlinewidth setlinewidth
8503    linecolor
8504    linestyle
8505    args definition
8506 grestore
8507 end
8508 } def
8509
8510 % END solides.pro
8511
8512 %%EndProcSet
8513 %%BeginProcSet: special.pro 0 0
8514 %!
8515 TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
8516 /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
8517 /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
8518 /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
8519 /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
8520 X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
8521 /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
8522 /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
8523 {userdict/md get type/dicttype eq{userdict begin md length 10 add md
8524 maxlength ge{/md md dup length 20 add dict copy def}if end md begin
8525 /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
8526 atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
8527 itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
8528 transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
8529 curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
8530 pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
8531 if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
8532 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
8533 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
8534 yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
8535 neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
8536 noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
8537 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
8538 neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
8539 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
8540 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
8541 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
8542 TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
8543 Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
8544 }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
8545 save N userdict maxlength dict begin/magscale true def normalscale
8546 currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
8547 /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
8548 psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
8549 psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
8550 TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def
8551 @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
8552 newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto
8553 closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N
8554 /@beginspecial{SDict begin/SpecialSave save N gsave normalscale
8555 currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}
8556 N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs
8557 neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate
8558 rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse
8559 scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg
8560 lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx
8561 ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N
8562 /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{
8563 pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
8564 restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B
8565 /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1
8566 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY
8567 moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix
8568 matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc
8569 savematrix setmatrix}N end
8570
8571 %%EndProcSet
8572 %%BeginProcSet: color.pro 0 0
8573 %!
8574 TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop
8575 setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll
8576 }repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def
8577 /TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{
8578 setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{
8579 /currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch
8580 known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC
8581 /Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC
8582 /Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0
8583 setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0
8584 setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61
8585 0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC
8586 /Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0
8587 setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87
8588 0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{
8589 0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{
8590 0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC
8591 /Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0
8592 setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0
8593 setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90
8594 0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC
8595 /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0
8596 setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0
8597 0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{
8598 0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{
8599 0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC
8600 /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0
8601 setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC
8602 /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0
8603 0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1
8604 0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11
8605 0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0
8606 setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0
8607 0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC
8608 /Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0
8609 setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0
8610 0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0
8611 1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC
8612 /PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0
8613 setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{
8614 0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor}
8615 DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70
8616 setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0
8617 setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1
8618 setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end
8619
8620 %%EndProcSet
8621 TeXDict begin 39158280 55380996 1000 600 600 (test_08.dvi)
8622 @start
8623 %DVIPSBitmapFont: Fa ecrm1000 10 2
8624 /Fa 2 51 df<0001C0000003C0000007C000001FC00000FFC000FFFFC000FFFFC000FF1F
8625 C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F
8626 C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F
8627 C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F
8628 C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F
8629 C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000003FE0007FFF
8630 FFF07FFFFFF07FFFFFF01C3779B62A>49 D<000FF00000007FFE000001FFFF800003E03F
8631 E0000F000FF0001E0007F8001C0003FC00380001FE00700001FE00700000FF00600000FF
8632 00FE0000FF00FF00007F80FF80007F80FF80007F80FF80007F80FF80007F80FF80007F80
8633 7F00007F801C00007F800000007F80000000FF00000000FF00000000FE00000001FE0000
8634 0001FC00000003FC00000003F800000007F00000000FE00000000FC00000001F80000000
8635 3F000000007E00000000FC00000001F800000001E000000003C000000007800000000F00
8636 0000001E000180003C000180007800018000F000038001E000030003C000030007800003
8637 0007000007000FFFFFFF001FFFFFFF003FFFFFFF007FFFFFFE00FFFFFFFE00FFFFFFFE00
8638 FFFFFFFE0021377CB62A>I E
8639 %EndDVIPSBitmapFont
8640 %DVIPSBitmapFont: Fb ecbx1440 14.4 23
8641 /Fb 23 234 df<000000007FFC0000000000001FFFFF800000000001FFFFFFE000000000
8642 07FFFFFFF8000000003FFFC00FFC00000000FFFC0001FE00000001FFF000007F00000007
8643 FFC00003FF0000000FFF800007FF8000001FFF00000FFF8000003FFF00000FFF8000003F
8644 FE00000FFF8000007FFC00000FFF8000007FFC00001FFFC00000FFFC00000FFF800000FF
8645 F800000FFF800000FFF800000FFF800000FFF8000007FF000000FFF8000003FE000000FF
8646 F8000000F8000000FFF800000000000000FFF800000000000000FFF800000000000000FF
8647 F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF
8648 F800000000000000FFF800000000000000FFF800000000000000FFF80007FFFFC000FFFF
8649 FFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFF
8650 FFFFFFFFFFC00000FFF800000FFFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8651 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8652 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8653 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8654 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8655 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8656 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8657 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8658 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8659 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8660 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000FFFF
8661 FFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFF
8662 FFF807FFFFFFC042547DD349>28 D<0000001E00000000003E0000000000FE0000000003
8663 FE000000000FFE000000007FFE00000007FFFE000003FFFFFE0000FFFFFFFE0000FFFFFF
8664 FE0000FFFFFFFE0000FFF87FFE0000FC007FFE000000007FFE000000007FFE000000007F
8665 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8666 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8667 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8668 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8669 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8670 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8671 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8672 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8673 FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F
8674 FE000000007FFE000000007FFE000000007FFE00007FFFFFFFFFFC7FFFFFFFFFFC7FFFFF
8675 FFFFFC7FFFFFFFFFFC7FFFFFFFFFFC2E4E76CD42>49 D<00001FFE0000000001FFFFF000
8676 00000FFFFFFC0000003FFFFFFF8000007FFFFFFFE00001FF803FFFF00003FC0007FFFC00
8677 07F00001FFFE000FE00000FFFF001F8000007FFF803F0000003FFF803F0000001FFFC07F
8678 E000001FFFE07FF800000FFFE07FFC00000FFFF0FFFC000007FFF0FFFE000007FFF0FFFE
8679 000003FFF8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF87FFC00
8680 0003FFF87FFC000003FFF83FF8000003FFF81FF0000003FFF80380000003FFF800000000
8681 03FFF00000000007FFF00000000007FFF00000000007FFE0000000000FFFE0000000000F
8682 FFC0000000001FFFC0000000001FFF80000000003FFF00000000003FFE00000000007FFC
8683 0000000000FFF80000000000FFF00000000001FFE00000000003FFC00000000007FF8000
8684 00000007FF00000000000FFC00000000001FF800000000003FF000000000007FC0000000
8685 0000FF800000000001FF000000000003FC000000000007F800000000000FF00000F80000
8686 1FE00000F800003FC00000F800007F000000F80000FE000001F00001FC000001F00003F8
8687 000001F00007F0000001F00007E0000001F0000F80000003F0001F00000003F0003E0000
8688 0007F0007FFFFFFFFFF000FFFFFFFFFFE001FFFFFFFFFFE003FFFFFFFFFFE007FFFFFFFF
8689 FFE00FFFFFFFFFFFE01FFFFFFFFFFFE03FFFFFFFFFFFE07FFFFFFFFFFFE0FFFFFFFFFFFF
8690 E0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0354E7ACD42>I<
8691 FFFFFFFFFFFFFC000000FFFFFFFFFFFFFFE00000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFF
8692 FFFF8000FFFFFFFFFFFFFFFFE000000FFFE000003FFFF000000FFFE0000003FFFC00000F
8693 FFE0000000FFFE00000FFFE00000007FFF00000FFFE00000003FFF80000FFFE00000001F
8694 FFC0000FFFE00000000FFFE0000FFFE000000007FFE0000FFFE000000007FFF0000FFFE0
8695 00000007FFF0000FFFE000000007FFF8000FFFE000000003FFF8000FFFE000000003FFF8
8696 000FFFE000000003FFFC000FFFE000000003FFFC000FFFE000000003FFFC000FFFE00000
8697 0003FFFC000FFFE000000003FFFC000FFFE000000003FFFC000FFFE000000003FFFC000F
8698 FFE000000003FFFC000FFFE000000003FFFC000FFFE000000003FFF8000FFFE000000003
8699 FFF8000FFFE000000003FFF8000FFFE000000007FFF8000FFFE000000007FFF0000FFFE0
8700 00000007FFF0000FFFE000000007FFE0000FFFE00000000FFFC0000FFFE00000001FFFC0
8701 000FFFE00000003FFF80000FFFE00000007FFF00000FFFE0000000FFFE00000FFFE00000
8702 07FFF800000FFFE000003FFFF000000FFFFFFFFFFFFFC000000FFFFFFFFFFFFF0000000F
8703 FFFFFFFFFFF80000000FFFFFFFFFFF800000000FFFE0000000000000000FFFE000000000
8704 0000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0
8705 000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000
8706 000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE00000
8707 00000000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000F
8708 FFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE000000000
8709 0000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0
8710 000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000
8711 000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE00000
8712 00000000000FFFE0000000000000FFFFFFFFFE0000000000FFFFFFFFFE0000000000FFFF
8713 FFFFFE0000000000FFFFFFFFFE0000000000FFFFFFFFFE00000000004E527CD15A>80
8714 D<00000FFE00001C000000FFFFF0003C000007FFFFFC007C00001FFFFFFF00FC00007FFF
8715 FFFFC1FC0000FFF001FFE1FC0001FF80001FFBFC0003FF000007FFFC0007FC000001FFFC
8716 000FF8000000FFFC001FF00000003FFC001FF00000001FFC003FE00000000FFC003FE000
8717 00000FFC007FE000000007FC007FC000000003FC007FC000000003FC007FC000000001FC
8718 00FFC000000001FC00FFC000000001FC00FFC000000000FC00FFE000000000FC00FFE000
8719 000000FC00FFF0000000007C00FFF0000000007C00FFF8000000007C00FFFC000000007C
8720 00FFFE0000000000007FFF0000000000007FFFC000000000007FFFF800000000007FFFFF
8721 80000000003FFFFFF8000000003FFFFFFFC00000001FFFFFFFFC0000000FFFFFFFFF8000
8722 000FFFFFFFFFF0000007FFFFFFFFFC000003FFFFFFFFFE000001FFFFFFFFFF800000FFFF
8723 FFFFFFC000007FFFFFFFFFE000001FFFFFFFFFF0000007FFFFFFFFF8000001FFFFFFFFF8
8724 0000007FFFFFFFFC00000007FFFFFFFE000000007FFFFFFE0000000003FFFFFF00000000
8725 003FFFFF000000000003FFFF800000000000FFFF8000000000003FFF8000000000001FFF
8726 8000000000000FFFC0000000000007FFC0000000000003FFC0F80000000003FFC0F80000
8727 000001FFC0F80000000001FFC0F80000000001FFC0F80000000000FFC0FC0000000000FF
8728 C0FC0000000000FFC0FC0000000000FFC0FC0000000000FF80FE0000000000FF80FE0000
8729 000000FF80FF0000000001FF80FF0000000001FF00FF8000000001FF00FFC000000003FE
8730 00FFE000000003FE00FFF000000007FC00FFFC0000000FF800FFFE0000001FF800FFFFC0
8731 00003FF000FF7FF80000FFE000FE1FFF8007FFC000FE07FFFFFFFF0000FC01FFFFFFFC00
8732 00F8007FFFFFF00000F0000FFFFFC00000E000007FFC0000003A5479D249>83
8733 D<3FFFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFFFFFFF
8734 FFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFC0007FFF0003FFFC3FFC00007FFF00003FFC7F
8735 F000007FFF00000FFE7FE000007FFF000007FE7FC000007FFF000003FE7F8000007FFF00
8736 0001FE7F0000007FFF000000FE7F0000007FFF000000FE7E0000007FFF0000007E7E0000
8737 007FFF0000007E7E0000007FFF0000007E7C0000007FFF0000003E7C0000007FFF000000
8738 3E7C0000007FFF0000003E7C0000007FFF0000003E7C0000007FFF0000003EFC0000007F
8739 FF0000003FF80000007FFF0000001FF80000007FFF0000001FF80000007FFF0000001FF8
8740 0000007FFF0000001FF80000007FFF0000001FF80000007FFF0000001F000000007FFF00
8741 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000
8742 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000
8743 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F
8744 FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000
8745 0000007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF00
8746 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000
8747 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000
8748 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F
8749 FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000
8750 0000007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF00
8751 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000
8752 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000
8753 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F
8754 FF000000000001FFFFFFFFFFFFC0000001FFFFFFFFFFFFC0000001FFFFFFFFFFFFC00000
8755 01FFFFFFFFFFFFC0000001FFFFFFFFFFFFC00050517BD05B>I<00003FFE000000000007
8756 FFFFE0000000001FFFFFFC000000007FFFFFFF00000001FFC00FFFC0000003FE0003FFE0
8757 000007FF0000FFF0000007FF80007FF800000FFFC0007FFC00000FFFC0003FFE00000FFF
8758 C0003FFE00000FFFC0001FFF00000FFFC0001FFF00000FFFC0001FFF00000FFFC0000FFF
8759 800007FF80000FFF800003FF00000FFF800001FE00000FFF8000000000000FFF80000000
8760 00000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF
8761 800000000007FFFF8000000003FFFFFF800000007FFFFFFF80000003FFFFFFFF8000001F
8762 FFF00FFF8000007FFF000FFF800000FFFC000FFF800003FFF0000FFF800007FFC0000FFF
8763 80000FFF80000FFF80001FFF00000FFF80003FFF00000FFF80003FFE00000FFF80007FFC
8764 00000FFF80007FFC00000FFF81F0FFFC00000FFF81F0FFF800000FFF81F0FFF800000FFF
8765 81F0FFF800000FFF81F0FFF800001FFF81F0FFF800001FFF81F0FFFC00003FFF81F07FFC
8766 00003FFF81F07FFE00007FFF81F03FFE0000F7FFC3F03FFF0001E3FFC3E01FFFC007E3FF
8767 FFE007FFF01F81FFFFC003FFFFFF00FFFF8000FFFFFC007FFF00001FFFF0003FFC000001
8768 FF800007F0003C387CB642>97 D<000003FFE0000000003FFFFE00000000FFFFFF800000
8769 03FFFFFFE000000FFF003FF800003FFC0007FC00007FF8000FFE0000FFF0001FFE0001FF
8770 E0003FFF0003FFC0003FFF0007FF80003FFF0007FF80003FFF000FFF00003FFF001FFF00
8771 003FFF001FFE00003FFF003FFE00001FFE003FFE00000FFC003FFE000007F8007FFE0000
8772 0000007FFC00000000007FFC00000000007FFC0000000000FFFC0000000000FFFC000000
8773 0000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00000000
8774 00FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000
8775 FFFC00000000007FFC00000000007FFE00000000007FFE00000000007FFE00000000003F
8776 FE00000000003FFF00000000001FFF0000000F801FFF0000000F800FFF8000001F800FFF
8777 8000001F0007FFC000003F0003FFE000003E0001FFF000007E0000FFF80000FC00007FFC
8778 0001F800003FFF0007F000000FFFC01FE0000007FFFFFF80000001FFFFFE000000003FFF
8779 F80000000003FF80000031387CB63A>99 D<000000000003FF8000000000000FFFFF8000
8780 000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000
8781 00000000003FFF800000000000000FFF800000000000000FFF800000000000000FFF8000
8782 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000
8783 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000
8784 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000
8785 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000
8786 00000000000FFF800000000000000FFF800000000000000FFF8000000003FF800FFF8000
8787 00003FFFF80FFF80000001FFFFFE0FFF80000007FFFFFF8FFF8000001FFFC03FEFFF8000
8788 003FFE0007FFFF8000007FF80001FFFF800000FFF00000FFFF800001FFE000007FFF8000
8789 03FFC000003FFF800007FF8000001FFF80000FFF8000000FFF80000FFF0000000FFF8000
8790 1FFF0000000FFF80001FFE0000000FFF80003FFE0000000FFF80003FFE0000000FFF8000
8791 7FFE0000000FFF80007FFC0000000FFF80007FFC0000000FFF80007FFC0000000FFF8000
8792 FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000
8793 FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000
8794 FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000
8795 FFFC0000000FFF80007FFC0000000FFF80007FFC0000000FFF80007FFC0000000FFF8000
8796 7FFE0000000FFF80003FFE0000000FFF80003FFE0000000FFF80003FFE0000000FFF8000
8797 1FFE0000000FFF80001FFF0000000FFF80000FFF0000001FFF800007FF8000003FFF8000
8798 07FF8000007FFF800003FFC00000FFFF800001FFE00001FFFF800000FFF00003FFFFE000
8799 007FFC000FEFFFFF80001FFF007F8FFFFF800007FFFFFF0FFFFF800001FFFFFC0FFFFF80
8800 00007FFFE00FFFFF80000007FF000FFE000041547CD249>I<000007FF80000000007FFF
8801 F800000001FFFFFE00000007FFFFFF8000001FFF03FFE000003FFC007FF000007FF0003F
8802 F80000FFE0001FFC0001FFC0000FFC0003FF800007FE0007FF800007FF000FFF000003FF
8803 000FFF000003FF801FFE000003FF801FFE000001FF803FFE000001FFC03FFE000001FFC0
8804 3FFE000001FFC07FFC000001FFC07FFC000001FFE07FFC000000FFE07FFC000000FFE0FF
8805 FC000000FFE0FFFC000000FFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFF
8806 FFFFFFFFE0FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00
8807 00000000FFFC00000000007FFC00000000007FFC00000000007FFC00000000007FFE0000
8808 0000003FFE00000000003FFE00000000003FFE00000003E01FFF00000003E01FFF000000
8809 07E00FFF00000007C007FF8000000FC007FF8000000F8003FFC000001F8001FFE000003F
8810 0000FFF000007E00007FFC0001FC00001FFF0007F800000FFFE03FF0000003FFFFFFC000
8811 0000FFFFFF800000003FFFFC0000000001FFE0000033387CB63C>I<00001FFE0000FE00
8812 0001FFFFE007FF80000FFFFFFC1FFFC0003FFFFFFF7FFFE0007FF807FFFF07E001FFE001
8813 FFF07FE003FFC000FFF07FE007FF80007FF83FE007FF00003FF83FC00FFF00003FFC1FC0
8814 1FFF00003FFE07001FFE00001FFE00001FFE00001FFE00003FFE00001FFF00003FFE0000
8815 1FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF0000
8816 3FFE00001FFF00003FFE00001FFF00003FFE00001FFF00001FFE00001FFE00001FFE0000
8817 1FFE00001FFF00003FFE00000FFF00003FFC000007FF00003FF8000007FF80007FF80000
8818 03FFC000FFF0000001FFE001FFE0000000FFF807FF80000001FFFFFFFF00000003EFFFFF
8819 FC00000003C1FFFFE000000007C01FFE0000000007800000000000000780000000000000
8820 0FC00000000000000FC00000000000000FC00000000000000FE00000000000000FE00000
8821 000000000FF00000000000000FFC0000000000000FFFFFFFFE00000007FFFFFFFFF00000
8822 07FFFFFFFFFC000007FFFFFFFFFF800003FFFFFFFFFFC00003FFFFFFFFFFF00001FFFFFF
8823 FFFFF80000FFFFFFFFFFFC00007FFFFFFFFFFC0001FFFFFFFFFFFE0007FFFFFFFFFFFE00
8824 0FFC000003FFFF001FF80000003FFF003FF00000000FFF007FE000000007FF807FE00000
8825 0003FF80FFC000000003FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80
8826 FFC000000001FF80FFC000000001FF80FFE000000003FF807FE000000003FF007FF00000
8827 0007FF003FF000000007FE001FF80000000FFC001FFE0000003FFC0007FF0000007FF000
8828 03FFC00001FFE00000FFFC001FFF8000003FFFFFFFFE0000000FFFFFFFF800000001FFFF
8829 FFC0000000000FFFF80000003B4F7CB542>103 D<003FF8000000000000FFFFF8000000
8830 000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000
8831 00000003FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000
8832 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000
8833 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000
8834 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000
8835 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000
8836 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8001FFC
8837 00000000FFF800FFFF80000000FFF803FFFFE0000000FFF80FFFFFF8000000FFF81FC07F
8838 FC000000FFF87E003FFE000000FFF8F8001FFF000000FFF9F0001FFF000000FFF9E0000F
8839 FF800000FFFBC0000FFF800000FFFF80000FFF800000FFFF000007FFC00000FFFF000007
8840 FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC000007
8841 FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF8000007
8842 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8843 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8844 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8845 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8846 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8847 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8848 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
8849 FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FF
8850 FFFFC0FFFFFFF807FFFFFFC042537CD249>I<003F000000FFC00001FFE00003FFF00003
8851 FFF00007FFF80007FFF80007FFF80007FFF80007FFF80007FFF80003FFF00003FFF00001
8852 FFE00000FFC000003F000000000000000000000000000000000000000000000000000000
8853 00000000000000000000000000000000000000000000000000000000000000001FF800FF
8854 FFF800FFFFF800FFFFF800FFFFF800FFFFF80001FFF80000FFF80000FFF80000FFF80000
8855 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000
8856 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000
8857 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000
8858 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000
8859 FFF80000FFF80000FFF800FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF01C547CD324
8860 >I<0000003F00000000FFC0000001FFE0000003FFF0000003FFF0000007FFF8000007FF
8861 F8000007FFF8000007FFF8000007FFF8000007FFF8000003FFF0000003FFF0000001FFE0
8862 000000FFC00000003F000000000000000000000000000000000000000000000000000000
8863 000000000000000000000000000000000000000000000000000000000000000000000000
8864 00000000000000000000003FF80001FFFFF80001FFFFF80001FFFFF80001FFFFF80001FF
8865 FFF8000003FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FF
8866 F8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8
8867 000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF800
8868 0000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF80000
8869 00FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000
8870 FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FF
8871 F8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8
8872 000000FFF8000000FFF8000000FFF8000000FFF8078000FFF81FE000FFF83FF000FFF87F
8873 F800FFF8FFFC00FFF0FFFC01FFF0FFFC01FFF0FFFC01FFE0FFFC01FFE0FFFC03FFC07FF8
8874 03FF807FF807FF003FF00FFE001FF03FFC000FFFFFF00007FFFFE00001FFFF0000003FF8
8875 0000256C87D328>I<003FF80000000000FFFFF80000000000FFFFF80000000000FFFFF8
8876 0000000000FFFFF80000000000FFFFF8000000000003FFF8000000000000FFF800000000
8877 0000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8
8878 000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000000
8879 0000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8
8880 000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000000
8881 0000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8
8882 0007FFFFF000FFF80007FFFFF000FFF80007FFFFF000FFF80007FFFFF000FFF80007FFFF
8883 F000FFF800007FF00000FFF800003FC00000FFF800007F800000FFF80000FF000000FFF8
8884 0001FC000000FFF80003F8000000FFF8000FF0000000FFF8001FE0000000FFF8003FC000
8885 0000FFF8007F00000000FFF800FE00000000FFF803FC00000000FFF807F800000000FFF8
8886 0FF000000000FFF81FE000000000FFF83FF000000000FFF87FF800000000FFF9FFF80000
8887 0000FFFBFFFC00000000FFFFFFFE00000000FFFFFFFE00000000FFFFFFFF00000000FFFF
8888 BFFF80000000FFFF1FFFC0000000FFFE1FFFC0000000FFFC0FFFE0000000FFF007FFF000
8889 0000FFF003FFF8000000FFF003FFF8000000FFF001FFFC000000FFF000FFFE000000FFF0
8890 007FFE000000FFF0007FFF000000FFF0003FFF800000FFF0001FFFC00000FFF0001FFFC0
8891 0000FFF0000FFFE00000FFF00007FFF00000FFF00003FFF80000FFF00003FFF80000FFF0
8892 0001FFFC0000FFF00000FFFE0000FFF00000FFFF00FFFFFFF00FFFFFFEFFFFFFF00FFFFF
8893 FEFFFFFFF00FFFFFFEFFFFFFF00FFFFFFEFFFFFFF00FFFFFFE3F537DD245>I<003FF000
8894 1FFC000000FFFFF000FFFF800000FFFFF003FFFFE00000FFFFF00FFFFFF80000FFFFF01F
8895 C07FFC0000FFFFF07E003FFE000003FFF0F8001FFF000000FFF1F0001FFF000000FFF1E0
8896 000FFF800000FFF3C0000FFF800000FFF780000FFF800000FFF7000007FFC00000FFFF00
8897 0007FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC00
8898 0007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF800
8899 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8900 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8901 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8902 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8903 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8904 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8905 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800
8906 0007FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF8
8907 07FFFFFFC0FFFFFFF807FFFFFFC042367CB549>110 D<003FF8007FF0000000FFFFF807
8908 FFFF000000FFFFF81FFFFFC00000FFFFF87FFFFFF00000FFFFF9FF00FFFC0000FFFFFFF8
8909 003FFF000003FFFFE0000FFF800000FFFF800007FFC00000FFFF000003FFE00000FFFE00
8910 0003FFF00000FFFC000001FFF00000FFF8000000FFF80000FFF8000000FFFC0000FFF800
8911 00007FFC0000FFF80000007FFE0000FFF80000007FFE0000FFF80000003FFE0000FFF800
8912 00003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF800
8913 00001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF800
8914 00001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF800
8915 00001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF800
8916 00001FFF8000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF800
8917 00003FFF0000FFF80000007FFE0000FFF80000007FFE0000FFF80000007FFC0000FFF800
8918 0000FFFC0000FFF8000000FFF80000FFFC000001FFF80000FFFC000001FFF00000FFFE00
8919 0003FFE00000FFFF000007FFC00000FFFF80000FFF800000FFFFE0001FFF000000FFFFF0
8920 007FFE000000FFF9FE01FFF8000000FFF8FFFFFFF0000000FFF83FFFFFC0000000FFF807
8921 FFFE00000000FFF800FFE000000000FFF800000000000000FFF800000000000000FFF800
8922 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800
8923 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800
8924 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800
8925 000000000000FFF800000000000000FFF8000000000000FFFFFFF80000000000FFFFFFF8
8926 0000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000414D7DB5
8927 49>112 D<003FF001FC00FFFFF00FFF80FFFFF01FFFE0FFFFF07FFFF0FFFFF0FE1FF8FF
8928 FFF1F83FF801FFF1F07FFC00FFF3E07FFC00FFF3C07FFC00FFF7807FFC00FFF7807FFC00
8929 FFFF007FFC00FFFF003FF800FFFE001FF000FFFE000FE000FFFE00000000FFFC00000000
8930 FFFC00000000FFFC00000000FFFC00000000FFF800000000FFF800000000FFF800000000
8931 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000
8932 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000
8933 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000
8934 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000
8935 FFF800000000FFF8000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FF
8936 FFFFFE00002E367DB535>114 D<0003FFC00E00001FFFFC1E0000FFFFFF7E0003FFFFFF
8937 FE0007FE003FFE000FF0000FFE001FE00003FE003FC00001FE003F800000FE007F800000
8938 FE007F0000007E007F0000007E00FF0000003E00FF0000003E00FF8000003E00FF800000
8939 3E00FFC000003E00FFF000000000FFFC00000000FFFF800000007FFFFE0000007FFFFFF0
8940 00003FFFFFFE00003FFFFFFF80001FFFFFFFE0000FFFFFFFF00007FFFFFFFC0003FFFFFF
8941 FE0000FFFFFFFF00003FFFFFFF00000FFFFFFF800001FFFFFF8000000FFFFFC00000003F
8942 FFC000000007FFE000000001FFE0F8000000FFE0F80000007FE0FC0000003FE0FC000000
8943 3FE0FC0000001FE0FE0000001FE0FE0000001FE0FE0000001FC0FF0000001FC0FF800000
8944 3FC0FF8000003F80FFC000003F80FFE000007F00FFF80000FF00FFFC0003FE00FFFF801F
8945 FC00FE7FFFFFF000F81FFFFFC000F007FFFF0000E0007FF000002B387CB634>I<00007C
8946 00000000007C00000000007C00000000007C00000000007C00000000007C0000000000FC
8947 0000000000FC0000000000FC0000000000FC0000000001FC0000000001FC0000000001FC
8948 0000000003FC0000000003FC0000000007FC0000000007FC000000000FFC000000001FFC
8949 000000003FFC000000007FFC00000000FFFC00000003FFFC0000000FFFFFFFFE00FFFFFF
8950 FFFE00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00007FFC000000007FFC000000007FFC
8951 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC
8952 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC
8953 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC
8954 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC
8955 000000007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC
8956 000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC
8957 001F00003FFE001F00003FFE001F00001FFE003E00001FFF003E00000FFF807C000007FF
8958 C1F8000003FFFFF0000000FFFFE00000003FFF8000000003FE0000294D7ECB33>I<003F
8959 F8000001FFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFF
8960 F80007FFFFC000FFFFF80007FFFFC00003FFF800001FFFC00000FFF8000007FFC00000FF
8961 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8962 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8963 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8964 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8965 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8966 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8967 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF
8968 F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800000FFFC00000FF
8969 F800000FFFC00000FFF800000FFFC00000FFF800001FFFC00000FFF800001FFFC00000FF
8970 F800003FFFC000007FF800003FFFC000007FF800007FFFC000003FFC0000F7FFC000003F
8971 FC0001E7FFF000001FFE0007C7FFFFC0000FFF801F87FFFFC00007FFFFFF07FFFFC00001
8972 FFFFFC07FFFFC000007FFFF007FFFFC0000007FFC007FF000042377CB549>I<FFFFFFE0
8973 001FFFFCFFFFFFE0001FFFFCFFFFFFE0001FFFFCFFFFFFE0001FFFFCFFFFFFE0001FFFFC
8974 01FFF8000001FF0000FFF80000007C0000FFFC000000FC00007FFC000000F800007FFE00
8975 0000F800007FFE000001F800003FFF000001F000003FFF000003F000001FFF000003E000
8976 001FFF800007E000000FFF800007C000000FFFC0000FC000000FFFC0000FC0000007FFE0
8977 000F80000007FFE0001F80000003FFE0001F00000003FFF0003F00000001FFF0003E0000
8978 0001FFF8007E00000000FFF8007C00000000FFFC007C00000000FFFC00FC000000007FFC
8979 00F8000000007FFE01F8000000003FFE01F0000000003FFF03F0000000001FFF03E00000
8980 00001FFF83E0000000001FFF87E0000000000FFF87C0000000000FFFCFC00000000007FF
8981 CF800000000007FFFF800000000003FFFF000000000003FFFF000000000003FFFF000000
8982 000001FFFE000000000001FFFE000000000000FFFC000000000000FFFC0000000000007F
8983 F80000000000007FF80000000000007FF80000000000003FF00000000000003FF0000000
8984 0000001FE00000000000001FE00000000000000FC00000000000000FC00000003E367DB4
8985 45>I<00000003C0000000000007F000000000001FF800000000003FFC00000000007FFC
8986 0000000000FFFE0000000001FFFE0000000003FFFE0000000007FFFE000000000FFFFE00
8987 0000001FFFFC000000003FFFF8000000007FFFF000000000FFFFC000000001FFFE000000
8988 0003FFF80000000003FFC00000000001FE000000000001F8000000000000C00000000000
8989 000000000000000000000000000000000000000000000000000000000007FF8000000000
8990 7FFFF800000001FFFFFE00000007FFFFFF8000001FFF03FFE000003FFC007FF000007FF0
8991 003FF80000FFE0001FFC0001FFC0000FFC0003FF800007FE0007FF800007FF000FFF0000
8992 03FF000FFF000003FF801FFE000003FF801FFE000001FF803FFE000001FFC03FFE000001
8993 FFC03FFE000001FFC07FFC000001FFC07FFC000001FFE07FFC000000FFE07FFC000000FF
8994 E0FFFC000000FFE0FFFC000000FFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0
8995 FFFFFFFFFFFFE0FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FF
8996 FC0000000000FFFC00000000007FFC00000000007FFC00000000007FFC00000000007FFE
8997 00000000003FFE00000000003FFE00000000003FFE00000003E01FFF00000003E01FFF00
8998 000007E00FFF00000007C007FF8000000FC007FF8000000F8003FFC000001F8001FFE000
8999 003F0000FFF000007E00007FFC0001FC00001FFF0007F800000FFFE03FF0000003FFFFFF
9000 C0000000FFFFFF800000003FFFFC0000000001FFE0000033507CCE3C>233
9001 D E
9002 %EndDVIPSBitmapFont
9003 %DVIPSBitmapFont: Fc ecrm1200 12 10
9004 /Fc 10 115 df<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000
9005 E000C000C000C001C0018003800300070006000E001C003800700060000B1D78891B>44
9006 D<0000FF00000007FFE000001F81F800003E007C0000FC003F0001F8001F8001F0000F80
9007 03E00007C007C00003E007C00003E00FC00003F00F800001F01F800001F81F800001F83F
9008 800001FC3F800001FC3F800001FC3F000000FC7F000000FE7F000000FE7F000000FE7F00
9009 0000FE7F000000FEFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF0000
9010 00FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000
9011 FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FF
9012 FF000000FFFF000000FF7F000000FE7F000000FE7F000000FE7F000000FE7F000000FE7F
9013 800001FE3F800001FC3F800001FC3F800001FC1F800001F81F800001F80FC00003F00FC0
9014 0003F00FC00003F007E00007E003E00007C003F0000FC001F8001F8000FC003F00003E00
9015 7C00001F81F8000007FFE0000000FF000028447CC131>48 D<0003FE0000001FFFC00000
9016 7FFFF00001F80FFC0003C001FE00078000FF000E00007F801C00003FC01C00001FE03800
9017 001FF03000000FF07000000FF860000007F86C000007F8FF000007FCFF800007FCFFC000
9018 07FCFFC00003FCFFC00003FCFFC00003FCFFC00003FC7F800007FC3F000007FC00000007
9019 FC00000007F800000007F80000000FF80000000FF00000001FF00000001FE00000001FE0
9020 0000003FC00000007F800000007F00000000FF00000000FE00000001FC00000003F80000
9021 0007F000000007E00000000FC00000001F800000003F000000007C00000000F800000000
9022 F000000001E000000003C000000007800000000F00000C001E00000C003C00000C003800
9023 0018007000001800E000001801C0000018038000003807000000300E000000701FFFFFFF
9024 F01FFFFFFFF03FFFFFFFF07FFFFFFFF0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE026427BC131
9025 >50 D<0001FF0000000FFFE000003FFFFC0000FE01FE0001F0007F8003C0003FC0070000
9026 1FE00E00001FE00E00000FF00FE0000FF01FF0000FF81FF0000FF81FF00007F81FF80007
9027 F81FF00007F81FF00007F80FE0000FF803C0000FF80000000FF00000000FF00000000FF0
9028 0000001FE00000001FE00000003FC00000003F800000007F00000000FE00000001FC0000
9029 0003F00000001FC000000FFF0000000FFFF000000001FC000000007F000000003F800000
9030 001FC00000000FE00000000FF000000007F800000007FC00000003FC00000003FE000000
9031 03FE00000001FE00000001FF00000001FF00000001FF1E000001FF7F800001FFFFC00001
9032 FFFFC00001FFFFC00001FFFFC00001FFFFC00001FEFF800003FEFF800003FE7E000003FC
9033 70000007FC30000007F83800000FF81C00000FF00E00001FE00780003FC003E0007F8001
9034 FE01FE00007FFFF800000FFFE0000001FF000028447CC131>I<0000FF00000007FFE000
9035 001FFFF800007F00FE0000FC003F0001F0001F8003E0000FC003C00007E007C00003F00F
9036 800001F00F800001F00F000001F81F000000F81F000000F81F000000F81F000000F81F80
9037 0000F81F800000F81FC00001F81FC00001F01FE00001F00FF00003E00FFC0003E007FE00
9038 07C007FF800F8003FFC01F0001FFF03E0001FFF87800007FFEF000003FFFC000001FFFC0
9039 000007FFE0000003FFF8000007FFFC00001E7FFF00007C1FFF8000F80FFFC001E003FFE0
9040 03C001FFF007C0007FF80F80003FFC1F00000FFC3E000007FE3E000001FE7C000000FE7C
9041 000000FF7C0000007FF80000003FF80000003FF80000001FF80000001FF80000001FF800
9042 00001FF80000001FFC0000001E7C0000003E7C0000003E7E0000003C3E0000007C1F0000
9043 00F81F800001F00FC00003E007E00007C003F8001F8000FF00FF00003FFFFC00000FFFF0
9044 000001FF800028447CC131>56 D<FFFF800000000007FFFCFFFFC0000000000FFFFCFFFF
9045 C0000000000FFFFC01FFC0000000000FFE00006FE0000000001BF800006FE0000000001B
9046 F800006FE0000000001BF8000067F00000000033F8000067F00000000033F8000063F800
9047 00000063F8000063F80000000063F8000063F80000000063F8000061FC00000000C3F800
9048 0061FC00000000C3F8000061FC00000000C3F8000060FE0000000183F8000060FE000000
9049 0183F80000607F0000000303F80000607F0000000303F80000607F0000000303F8000060
9050 3F8000000603F80000603F8000000603F80000603F8000000603F80000601FC000000C03
9051 F80000601FC000000C03F80000600FE000001803F80000600FE000001803F80000600FE0
9052 00001803F800006007F000003003F800006007F000003003F800006007F000003003F800
9053 006003F800006003F800006003F800006003F800006001FC0000C003F800006001FC0000
9054 C003F800006001FC0000C003F800006000FE00018003F800006000FE00018003F8000060
9055 00FE00018003F8000060007F00030003F8000060007F00030003F8000060003F80060003
9056 F8000060003F80060003F8000060003F80060003F8000060001FC00C0003F8000060001F
9057 C00C0003F8000060001FC00C0003F8000060000FE0180003F8000060000FE0180003F800
9058 00600007F0300003F80000600007F0300003F80000600007F0300003F80000600003F860
9059 0003F80000600003F8600003F80000600003F8600003F80000600001FCC00003F8000060
9060 0001FCC00003F80000600000FF800003F80000600000FF800003F80000600000FF800003
9061 F800006000007F000003F80000F000007F000003F80000F000007F000003F80001F80000
9062 3E000003F8000FFF00003E00000FFE00FFFFF0001C0007FFFFFCFFFFF0001C0007FFFFFC
9063 FFFFF0001C0007FFFFFC4E447BC359>77 D<0007FC000000003FFF80000000F80FE00000
9064 03C003F00000070001F800000E0000FC00000FC0007E00001FE0007F00001FF0003F8000
9065 1FF0003F80001FF0003F80001FF0001FC0001FF0001FC0000FE0001FC0000380001FC000
9066 0000001FC0000000001FC0000000001FC0000000001FC00000000FFFC0000001FFFFC000
9067 000FFE1FC000003FC01FC00000FF001FC00003FC001FC00007F8001FC0000FF0001FC000
9068 1FE0001FC0003FC0001FC0007FC0001FC0007F80001FC0007F80001FC060FF00001FC060
9069 FF00001FC060FF00001FC060FF00003FC060FF00003FC060FF00003FC060FF80007FC060
9070 7F8000EFC0607FC000C7E0C03FC001C7E0C01FE00783F1C007F81E03FF8001FFFC01FF00
9071 001FE0007C002B2E7CAC31>97 D<00007F80000003FFF000000FC07C00003F000F0000FC
9072 00038001F80001C003F8000FC007F0001FE007E0003FE00FE0003FE01FC0003FE01FC000
9073 3FE03F80003FE03F80001FC07F800007007F800000007F800000007F00000000FF000000
9074 00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000
9075 FF00000000FF00000000FF000000007F000000007F800000007F800000003F800000003F
9076 800000303FC00000301FC00000700FE00000600FE00000E007F00000C003F80001C001F8
9077 00038000FC000700003F001E00001FC078000007FFF0000000FF8000242E7DAC2B>99
9078 D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000
9079 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000
9080 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000
9081 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000
9082 0001FC0000000001FC01FE000001FC07FFC00001FC1E07F00001FC3801F80001FC7001FC
9083 0001FCE000FC0001FDC000FE0001FD8000FE0001FF80007F0001FF00007F0001FF00007F
9084 0001FE00007F0001FE00007F0001FE00007F0001FC00007F0001FC00007F0001FC00007F
9085 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F
9086 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F
9087 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F
9088 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0003FE0000FF
9089 80FFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFE2F457DC436>104
9090 D<03F803F0FFF81FFCFFF83C3EFFF8707F07F8E0FF03F9C0FF01F980FF01FB80FF01FB00
9091 7E01FB003C01FF000001FE000001FE000001FE000001FE000001FC000001FC000001FC00
9092 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00
9093 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00
9094 0001FC000001FC000001FC000001FC000003FF0000FFFFFE00FFFFFE00FFFFFE00202C7D
9095 AB26>114 D E
9096 %EndDVIPSBitmapFont
9097 %DVIPSBitmapFont: Fd ecrm1728 17.28 5
9098 /Fd 5 117 df<0F003FC07FE0FFF0FFF0FFF0FFF0FFF0FFF07FE03FC00F000000000000
9099 000000000000000000000000000000000000000000000000000000000000000000000000
9100 00000000000000000000000000000000000000000000000000000000000000000000000F
9101 003FC07FE0FFF0FFF0FFF0FFF0FFF0FFF07FE03FC00F000C3E74BD25>58
9102 D<3FFFFFFFFFFFFFFFFFFFF03FFFFFFFFFFFFFFFFFFFF03FFFFFFFFFFFFFFFFFFFF03FFF
9103 FFFFFFFFFFFFFFFFF03FFF800007FF800007FFF03FFC000003FF000000FFF03FE0000003
9104 FF0000001FF03FC0000003FF0000000FF07F80000003FF00000007F87F00000003FF0000
9105 0003F87E00000003FF00000001F87C00000003FF00000000F87C00000003FF00000000F8
9106 7C00000003FF00000000F87800000003FF00000000787800000003FF0000000078780000
9107 0003FF00000000787800000003FF00000000787000000003FF00000000387000000003FF
9108 00000000387000000003FF00000000387000000003FF00000000387000000003FF000000
9109 00387000000003FF0000000038F000000003FF000000003CE000000003FF000000001CE0
9110 00000003FF000000001CE000000003FF000000001CE000000003FF000000001CE0000000
9111 03FF000000001CE000000003FF000000001CE000000003FF000000001C0000000003FF00
9112 000000000000000003FF00000000000000000003FF00000000000000000003FF00000000
9113 000000000003FF00000000000000000003FF00000000000000000003FF00000000000000
9114 000003FF00000000000000000003FF00000000000000000003FF00000000000000000003
9115 FF00000000000000000003FF00000000000000000003FF00000000000000000003FF0000
9116 0000000000000003FF00000000000000000003FF00000000000000000003FF0000000000
9117 0000000003FF00000000000000000003FF00000000000000000003FF0000000000000000
9118 0003FF00000000000000000003FF00000000000000000003FF00000000000000000003FF
9119 00000000000000000003FF00000000000000000003FF00000000000000000003FF000000
9120 00000000000003FF00000000000000000003FF00000000000000000003FF000000000000
9121 00000003FF00000000000000000003FF00000000000000000003FF000000000000000000
9122 03FF00000000000000000003FF00000000000000000003FF00000000000000000003FF00
9123 000000000000000003FF00000000000000000003FF00000000000000000003FF00000000
9124 000000000003FF00000000000000000003FF00000000000000000003FF00000000000000
9125 000003FF00000000000000000003FF00000000000000000003FF00000000000000000003
9126 FF00000000000000000003FF00000000000000000003FF00000000000000000003FF0000
9127 0000000000000003FF00000000000000000003FF00000000000000000003FF0000000000
9128 0000000003FF00000000000000000003FF00000000000000000003FF0000000000000000
9129 0003FF00000000000000000003FF00000000000000000003FF00000000000000000007FF
9130 80000000000000000007FF8000000000000000003FFFF000000000000003FFFFFFFFFF00
9131 0000000003FFFFFFFFFF000000000003FFFFFFFFFF000000000003FFFFFFFFFF00000056
9132 627BE161>84 D<000003FE00000000001FFFE000000000FFFFF800000001FE03FE000000
9133 07F0007F8000000FE0003FC000003FC0001FE000007F00000FF00000FF000007F80000FE
9134 000003F80001FC000003FC0003F8000001FC0007F8000001FE0007F0000000FE000FF000
9135 0000FF000FF00000007F001FE00000007F001FE00000007F803FE00000007F803FC00000
9136 003F803FC00000003F807FC00000003FC07FC00000003FC07FC00000003FC07F80000000
9137 3FC07F800000003FC0FF800000003FC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFF
9138 C0FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000
9139 FF800000000000FF800000000000FF800000000000FF8000000000007F8000000000007F
9140 C000000000007FC000000000007FC000000000003FC000000000003FC000000000003FE0
9141 00000000001FE000000000001FE000000001C00FF000000001C00FF000000003C007F800
9142 0000038007F8000000038003FC000000078001FC0000000F0001FE0000000E0000FF0000
9143 001E00007F8000003C00003FC000007800001FE00000F0000007F00003E0000003FC0007
9144 C0000000FF803F000000003FFFFC000000000FFFF00000000001FF80000032417BBF3C>
9145 101 D<0000FFC00300000FFFF80700007FFFFE0F0001FF003F9F0003F00007DF0007E000
9146 03FF000F800000FF001F8000007F003F0000007F003E0000003F007E0000001F007C0000
9147 001F00FC0000000F00FC0000000F00FC0000000F00FC0000000F00FC0000000700FE0000
9148 000700FE0000000700FF0000000700FF80000007007FC0000007007FE0000000007FF800
9149 0000003FFE000000001FFFE00000000FFFFF0000000FFFFFF0000003FFFFFE000001FFFF
9150 FF8000007FFFFFE000001FFFFFF8000007FFFFFC000000FFFFFE00000007FFFF00000000
9151 3FFF8000000007FF8000000001FFC0000000007FC0E00000003FE0E00000001FE0E00000
9152 001FF0F00000000FF0F000000007F0F000000007F0F000000007F0F800000003F0F80000
9153 0003F0F800000003F0FC00000003F0FC00000003F0FE00000003E0FE00000007E0FF0000
9154 0007E0FF00000007C0FF8000000FC0FFC000000F80FFE000001F80FDF000003F00F8F800
9155 007E00F87C0001FC00F01F801FF000F00FFFFFC000E003FFFF0000C0007FF000002C417C
9156 BF35>115 D<000070000000000070000000000070000000000070000000000070000000
9157 0000700000000000700000000000F00000000000F00000000000F00000000000F0000000
9158 0000F00000000001F00000000001F00000000001F00000000003F00000000003F0000000
9159 0007F00000000007F0000000000FF0000000000FF0000000001FF0000000003FF0000000
9160 007FF000000000FFF000000003FFF00000000FFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00
9161 FFFFFFFFFF00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000
9162 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000
9163 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000
9164 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000
9165 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000
9166 000FF0000000000FF0000000000FF0000000000FF00001C0000FF00001C0000FF00001C0
9167 000FF00001C0000FF00001C0000FF00001C0000FF00001C0000FF00001C0000FF00001C0
9168 000FF00001C0000FF00001C0000FF00001C0000FF00001C0000FF00001C00007F8000380
9169 0007F80003800007F80003800007F80007800003FC0007000003FC000F000001FE000E00
9170 0000FF001E0000007F803C0000003FE0F80000001FFFF000000007FFC000000000FF0000
9171 2A597ED734>I E
9172 %EndDVIPSBitmapFont
9173 %DVIPSBitmapFont: Fe ectt1728 17.28 10
9174 /Fe 10 117 df<7FFFFFFFFFFC7FFFFFFFFFFCFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFF
9175 FEFFFFFFFFFFFE7FFFFFFFFFFC7FFFFFFFFFFC2F0874A248>45 D<000000FFF000000000
9176 000FFFFF00000000007FFFFFC000000001FFFFFFF000000007FFFFFFFC0000001FFFFFFF
9177 FE0000003FFFFFFFFF0000007FFFFFFFFF800000FFFF801FFFC00001FFF80001FFE00001
9178 FFC000007FF00003FF0000003FF80007FE0000000FF80007FC00000007FC0007F8000000
9179 07FC000FF800000003FC000FF800000003FE000FFC00000001FE000FFC00000001FE000F
9180 FC00000001FE000FFC00000001FE0007F800000001FE0003F000000001FE0001E0000000
9181 01FE00000000000003FE00000000000003FC00000000000003FC00000000000007FC0000
9182 0000000007F80000000000000FF80000000000001FF00000000000001FF0000000000000
9183 3FE0000000000000FFE0000000000001FFC0000000000007FF8000000000001FFF000000
9184 00001FFFFE000000001FFFFFFC000000003FFFFFF8000000003FFFFFF0000000003FFFFF
9185 C0000000003FFFFFE0000000003FFFFFF8000000003FFFFFFE000000001FFFFFFF000000
9186 0000001FFF80000000000003FFE00000000000007FF00000000000003FF8000000000000
9187 0FFC00000000000007FC00000000000003FE00000000000001FF00000000000000FF0000
9188 0000000000FF800000000000007F800000000000007FC00000000000003FC00000000000
9189 003FC00000000000003FE00000000000001FE00000000000001FE00000000000001FE03F
9190 00000000001FE07F80000000001FE07F80000000001FE0FFC0000000001FE0FFC0000000
9191 001FE0FFC0000000003FE0FFC0000000003FC0FF80000000003FC0FF80000000007FC07F
9192 80000000007FC07F8000000000FF807FC000000000FF803FE000000001FF003FF0000000
9193 03FF001FF800000007FE001FFC0000000FFC000FFF0000003FFC0007FFC000007FF80003
9194 FFF80003FFF00001FFFF801FFFE00000FFFFFFFFFFC000007FFFFFFFFF8000001FFFFFFF
9195 FF0000000FFFFFFFFC00000003FFFFFFF000000000FFFFFFC0000000001FFFFF00000000
9196 0000FFF00000003B5C7AD948>51 D<000000003FFFC000000000007FFFC00000000000FF
9197 FFE00000000000FFFFE00000000000FFFFE00000000000FFFFE000000000007FFFE00000
9198 0000003FFFE00000000000001FE00000000000001FE00000000000001FE0000000000000
9199 1FE00000000000001FE00000000000001FE00000000000001FE00000000000001FE00000
9200 000000001FE00000000000001FE00000000000001FE00000000000001FE0000000000000
9201 1FE00000000000001FE00000000000001FE00000000000001FE00000000000001FE00000
9202 0007FC001FE00000003FFFC01FE0000000FFFFF01FE0000003FFFFF81FE0000007FFFFFE
9203 1FE000001FFFFFFF1FE000003FFFFFFF9FE000007FFFFFFFDFE00000FFFF01FFFFE00000
9204 FFF8003FFFE00001FFE0000FFFE00003FF800007FFE00007FF000003FFE00007FE000001
9205 FFE0000FFC000000FFE0000FF8000000FFE0001FF00000007FE0001FF00000007FE0003F
9206 E00000003FE0003FE00000003FE0003FC00000001FE0007FC00000001FE0007FC0000000
9207 1FE0007F800000001FE0007F800000001FE000FF800000001FE000FF800000001FE000FF
9208 000000001FE000FF000000001FE000FF000000001FE000FF000000001FE000FF00000000
9209 1FE000FF000000001FE000FF000000001FE000FF000000001FE000FF000000001FE000FF
9210 000000001FE000FF800000001FE000FF800000001FE0007F800000001FE0007F80000000
9211 3FE0007F800000003FE0007FC00000003FE0003FC00000003FE0003FE00000007FE0003F
9212 E00000007FE0001FF0000000FFE0001FF0000000FFE0000FF8000001FFE0000FFC000003
9213 FFE00007FC000003FFE00007FE000007FFE00003FF00000FFFE00003FFC0003FFFE00001
9214 FFF0007FDFE00000FFFC03FFDFFFF0007FFFFFFF9FFFF8003FFFFFFF1FFFFC001FFFFFFE
9215 1FFFFC000FFFFFF81FFFFC0007FFFFF01FFFFC0001FFFFC00FFFF800007FFF000FFFF000
9216 000FF8000000003E597AD748>100 D<000001FFC0000000000FFFFC000000007FFFFF00
9217 000001FFFFFFC0000003FFFFFFF000000FFFFFFFF800001FFFFFFFFC00003FFFFFFFFE00
9218 007FFF807FFF0000FFFC000FFF8000FFF00003FF8001FFC00001FFC003FF8000007FE007
9219 FF0000003FE007FE0000003FF00FFC0000001FF00FF80000000FF81FF00000000FF81FF0
9220 00000007F83FE000000007FC3FE000000007FC3FC000000003FC7FC000000003FC7FC000
9221 000003FC7F8000000003FE7F8000000003FEFF8000000001FEFF8000000001FEFF000000
9222 0001FEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFF
9223 FFFEFFFFFFFFFFFFFCFFFFFFFFFFFFFCFF000000000000FF800000000000FF8000000000
9224 007F8000000000007F8000000000007FC000000000007FC000000000003FE00000000000
9225 3FE000000000003FF000000000001FF000000000FC1FF800000000FC0FFC00000001FE0F
9226 FE00000001FE07FF00000003FE03FF80000007FE03FFC000000FFC01FFF000001FFC00FF
9227 FC00003FF8007FFF0000FFF0003FFFF007FFE0001FFFFFFFFFE0000FFFFFFFFFC00007FF
9228 FFFFFF000001FFFFFFFE0000007FFFFFF80000001FFFFFE000000007FFFF80000000007F
9229 F80000374178BF48>I<000007C0000000000FE0000000001FF0000000003FF800000000
9230 3FF8000000003FF8000000003FF8000000003FF8000000001FF0000000000FE000000000
9231 07C000000000000000000000000000000000000000000000000000000000000000000000
9232 000000000000000000000000000000000000000000000000000000000000000000000000
9233 000000000000000000000000000000000000000000000000000000001FFFFFF000003FFF
9234 FFF000007FFFFFF800007FFFFFF800007FFFFFF800007FFFFFF800003FFFFFF800001FFF
9235 FFF80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9236 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9237 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9238 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9239 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9240 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9241 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000
9242 07F80000000007F80000000007F80000000007F80000000007F800003FFFFFFFFFFC7FFF
9243 FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFE3FFF
9244 FFFFFFFC305974D848>105 D<3FFFFFF80000007FFFFFF8000000FFFFFFFC000000FFFF
9245 FFFC000000FFFFFFFC000000FFFFFFFC0000007FFFFFFC0000003FFFFFFC000000000003
9246 FC000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC
9247 000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC00
9248 0000000003FC000000000003FC000000000003FC000000000003FC000000000003FC0000
9249 00000003FC000000000003FC000000000003FC000000000003FC000000000003FC000000
9250 000003FC000000000003FC000000000003FC000000000003FC000000000003FC00000000
9251 0003FC000000000003FC000000000003FC000000000003FC000000000003FC0000000000
9252 03FC000000000003FC000000000003FC000000000003FC000000000003FC000000000003
9253 FC000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC
9254 000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC00
9255 0000000003FC000000000003FC000000000003FC000000000003FC000000000003FC0000
9256 00000003FC000000000003FC000000000003FC000000000003FC000000000003FC000000
9257 000003FC000000000003FC000000000003FC000000000003FC000000000003FC00000000
9258 0003FC000000000003FC000000000003FC000000000003FC000000000003FC0000000000
9259 03FC000000000003FC000000000003FC000000000003FC000000000003FC0000003FFFFF
9260 FFFFFFC07FFFFFFFFFFFE0FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFF
9261 FFFFF07FFFFFFFFFFFE03FFFFFFFFFFFC0345876D748>108 D<000003FE00000000001F
9262 FFC000000000FFFFF800000001FFFFFC00000007FFFFFF0000000FFFFFFF8000001FFFFF
9263 FFC000003FFFFFFFE000007FFE03FFF00000FFF0007FF80001FFC0001FFC0003FF80000F
9264 FE0003FF000007FE0007FE000003FF0007FC000001FF000FF8000000FF800FF00000007F
9265 801FF00000007FC01FE00000003FC03FE00000003FE03FC00000001FE03FC00000001FE0
9266 7F800000000FF07F800000000FF07F800000000FF07F800000000FF07F0000000007F0FF
9267 0000000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF00
9268 00000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF0000
9269 000007F8FF800000000FF87F800000000FF07F800000000FF07F800000000FF07FC00000
9270 001FF07FC00000001FF03FE00000003FE03FE00000003FE03FE00000003FE01FF0000000
9271 7FC01FF8000000FFC00FF8000000FF800FFC000001FF8007FE000003FF0007FF000007FF
9272 0003FF80000FFE0001FFC0001FFC0000FFF0007FF800007FFE03FFF000007FFFFFFFF000
9273 003FFFFFFFE000000FFFFFFF80000007FFFFFF00000003FFFFFE00000000FFFFF8000000
9274 001FFFC00000000003FE000000354177BF48>111 D<000000007FC000003FFFC003FFF8
9275 00007FFFC01FFFFE0000FFFFE03FFFFF8000FFFFE0FFFFFFC000FFFFE1FFFFFFE000FFFF
9276 E3FFFFFFF0007FFFE7FFFFFFF8003FFFEFFF00FFFC00001FFFF8003FFE00001FFFE0000F
9277 FF00001FFFC00003FF00001FFF800001FF80001FFF000000FFC0001FFE000000FFC0001F
9278 FC0000007FE0001FF80000003FE0001FF80000003FE0001FF00000001FF0001FF0000000
9279 1FF0001FF00000000FF0001FE00000000FF8001FE000000007F8001FE000000007F8001F
9280 E000000007F8001FE000000007FC001FE000000007FC001FE000000003FC001FE0000000
9281 03FC001FE000000003FC001FE000000003FC001FE000000003FC001FE000000003FC001F
9282 E000000003FC001FE000000003FC001FE000000003FC001FE000000003FC001FE0000000
9283 07FC001FE000000007FC001FE000000007F8001FE000000007F8001FF00000000FF8001F
9284 F00000000FF8001FF00000000FF0001FF80000001FF0001FF80000001FF0001FF8000000
9285 3FE0001FFC0000003FE0001FFC0000007FC0001FFE000000FFC0001FFF000001FF80001F
9286 FF800003FF80001FFFC00007FF00001FFFE0001FFE00001FFFF0007FFC00001FEFFE03FF
9287 F800001FE7FFFFFFF800001FE7FFFFFFF000001FE3FFFFFFC000001FE0FFFFFF8000001F
9288 E07FFFFF0000001FE01FFFFC0000001FE007FFF00000001FE001FF800000001FE0000000
9289 0000001FE00000000000001FE00000000000001FE00000000000001FE00000000000001F
9290 E00000000000001FE00000000000001FE00000000000001FE00000000000001FE0000000
9291 0000001FE00000000000001FE00000000000001FE00000000000001FE00000000000001F
9292 E00000000000001FE00000000000001FE00000000000001FE00000000000001FE0000000
9293 0000001FE00000000000001FE00000000000001FE00000000000001FE000000000003FFF
9294 FFF0000000007FFFFFF800000000FFFFFFFC00000000FFFFFFFC00000000FFFFFFFC0000
9295 0000FFFFFFFC000000007FFFFFF8000000003FFFFFF0000000003E5F7DBE48>I<00003F
9296 FF000F000003FFFFF01F80001FFFFFFC3F80007FFFFFFF3F8001FFFFFFFFFF8003FFFFFF
9297 FFFF8007FFFFFFFFFF800FFFFFFFFFFF801FFFE001FFFF803FFE00003FFF803FF000000F
9298 FF807FE0000003FF807FC0000001FF80FF80000001FF80FF80000000FF80FF00000000FF
9299 80FF000000007F80FF000000007F80FF000000007F80FF000000007F807F800000007F80
9300 7FC00000007F807FE00000003F003FF800000000001FFE00000000000FFFE00000000007
9301 FFFF8000000003FFFFFC00000001FFFFFFF00000007FFFFFFE0000001FFFFFFF80000007
9302 FFFFFFE00000007FFFFFF800000003FFFFFC000000001FFFFE00000000007FFF00000000
9303 000FFF800000000001FFC03E000000007FE07F000000003FE0FF000000001FF0FF000000
9304 000FF0FF800000000FF8FF8000000007F8FF8000000007F8FF8000000007F8FFC0000000
9305 07F8FFC000000007F8FFE000000007F8FFF00000000FF8FFF00000000FF0FFF80000001F
9306 F0FFFC0000003FF0FFFE0000007FE0FFFF800000FFE0FFFFE00007FFC0FFFFFC007FFF80
9307 FFFFFFFFFFFF80FF7FFFFFFFFF00FE3FFFFFFFFC00FE1FFFFFFFF800FE07FFFFFFE000FE
9308 01FFFFFF8000FC007FFFFE0000780007FFC00000354177BF48>115
9309 D<00000F800000000000001F800000000000003FC00000000000003FC00000000000003F
9310 C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000
9311 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F
9312 C00000000000003FC00000000000003FC00000000000003FC0000000003FFFFFFFFFFFFC
9313 007FFFFFFFFFFFFC00FFFFFFFFFFFFFE00FFFFFFFFFFFFFE00FFFFFFFFFFFFFE00FFFFFF
9314 FFFFFFFE007FFFFFFFFFFFFC007FFFFFFFFFFFFC0000003FC00000000000003FC0000000
9315 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F
9316 C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000
9317 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F
9318 C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000
9319 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F
9320 C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000
9321 0000003FC00000000000003FC000001F8000003FC000001F8000003FC000003FC000003F
9322 C000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003F
9323 C000003FC000003FC000003FC000003FC000003FC000003FC000003FE000007FC000003F
9324 E000007F8000001FF00000FF8000001FF80001FF0000001FFC0007FF0000000FFF803FFE
9325 0000000FFFFFFFFC00000007FFFFFFF800000003FFFFFFF000000001FFFFFFE000000000
9326 FFFFFF80000000003FFFFE00000000001FFFF8000000000003FF8000003A507DCE48>I
9327 E
9328 %EndDVIPSBitmapFont
9329 end
9330 %%EndProlog
9331 %%BeginSetup
9332 %%Feature: *Resolution 600dpi
9333 TeXDict begin
9334 %%BeginPaperSize: a4
9335 /setpagedevice where
9336 { pop << /PageSize [595 842] >> setpagedevice }
9337 { /a4 where { pop a4 } if }
9338 ifelse
9339 %%EndPaperSize
9340  end
9341 %%EndSetup
9342 %%Page: 1 1
9343 TeXDict begin 1 0 bop 0 TeXcolorgray Black 0 TeXcolorgray
9344 0 TeXcolorgray 0 TeXcolorgray 1371 304 a Fe(pst-solides3d)45
9345 b Fd(:)1755 487 y(T)-11 b(est)1553 922 y Fc(Marc)m(h)33
9346 b(23,)f(2008)144 1280 y Fb(1)131 b(T)-11 b(est)44 b(sauv)l(egarde)g(en)
9347 g(\034c)l(hier)h(dat)f(a)l(v)l(ec)h(jps)p 0 TeXcolorgray
9348 0 TeXcolorgray 581 4464 a
9349  tx@Dict begin CM STV CP T newpath /a 0.0 def /w 312.98018 a add def /d 0.0 a add neg def /h 369.88567 a add def a neg d moveto a neg h L w h L w d L closepath clip newpath 0 0 moveto setmatrix end
9350  581 4464 a 1762 3520 a @beginspecial
9351 @setspecial
9352  tx@Dict begin STP newpath 0.8 SLW 0  setgray  0. true -142.26372 -113.81097 170.71646 256.07469 .5 Frame  gsave 0.8 SLW 0  setgray 0 setlinecap stroke  grestore end
9353  @endspecial @beginspecial @setspecial
9354  tx@Dict begin STP newpath 0.8 SLW 0  setgray  1 setlinejoin /pst@fill { 1. .setopacityalpha fill } def /strokeopacity 1. def /fillopacity 1. def /xunit {28.45274 } def /decal -2 def /viewpointXYZ {50 -20 30} def /Decran 50 def /RotX 0 def /RotY 0 def /RotZ 0 def /hauteurlignedeniveau 0 def /linewidthlignedeniveau 1 def /fontsize {10  28.45274 mul 28.45 div } bind def /projectionsifacevisible true def /R 4 def /r1 4 def /r0 1.5 def /resolution 36 def /phi 0 def /theta 90 def /r 2 def /a 4 def /b a def /c a def /h 6 def /section {R h 2 div neg R h 2 div r h 2 div r h 2 div neg } def /base [ -1 -1 1 -1 0 1] def /axe { 0 0 1} def /function (f) def /definition { } def /args { } def /Mode 2 def /lightintensity 2 def /solidlinewidth {0.8 } def /linecolor {0  setgray } def /linestyle {solid} def /fillcolor {1  setgray currentrgbcolor} def /fillincolor {0 1 0  setrgbcolor currentrgbcolor} def /couleurlignedeniveau {0 1 0  setrgbcolor currentrgbcolor} def /color1 {1 0 0 0  setcmykcolor currentrgbcolor} def /color2 {0 1 0 0  setcmykcolor currentrgbcolor} def /color3 {0 0 1  setrgbcolor currentrgbcolor} def /color4 {1 0 0  setrgbcolor currentrgbcolor} def /range [ -5 5] def /action {draw**} def /lightsrc {10 0 10} def /rmfaces [] def /fcol [] def /solidhue [] def /solidinouthue [] def /solidinhue [] def /sommets [] def /faces [] def /solidshow [] def /solidnum [] def /solidnumf [] def /ngrid [] def /tracelignedeniveau? false def /solidgrid true def /solidhollow false def /solidbiface true def /viewpointXYZ {50 -20 30} def viewpointXYZ /PHI ED /THETA ED /Dobs ED /XpointVue {Dobs Cos1Cos2 mul} bind def /YpointVue {Dobs Sin1Cos2 mul} bind def /ZpointVue {Dobs Sin2 mul} bind def  SolidesDict begin /CX 0 def /CY 0 def /CZ 0 def  3 newcube dup (jaune) outputcolors (cube) writesolidfile  end  gsave 0.8 SLW 0  setgray 0 setlinecap stroke  grestore end
9355  @endspecial
9356 3180 4464 a
9357  currentpoint initclip moveto
9358  3180 4464 a 0 TeXcolorgray 1860 6074 a Fa(1)p
9359 0 TeXcolorgray eop end
9360 %%Page: 2 2
9361 TeXDict begin 2 1 bop 0 TeXcolorgray 0 TeXcolorgray 0
9362 TeXcolorgray 144 -45 a Fb(2)131 b(T)-11 b(est)44 b(\351criture)i(de)d
9363 (\034c)l(hier)j(dat)d(en)h(PST)-11 b(ric)l(ks)p 0 TeXcolorgray
9364 0 TeXcolorgray 581 3117 a
9365  tx@Dict begin CM STV CP T newpath /a 0.0 def /w 312.98018 a add def /d 0.0 a add neg def /h 369.88567 a add def a neg d moveto a neg h L w h L w d L closepath clip newpath 0 0 moveto setmatrix end
9366  581 3117 a 1762 2172 a @beginspecial
9367 @setspecial
9368  tx@Dict begin STP newpath 0.8 SLW 0  setgray  0. true -142.26372 -113.81097 170.71646 256.07469 .5 Frame  gsave 0.8 SLW 0  setgray 0 setlinecap stroke  grestore end
9369  @endspecial @beginspecial @setspecial
9370  tx@Dict begin STP newpath 0.8 SLW 0  setgray  1 setlinejoin /pst@fill { 1. .setopacityalpha fill } def /strokeopacity 1. def /fillopacity 1. def /xunit {28.45274 } def /decal -2 def /viewpointXYZ {50 -20 30} def /Decran 50 def /RotX 0 def /RotY 0 def /RotZ 0 def /hauteurlignedeniveau 0 def /linewidthlignedeniveau 1 def /fontsize {10  28.45274 mul 28.45 div } bind def /projectionsifacevisible true def /R 4 def /r1 4 def /r0 1.5 def /resolution 36 def /phi 0 def /theta 90 def /r 2 def /a 4 def /b a def /c a def /h 6 def /section {R h 2 div neg R h 2 div r h 2 div r h 2 div neg } def /base [ -1 -1 1 -1 0 1] def /axe { 0 0 1} def /function (f) def /definition { } def /args { } def /Mode 2 def /lightintensity 2 def /solidlinewidth {0.8 } def /linecolor {0  setgray } def /linestyle {solid} def /fillcolor {1  setgray currentrgbcolor} def /fillincolor {0 1 0  setrgbcolor currentrgbcolor} def /couleurlignedeniveau {0 1 0  setrgbcolor currentrgbcolor} def /color1 {1 0 0 0  setcmykcolor currentrgbcolor} def /color2 {0 1 0 0  setcmykcolor currentrgbcolor} def /color3 {0 0 1  setrgbcolor currentrgbcolor} def /color4 {1 0 0  setrgbcolor currentrgbcolor} def /range [ -5 5] def /action {writesolid} def /lightsrc {10 0 10} def /rmfaces [] def /solidfilename (test2) def /fcol [] def /solidhue [] def /solidinouthue [] def /solidinhue [] def /sommets [] def /faces [] def /solidshow [] def /solidnum [] def /solidnumf [] def /ngrid [] def /tracelignedeniveau? false def /solidgrid true def /solidhollow false def /solidbiface true def /viewpointXYZ {50 -20 30} def viewpointXYZ /PHI ED /THETA ED /Dobs ED /XpointVue {Dobs Cos1Cos2 mul} bind def /YpointVue {Dobs Sin1Cos2 mul} bind def /ZpointVue {Dobs Sin2 mul} bind def  SolidesDict begin /CX 0 def /CY 0 def /CZ 0 def pst-cube end  gsave 0.8 SLW 0  setgray 0 setlinecap stroke  grestore end
9371  @endspecial
9372 3180 3117 a
9373  currentpoint initclip moveto
9374  3180 3117 a 0 TeXcolorgray 1860 6074 a Fa(2)p
9375 0 TeXcolorgray eop end
9376 %%Trailer
9377
9378 userdict /end-hook known{end-hook}if
9379 %%EOF

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.