%!PS-Adobe-2.0 %%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software %%Title: test_08.dvi %%CreationDate: Sun Mar 23 09:54:17 2008 %%Pages: 2 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentPaperSizes: a4 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips test_08 %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2008.03.23:0954 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /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{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p 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} 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{ 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 rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: pstricks.pro 0 0 %! % PostScript prologue for pstricks.tex. % Version 1.02, 2007/09/13 % For distribution and copyright, see pstricks.tex. % /tx@Dict 200 dict def tx@Dict begin /ADict 25 dict def /CM { matrix currentmatrix } bind def /SLW /setlinewidth load def /CLW /currentlinewidth load def /CP /currentpoint load def /ED { exch def } bind def /L /lineto load def /T /translate load def /TMatrix { } def /RAngle { 0 } def /Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def % return 0 for negative arguments /Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known /ATAN1 {neg -1 atan 180 sub } def % atan(x) (only one parameter) /Div { dup 0 eq { pop } { div } ifelse } def % control the division /Tan { dup sin exch cos Div } def % sin(x)/cos(x) x in degrees /NET { neg exch neg exch T } def % change coordinate system to the negative one /Pyth { dup mul exch dup mul add sqrt } def % Pythagoras, expects 2 parameter /Pyth2 { % Pythagoras, xA yA xB yB 3 -1 roll % xA xB yB yA sub % xA xB yB-yA 3 1 roll % yB-yA xA xB sub % yB-yA xA-xB Pyth } def /PtoC { 2 copy cos mul 3 1 roll sin mul } def % Polar to Cartesian %----------------- hv added 20050516 --------------- /Pi 3.14159265359 def /TwoPi 6.28318530718 def /Euler 2.71828182846 def /RadtoDeg { 180 mul Pi div } bind def % convert from radian to degrees /DegtoRad { Pi mul 180 div } bind def % viceversa %----------------- hv end--------------------------- /PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def /PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def }{ /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ } /pathforall load stopped { pop pop pop pop } if z } def /STP { .996264 dup scale } def /STV { SDict begin normalscale end STP } def % %%-------------- DG begin patch 15 ---------------%% %/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def %PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y %mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul %/y ED x mul /x ED x 0 gt y 0 gt and { [ y x ] 1 a sub y mul } { [ 1 0 ] %0 } ifelse setdash stroke } def /DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def PathLength } ifelse /b ED /x1 ED /y1 ED /x ED /y ED /z y x add y1 add x1 add def /Coef b a .5 sub 2 mul y mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div def /y y Coef mul def /x x Coef mul def /y1 y1 Coef mul def /x1 x1 Coef mul def x1 0 gt y1 0 gt or x 0 gt or y 0 gt and { [ y x y1 x1 ] 1 a sub y mul } { [ 1 0 ] 0 } ifelse setdash stroke } def %%-------------- DG end patch 15 ---------------%% /DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt { /b b a div def }{ a 0 eq { /b b y sub def }{ a -3 eq { /b b y add def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if ] a 0 gt { 0 }{ y 2 div a -2 gt { neg }if } ifelse setdash 1 setlinecap stroke } def % /LineFill { % hv ------------ patch 7 ------------- gsave abs /hatchWidthInc ED abs /hatchSepInc ED abs CLW add /a ED a 0 dtransform round exch round exch 2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25 itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict /setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1 a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add hatchWidthInc 0 gt { CLW add } if def hatchSepInc 0 gt hatchWidthInc 0 gt or { /a a hatchSepInc add def CLW hatchWidthInc add SLW } if } repeat grestore pop pop } def % %gsave abs CLW add /a ED a 0 dtransform round exch round exch %2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25 %% DG/SR modification begin - Dec. 12, 1997 - Patch 2 %%itransform translate pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a %itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a %% DG/SR modification end %Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict %/setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1 %% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) %% a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore } %% def %a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore %pop pop } def %% DG/SR modification end % /BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg exch 3 index sub exch Atan rotate newpath } def % /EndArrow { @mtrx setmatrix CP grestore end } def % /Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1 scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill grestore } def % /Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0 CLW moveto } def % /Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2 div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0 CLW moveto } def % /RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW 2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0 curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto } def % /SD { 0 360 arc fill } def % /EndDot { % DS is the dot size { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def % /Shadow { [ { /moveto load } { /lineto load } { /curveto load } { /closepath load } /pathforall load stopped { pop pop pop pop CP /moveto load } if ] cvx newpath 3 1 roll T exec } def % /NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch cvi def } def /NArray { % holds the coordinates and on top of stack the showpoints boolean /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def /Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def /Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 } ifelse { pop } repeat a } def /CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq and { pop pop /n n 1 sub def } if } def /Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop } repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1 ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1 moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto Lineto pop pop closepath } ifelse } def /Diamond { /mtrx CM def T rotate /h ED /w ED dup 0 eq { pop } { CLW mul neg /d ED /a w h Atan def /h d a sin Div h add def /w d a cos Div w add def } ifelse mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 div /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx setmatrix } def % DG modification begin - Jan. 15, 1997 %/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup 0 eq { %pop } { CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2 %div dup cos exch sin Div mul sub def } ifelse mark 0 d w neg d 0 h w d 0 %d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx %setmatrix } def /Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2 div dup cos exch sin Div mul sub def mark 0 d w neg d 0 h w d 0 d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx % DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) % setmatrix } def setmatrix pop } def % DG/SR modification end /CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth def } def /CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth def } def /CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1 def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def /y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul m mul neg def } def /IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def } def /BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def /NC { CC x1 y1 x2 y2 x y curveto } def /EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def /BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def /NAC { x2 y2 x y curveto CC x1 y1 } def /EAC { x2 y2 x y ArrowB curveto pop pop } def /OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def n { NC } repeat EOC } ifelse } def /AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload /Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def /ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt { CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC } repeat closepath pop pop } ifelse } def /SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def /ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def /SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore } def /FontDot { DS 2 mul dup matrix scale matrix concatmatrix exch matrix rotate matrix concatmatrix exch findfont exch makefont setfont } def /Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto x1 y1 lineto closepath } def /OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1 y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse /b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath } ifelse } def /Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add /y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq { pop pop Rect } { OvalFrame } ifelse } def /BezierNArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def /OpenBezier { BezierNArray n 1 eq { pop pop } { ArrowA n 4 sub 3 idiv { 6 2 roll 4 2 roll curveto } repeat 6 2 roll 4 2 roll ArrowB curveto } ifelse } def /ClosedBezier { BezierNArray n 1 eq { pop pop } { moveto n 1 sub 3 idiv { 6 2 roll 4 2 roll curveto } repeat closepath } ifelse } def /BezierShowPoints { gsave Points aload length 2 div cvi /n ED moveto n 1 sub { lineto } repeat CLW 2 div SLW [ 4 4 ] 0 setdash stroke grestore } def /Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1 sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0 y0 x0 2 mul x1 sub y1 ] def } def % /Grid { newpath /a 4 string def /b ED /c ED /n ED cvi dup 1 lt { pop 1 } if /s ED s div dup 0 eq { pop 1 } if /dy ED s div dup 0 eq { pop 1 } if /dx ED dy div round dy mul /y0 ED dx div round dx mul /x0 ED dy div round cvi /y2 ED dx div round cvi /x2 ED dy div round cvi /y1 ED dx div round cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2 div add def % /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2 div add def } if systemdict /setstrokeadjust known { true setstrokeadjust /t { } def } { /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform } bind def } ifelse gsave n 0 gt { 1 setlinecap [ 0 dy n div ] dy n div 2 div setdash } { 2 setlinecap } ifelse /i x1 def /f y1 dy mul n 0 gt { dy n div 2 div h mul sub } if def /g y2 dy mul n 0 gt { dy n div 2 div h mul add } if def x2 x1 sub w mul 1 add dup 1000 gt { pop 1000 } if { i dx mul dup y0 moveto b 0 gt { gsave c i a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse h 0 gt {b neg}{z1} ifelse rmoveto show grestore } if dup t f moveto g t L stroke /i i w add def } repeat grestore gsave n 0 gt % DG/SR modification begin - Nov. 7, 1997 - Patch 1 %{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash } { 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash } % DG/SR modification end { 2 setlinecap } ifelse /i y1 def /f x1 dx mul n 0 gt { dx n div 2 div w mul sub } if def /g x2 dx mul n 0 gt { dx n div 2 div w mul add } if def y2 y1 sub h mul 1 add dup 1000 gt { pop 1000 } if { newpath i dy mul dup x0 exch moveto b 0 gt { gsave c i a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2 add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore } if dup f exch t moveto g exch t L stroke /i i h add def } repeat grestore } def % /ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0 1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c mul neg d } def % /Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def % /ArcAdjust { %%%% Vincent Guirardel % given a target length (targetLength) and an initial angle (angle0) [in the stack], % let M(angle0)=(rx*cos(angle0),ry*sin(angle0))=(x0,y0). % This computes an angle t such that (x0,y0) is at distance % targetLength from the point M(t)=(rx*cos(t),ry*sin(t)). % NOTE: this an absolute angle, it does not have to be added or substracted to angle0 % contrary to TvZ's code. % To achieve, this, one iterates the following process: start with some angle t, % compute the point M' at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]. % Now take t' (= new angle) so that (0,0) M(t') and M' are aligned. % % Another difference with TvZ's code is that we need d (=add/sub) to be defined. % the value of d = add/sub is used to know on which side we have to move. % It is only used in the initialisation of the angle before the iteration. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Input stack: 1: target length 2: initial angle % variables used : rx, ry, d (=add/sub) % /targetLength ED /angle0 ED /x0 rx angle0 cos mul def /y0 ry angle0 sin mul def % we are looking for an angle t such that (x0,y0) is at distance targetLength % from the point M(t)=(rx*cos(t),ry*sin(t))) %initialisation of angle (using 1st order approx = TvZ's code) targetLength 57.2958 mul angle0 sin rx mul dup mul angle0 cos ry mul dup mul add sqrt div % if initialisation angle is two large (more than 90 degrees) set it to 90 degrees % (if the ellipse is very curved at the point where we draw the arrow, % % the value can be much more than 360 degrees !) % this should avoid going on the wrong side (more than 180 degrees) or go near % a bad attractive point (at 180 degrees) dup 90 ge { pop 90 } if angle0 exch d % add or sub % maximum number of times to iterate the iterative procedure: % iterative procedure: takes an angle t on top of stack, computes a % better angle (and put it on top of stack) 30 { dup % compute distance D between (x0,y0) and M(t) dup cos rx mul x0 sub dup mul exch sin ry mul y0 sub dup mul add sqrt % if D almost equals targetLength, we stop dup targetLength sub abs 1e-5 le { pop exit } if % stack now contains D t % compute the point M(t') at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]: % M(t')= ( (x(t)-x0)*targetLength/d+x0 , (y(t)-y0)*targetLength/d+y0 ) exch dup cos rx mul x0 sub exch sin ry mul y0 sub % stack contains: y(t)-y0, x(t)-x0, d 2 index Div targetLength mul y0 add ry Div exch 2 index Div targetLength mul x0 add rx Div % stack contains x(t')/rx , y(t')/ry , d % now compute t', and remove D from stack atan exch pop } repeat % we don't look at what happened... in particular, if targetLength is greater % than the diameter of the ellipse... % the final angle will be around /angle0 + 180. maybe we should treat this pathological case... % after iteration, stack contains an angle t such that M(t) is the tail of the arrow % to give back the result as a an angle relative to angle0 we could add the following line: % angle0 sub 0 exch d % % begin bug fix 2006-01-11 % we want to adjust the new angle t' by a multiple of 360 so that | t'-angle0 | <= 180 %(we don't want to make the ellipse turn more or less than it should)... dup angle0 sub dup abs 180 gt { 180 add 360 div floor 360 mul sub } { pop } ifelse % end bug fix } def % /EllipticArcArrow { /d ED % is add or sub /b ED % arrow procedure /a1 ED % angle gsave newpath 0 -1000 moveto clip % Set clippath far from arrow. newpath 0 1 0 0 b % Draw arrow to determine length. grestore % Length of arrow is on top of stack. Next 3 numbers are junk. % a1 exch ArcAdjust % Angular position of base of arrow. /a2 ED pop pop pop a2 cos rx mul xOrig add % hv 2007-08-29 x->xOrig a2 sin ry mul yOrig add % hv 2007-08-29 y->yOrig a1 cos rx mul xOrig add % a1 sin ry mul yOrig add % % Now arrow tip coor and base coor are on stack. b pop pop pop pop % Draw arrow, and discard coordinates. a2 CLW 8 div % change value of d (test it by looking if `` 1 1 d '' gives 2 or not ) 1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse ArcAdjust % resets original value of d 1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse % Adjust angle to give overlap. } def %%------------------ tvz/DG/hv (2004-05-10) end -------------------%% % /Rot { CP CP translate 3 -1 roll neg rotate NET } def % /RotBegin { tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if /TMatrix [ TMatrix CM ] cvx def /a ED a Rot /RAngle [ RAngle dup a add ] cvx def } def % /RotEnd { /TMatrix [ TMatrix setmatrix ] cvx def /RAngle [ RAngle pop ] cvx def } def % /PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def /PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def /PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def /Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } { h1 abs h sub dup s mul abs } ifelse } def /UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q { x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add exch } def /BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { Visible /IfVisible true def } if } { IfVisible { Invisible /IfVisible false def } if } ifelse } def /InitOL { /OLUnit [ 3000 3000 matrix defaultmatrix dtransform ] cvx def /Visible { CP OLUnit idtransform T moveto } def /Invisible { CP OLUnit neg exch neg exch idtransform T moveto } def /BOL { BeginOL } def /IfVisible true def } def end % /AlgParser { tx@AlgToPs begin AlgToPs end } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /tx@CoreAnalyzerDict 100 dict def tx@CoreAnalyzerDict begin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % PS ANALYZER FOR ALGEBRAIC EXPRESSION V1.12 % E->T|E+T % T->FS|T*FS % FS -> F | +FS | -FS % F->P|F^SF % P->(E)|literal % literal->number|var|var[E]|func(params) % params->E|E,param % number->TOBEFINISHED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% E expression, T term, SF signed factor, F factor, P power %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% parser %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% str %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% C->EE %% STR index -> STR index+lenExpr /AnalyzeCond { AnalyzeExpr ReadCondOp AnalyzeExpr EvalCondOp } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% analyze Expression List (separator , or | ) %% STR index -> STR index+lenExpr %% /AnalyzeListOfE { %% { NextNonBlankChar pop AnalyzeExpr%%dup Strlen eq { exit } if NextNonBlankChar %% NextNonBlankChar dup 0 eq { pop exit } if %% dup 44 ne 1 index 124 ne and { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } if %% pop NextNonBlankChar dup 0 eq { exit } if 124 ne { PROBLEMCONTACTBILLOU } if 1 add NextNonBlankChar 0 eq {toto} if } loop %% AnalyzeListOfEPostHook %% } def /AnalyzeListOfE { /NotFirst false def { NextNonBlankChar pop AnalyzeExpr NotFirst { EvalListOfExpr } { /NotFirst true def } ifelse dup Strlen eq { exit } if NextNonBlankChar dup 44 ne 1 index 124 ne and { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } if pop 1 add } loop AnalyzeListOfEPostHook } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% E->T|E+T %% STR index -> STR index+lenExpr /AnalyzeExpr { AnalyzePreHook AnalyzeTerm IsEndingExpr { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse } { { RollOp 1 add NextNonBlankChar pop AnalyzeTerm PreEvalHook EvalAddSub IsEndingExpr { pop exit } if } loop } ifelse AnalyzePostHook } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% T->FS|T*FS %% STR index /AnalyzeTerm { AnalyzePreHook AnalyzeSignedFactor IsEndingTerm { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse } { { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor PreEvalHook EvalMulDiv IsEndingTerm { pop exit } if} loop } ifelse AnalyzePostHook } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% FS -> F | +FS | -FS %% STR index /AnalyzeSignedFactor { AnalyzePreHook 2 copy get dup IsUnaryOp { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor EvalUnaryOp } { pop AnalyzeFactor } ifelse AnalyzePostHook } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% F->P|F^P %% STR index /AnalyzeFactor { AnalyzePreHook AnalyzePower IsEndingFactor { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse } { { RollOp 1 add NextNonBlankChar pop AnalyzePower PreEvalHook EvalPower IsEndingFactor { pop exit } if} loop } ifelse AnalyzePostHook } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% P->(E)|literal %% STR index /AnalyzePower { %% depending of first char either a number, or a literal 2 copy get dup 40 eq%%an open par { pop 1 add NextNonBlankChar pop AnalyzeExpr 1 add NextNonBlankChar pop } { AnalyzeLiteral } ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% STR index STR[index] -> STR index %/AnalyzeLiteral { IsNumber { EvalNumber } { EvalLiteral } ifelse } def /AnalyzeLiteral { dup IsUnaryOp exch IsNumber or { EvalNumber } { EvalLiteral } ifelse } def%%dr 09102006 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% recognize + or - %% chr -> T/F /IsUnaryOp { dup 43 eq exch 45 eq or } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% a number can contain only : 0123456789. %% chr -> T/F /IsNumber { dup 48 ge exch dup 57 le 3 -1 roll and exch 46 eq or } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% STR index -> STR index number %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)? %% STR index -> STR index' number /ReadNumber { exch dup 3 -1 roll dup 3 1 roll %%read mantissa { 1 add 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsNumber not { exit } if pop } loop dup 101 eq exch 69 eq or %%% there is a "e" or "E" -> read exponant { 1 add 2 copy get dup IsUnaryOp { pop 1 add 2 copy get } if { IsNumber not { exit } if 1 add 2 copy get } loop } if dup 4 1 roll 3 -1 roll exch 1 index sub getinterval } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% a number can contain only : 0123456789. %% chr -> T/F /IsCondOp { dup 30 eq exch dup 60 ge exch 62 le and or } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% STR index -> STR index number %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)? %% STR index -> STR index' number /ReadCondOp { NextNonBlankChar 1 index 4 1 roll { IsCondOp not { exit } if 1 add 2 copy get } loop 2 copy 5 -1 roll exch 1 index sub getinterval 3 1 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% a literal can contain only : 0123456789. %% chr -> T/F /IsLiteral {% dup 48 ge exch dup 57 le 3 -1 roll and exch dup 65 ge exch dup 90 le 3 -1 roll and 3 -1 roll or exch dup 97 ge exch 122 le and or } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% a literal can be of the form [a-zA-Z][a-zA-Z0-9]*\(\((Expression)\)|\(\[Expression\]\)\)? %% STR index -> literal STR index' nextchr /ReadLiteral { exch dup 3 -1 roll dup 3 1 roll %%read literal core { 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsLiteral not { exit } if pop 1 add } loop 4 1 roll dup 5 1 roll 3 -1 roll exch 1 index sub getinterval 4 1 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% expr is ended by end of str or a clpar %% STR index -> STR index STR[index] T/F /IsEndingExpr {% 2 copy dup Strlen eq %% if end of str is reached -> end ! { pop pop 0 true } %% ending chr -> clpar, comma, |, <, >, =, !, {get dup dup 41 eq exch dup 124 eq exch dup 93 eq exch dup 44 eq exch dup 30 eq exch dup 60 ge exch 62 le and or or or or or} ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% expr is ended by end of str or a +- %% STR index -> STR index STR[index] T/F /IsEndingTerm { IsEndingExpr { true } { dup dup 43 eq exch 45 eq or } ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% expr is ended by end of str or */ %% STR index -> STR index STR[index] T/F /IsEndingFactor { IsEndingTerm { true } { dup dup 42 eq exch 47 eq or } ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% expr is ended by end of str or ^ %% STR index -> STR index STR[index] T/F /IsEndingPower { IsEndingFactor { true } { dup 94 eq } ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% STR index -> STR index STR[index] /NextNonBlankChar { { dup Strlen eq { 0 exit } if 2 copy get dup neBlkChar { exit } if pop 1 add } loop } bind def /neBlkChar { dup 32 ne exch dup 10 ne exch 9 ne and and } bind def %%%%%%%%%%%%%%%%%%%%%%%% %% DEBUG /BRK {false} def /BRKtrue {/BRK true def} def /BRKStop {BRK {BRKtoto} if } def /BRKEvalStop {BRK exch if } def /BRKBRK2true {BRK {BRK2true} if } def /BRK2 {false} def /BRK2true {/BRK2 true def} def /BRK2Stop {BRK2 {BRK2toto} if } def/BRK {false} def end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /tx@AlgToPs 12 dict def tx@AlgToPs begin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% algExpr -> PSVector /AlgToPs { tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE pop pop EndingSequence end } def /EndingSequence { ExpressionVector aload length /end cvx exch 1 add array astore } def /InitParser { /ExpressionVector [ /tx@AddMathFunc cvx /begin cvx ] def dup length /Strlen exch def 0 } def /Strlen 0 def /EvalListOfExpr {} def% /EvalNumber {% ReadNumber cvr /ExpressionVector ExpressionVector aload length dup 3 add -1 roll cvx exch 1 add array astore def NextNonBlankChar pop } def /EvalAddSub {% /ExpressionVector ExpressionVector aload length dup 5 add -1 roll 43 eq { /add } { /sub } ifelse cvx exch 1 add array astore def } def /EvalMulDiv {% /ExpressionVector ExpressionVector aload length dup 5 add -1 roll 42 eq { /mul } { /div } ifelse cvx exch 1 add array astore def } def /EvalPower {% /ExpressionVector ExpressionVector aload length dup 5 add -1 roll pop /exp cvx exch 1 add array astore def } def /EvalLiteral {% ReadLiteral dup 40 eq%%% there is an open par -> function call { pop 2 index dup (Sum) eq { EvalSum } { dup (IfTE) eq { EvalCond } { dup (Derive) eq { pop EvalDerive } { pop 1 add NextNonBlankChar pop AnalyzeListOfE 2 index TrigoFunc /ExpressionVector ExpressionVector aload length dup 5 add -1 roll cvn cvx exch 1 add array astore def 1 add NextNonBlankChar pop } ifelse } ifelse} ifelse } { /ExpressionVector ExpressionVector aload length dup 6 add -1 roll cvn cvx exch 1 add array astore def dup 91 eq%%% there is an open bracket -> vector element { pop 1 add NextNonBlankChar pop AnalyzeExpr /ExpressionVector ExpressionVector aload length /cvi cvx exch /get cvx exch 2 add array astore def 1 add } { pop NextNonBlankChar pop } ifelse} ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% the derive function : Derive(n,f(x)) %% firstparindex lastparindex -> /EvalDerive { %% manage the function descripiton 1 add ReadNumber 3 1 roll NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if 1 add NextNonBlankChar pop 3 -1 roll cvi dup 0 eq { pop AnalyzeExpr 3 -1 roll pop 1 add } { 1 sub 3 1 roll (x) exch tx@Derive begin DeriveIndexed end 4 -1 roll { (x) tx@Derive begin Derive end } repeat ExpressionVector exch /ExpressionVector [] def AlgToPs aload length /ExpressionVector 1 index 3 add -1 roll aload length dup 3 add -1 roll /l2 exch def /l1 exch def l1 l2 add 1 add l2 neg roll l1 l2 add array astore def 3 -1 roll pop 1 add 1 index length /Strlen exch def } ifelse } def /EvalSum {% pop 1 add NextNonBlankChar pop %% read the variable name ReadLiteral pop NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if %% read the initial value 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if %% read the increment value 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if %% read the limit value 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if /ExpressionVector ExpressionVector aload length dup 7 add -3 roll 0 4 1 roll 5 -1 roll 4 add array astore def %% keep ExpressionVector for later and create a new one for internal Sum computation ExpressionVector 3 1 roll /ExpressionVector [ 6 -1 roll cvn /exch cvx /def cvx ] def 1 add NextNonBlankChar pop AnalyzeExpr %% add each term /ExpressionVector ExpressionVector aload length 1 add /add cvx exch array astore def /ExpressionVector 4 -1 roll aload length ExpressionVector cvx /for cvx 3 -1 roll 2 add array astore def 3 -1 roll pop 1 add } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Convert to radians if trigo function call %% (name) -> /TrigoFunc { dup (cos) eq 1 index (sin) eq or exch (tan) eq or { /ExpressionVector ExpressionVector aload length 3.14159265359 /div cvx 180 /mul cvx 5 -1 roll 4 add array astore def } if } def /EvalCond {% pop 1 add AnalyzeCond NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if ExpressionVector 3 1 roll /ExpressionVector [] def 1 add AnalyzeExpr ExpressionVector 3 1 roll /ExpressionVector [] def NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if 1 add AnalyzeExpr NextNonBlankChar 41 ne { ANALYZER_ERROR_missing_ending parenthesis_in_IfTE } if ExpressionVector /ExpressionVector 6 -1 roll aload length dup 6 add -1 roll cvx exch dup 4 add -1 roll cvx /ifelse cvx 3 -1 roll 3 add array astore def 1 add 3 -1 roll pop } def %% CondOp STR index /EvalCondOp {% 3 -1 roll dup (=) eq { /eq } {% dup (<) eq { /lt } {% dup (>) eq { /gt } {% dup (>=) eq { /ge } {% dup (<=) eq { /ge } {% dup (!=) eq { /ne } { ERROR_non_valid_conditional_operator } ifelse } ifelse } ifelse } ifelse } ifelse } ifelse cvx exch pop /ExpressionVector ExpressionVector aload length dup 3 add -1 roll exch 1 add array astore def } def /EvalUnaryOp { 3 -1 roll 45 eq { /ExpressionVector ExpressionVector aload length /neg cvx exch 1 add array astore def } if } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% H O O K S /AnalyzePreHook {} bind def /PreEvalHook {} bind def /AnalyzeListOfEPostHook {} bind def /AnalyzePostHook {} def /RollOp { 3 1 roll } bind def end%%%tx@CoreAnalyzerDict %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /tx@Derive 41 dict def tx@Derive begin %%increase ^^ for each function added %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% algExpr variable -> PSVector /Derive {% 10240 string 3 1 roll 0 3 1 roll /Variable exch def tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE end } def /Strlen 0 def /InitParser { dup length /Strlen exch def 0 } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% algExpr variable index -> PSVector /DeriveIndexed {% 3 1 roll 10240 string 3 1 roll 0 3 1 roll /Variable exch def tx@CoreAnalyzerDict begin InitParser pop 4 -1 roll AnalyzeExpr 4 -2 roll pop pop 4 -2 roll exch pop end } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (u,v)'=-(u',v') /EvalListOfExpr {% 4 2 roll 2 copy 9 -1 roll dup length 4 1 roll putinterval add AddPipe 2 copy 7 -1 roll dup length 4 1 roll putinterval add 6 -2 roll pop pop 2 copy pop 0 6 2 roll GetIntervalNewStr 5 1 roll 2 copy 0 exch getinterval 6 1 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (-u)'=-(u') /EvalUnaryOp { 4 -2 roll 4 index (0) eq { (0) StrConcat 7 -1 roll pop } { 7 -1 roll 45 eq { AddSub AddOpPar true } { false } ifelse 3 1 roll 5 index StrConcat 3 -1 roll { AddClPar } if } ifelse 2 copy pop 0 6 2 roll GetIntervalNewStr 7 -2 roll pop pop 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (number)'=0 /EvalNumber { ReadNumber (0) 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (u+v)'=u'+v' /EvalAddSub {% 7 index dup (0) eq { pop true }%% du=0 nothing added { dup length exch 5 index 5 index 3 -1 roll putinterval 4 -1 roll add 3 1 roll false } ifelse 5 index dup (0) eq { pop { (0) } { 4 -2 roll 2 copy pop 0 6 2 roll GetIntervalNewStr } ifelse }%%dv=0 { exch { 5 -2 roll 7 index 45 eq { AddSub } if false } %%nothing yet added { 5 -2 roll 7 index 43 eq%%something yet added { AddAdd false } { AddSub AddOpPar true } ifelse } ifelse 11 1 roll 3 -1 roll StrConcat 10 -1 roll { AddClPar } if 2 copy pop 0 6 2 roll GetIntervalNewStr } ifelse mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (u*v)' or (u/v)' /EvalMulDiv { 6 index 42 eq {EvalMul} {EvalDiv} ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (u*v)'=u'*v+u*v' /EvalMul {% 4 -2 roll 7 index dup (0) eq { pop false }%%du=0 { (1) eq%%du=1 { false } { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse 3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if true }%%du!=0 ifelse 5 1 roll 5 index (0) eq { 5 -1 roll not { (0) StrConcat } if }%%dv=0 { 5 -1 roll { AddAdd } if 4 index (1) eq { 8 index StrConcat } { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar } ifelse }%%dv!=0 ifelse 2 copy pop 0 6 2 roll GetIntervalNewStr mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (u/v)'=(u'*v-u*v')/v^2 /EvalDiv {% 4 -2 roll 4 index (0) eq%%dv=0 -> u'/v { 7 index (0) eq { (0) StrConcat } { AddOpPar 7 index StrConcat AddClPar AddDiv 5 index StrConcat } ifelse } { 7 index dup (0) eq { pop }%%du=0 { (1) eq%%du=1 { false } { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse 3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if}%%du!=0 ifelse AddSub 4 index (1) eq { 8 index StrConcat } { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar } ifelse %}%%dv!=0 2 copy GetIntervalNewStr 3 1 roll pop 0 AddOpPar 3 -1 roll StrConcat AddClPar AddDiv AddOpPar 5 index StrConcat AddClPar 2 copy (^2) putinterval 2 add } ifelse 2 copy pop 0 6 2 roll GetIntervalNewStr mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% str1 index str2 -> str1 index /StrConcat { dup length 4 2 roll 2 copy 6 -1 roll putinterval 3 -1 roll add } bind def /GetIntervalNewStr { 0 exch getinterval dup length string copy } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (u^v)'=(u^v)'=u'vu^(v-1)+v'u^(v)ln(u) /EvalPower {% 4 -2 roll 7 index (0) eq {%%if du=0 then (u^v)'=v'ln(u)u^v 4 index (0) eq { (0) StrConcat }%%if dv=0 then (u^v)'=0 { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if 8 index (e) ne { (ln\() StrConcat 8 index StrConcat (\)*) StrConcat } if AddOpPar 8 index StrConcat (\)^\() StrConcat 5 index StrConcat AddClPar } ifelse } {%%du!=0 4 index (0) eq {%%if dv=0 then (u^v)'=vu'u^(v-1) 5 index dup IsStrNumber { dup (0) eq { StrConcat } { dup dup (1) eq exch (1.0) eq or { StrConcat } { StrConcat 7 index dup (1) ne exch (1.0) ne and%%%dr 09102006 insert du if <> 1 { (*\() StrConcat 7 index StrConcat (\)) StrConcat } if%%%dr 09102006 (*\() StrConcat 8 index StrConcat (\)) StrConcat 5 index dup dup (2) eq exch (2.0) eq or { pop } { cvr 1 sub 20 string cvs 3 1 roll (^) StrConcat 3 -1 roll StrConcat } ifelse } ifelse } ifelse } { pop AddOpPar 5 index StrConcat (\)*\() StrConcat 8 index StrConcat (\)^\() StrConcat 5 index StrConcat (-1\)) StrConcat } ifelse } {%%if dv!=0 and du!=0 then (u^v)'=u'vu^(v-1)+v'u^(v)ln(u) 7 index (1) ne { AddOpPar 7 index StrConcat (\)*) StrConcat } if AddOpPar 5 index StrConcat (\)*\() StrConcat 8 index StrConcat (\)^\() StrConcat 5 index StrConcat (-1\)+\() StrConcat 4 index (1) ne { 4 index StrConcat (\)*\() StrConcat } if 8 index StrConcat (\)^\() StrConcat 5 index StrConcat (\)*ln\() StrConcat 8 index StrConcat AddClPar } ifelse } ifelse 2 copy pop 0 6 2 roll GetIntervalNewStr mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% str -> true/false /IsStrNumber {% true exch { dup 48 lt exch dup 57 gt 3 -1 roll or exch dup 46 ne%%. exch dup 43 ne%%+ exch 45 ne%%- and and and { pop false } if } forall } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% literal switch -> func call, vector, variables /EvalLiteral {% ReadLiteral dup 40 eq%%% there is an open par -> function call { pop (EvalFunc_ ) 9 4 index StrConcat 0 exch getinterval cvn cvx exec } { dup 91 eq%%% there is an open bracket -> vector element { ERROR_vector_not_yet_implemented } { pop EvalVariable } ifelse } ifelse } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% first last parpos Expr[first:parpos-1] -> /EvalVariable { 2 index Variable eq { (1) } { (0) } ifelse 4 -1 roll exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% (f(u))'=u'f'(u) /EvalFunc { 4 2 roll 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if (Eval ) 4 8 index StrConcat 0 exch getinterval cvn cvx exec 2 copy pop 0 6 2 roll GetIntervalNewStr mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Func derivative -> Eval /EvalFunc_sin {% PreCommonFunc { (cos\() StrConcat 5 index StrConcat AddClPar } if PostCommonFunc } def /EvalFunc_cos {% PreCommonFunc { (\(-sin\() StrConcat 5 index StrConcat (\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_tan {% PreCommonFunc { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/cos\() StrConcat 5 index StrConcat (\)^2) StrConcat } if PostCommonFunc } def /EvalFunc_asin {% PreCommonFunc { (1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_acos {% PreCommonFunc { (-1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_atg {% PreCommonFunc { (1/\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_ln {% PreCommonFunc { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\() StrConcat 5 index StrConcat AddClPar } if PostCommonFunc } def /EvalFunc_exp {% PreCommonFunc { (exp\() StrConcat 5 index StrConcat AddClPar } if PostCommonFunc } def /EvalFunc_sqrt {% PreCommonFunc { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\(2*sqrt\() StrConcat 5 index StrConcat (\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_Fact {% PreCommonFunc { ERROR_no_variable_expression_in_Fact } if PostCommonFunc } def /EvalFunc_sh {% PreCommonFunc { (ch\() StrConcat 5 index StrConcat AddClPar } if PostCommonFunc } def /EvalFunc_ch {% PreCommonFunc { (sh\() StrConcat 5 index StrConcat AddClPar } if PostCommonFunc } def /EvalFunc_th {% PreCommonFunc { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/ch\() StrConcat 5 index StrConcat (\)^2) StrConcat } if PostCommonFunc } def /EvalFunc_Argsh {% PreCommonFunc { (1/sqrt\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_Argch {% PreCommonFunc { (1/sqrt\(\() StrConcat 5 index StrConcat (\)^2-1\)\)) StrConcat } if PostCommonFunc } def /EvalFunc_Argth {% PreCommonFunc { (1/\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if PostCommonFunc } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /PreCommonFunc { 1 add NextNonBlankChar pop 3 -1 roll 5 1 roll AnalyzeExpr 1 add NextNonBlankChar pop 4 2 roll 4 index (0) eq { (0) StrConcat false } { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if true } ifelse } def /PostCommonFunc { 2 copy pop 0 6 2 roll GetIntervalNewStr mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def /EvalFunc_Derive {% 1 add ReadNumber cvi 1 add dup cvr log 1 add cvi string cvs 4 -1 roll pop 5 1 roll 1 add NextNonBlankChar pop AnalyzeExpr 1 add 4 -2 roll (Derive\() StrConcat 7 -1 roll StrConcat (,) StrConcat 6 -1 roll StrConcat AddClPar 2 copy pop 0 6 2 roll GetIntervalNewStr 6 -1 roll pop 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% literal switch -> func call, vector, variables /EvalFunc_Sum {% 1 add NextNonBlankChar pop %% read the variable name ReadLiteral pop 3 -1 roll pop NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if %% read the initial value 1 add NextNonBlankChar pop ReadNumber pop 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if %% read the increment value 1 add NextNonBlankChar pop ReadNumber pop 2 copy get 44 ne { ANALYZER_ERROR_missing_third_comma_in_Sum } if %% read the limit value 1 add NextNonBlankChar pop ReadNumber pop 2 copy get 44 ne { ANALYZER_ERROR_missing_fourth_comma_in_Sum } if 1 add NextNonBlankChar pop dup 6 1 roll 3 -1 roll pop AnalyzeExpr 1 add NextNonBlankChar pop 4 -2 roll 3 index 8 index dup 9 index exch sub getinterval StrConcat 4 index StrConcat AddClPar 2 copy pop 0 6 2 roll GetIntervalNewStr mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% literal switch -> func call, vector, variables /EvalFunc_IfTE {% 3 -1 roll pop 1 add NextNonBlankChar pop SkipCond NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if 1 add NextNonBlankChar pop dup 5 1 roll AnalyzeExpr NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if 1 add NextNonBlankChar pop AnalyzeExpr 1 add NextNonBlankChar pop 4 -2 roll 3 index 10 index dup 11 index exch sub getinterval StrConcat 6 index StrConcat (,) StrConcat 4 index StrConcat AddClPar 2 copy pop 0 6 2 roll GetIntervalNewStr mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% advance in str until a comma is found (no error detection!) %% str index -> str index' /SkipCond { { 1 add 2 copy get 44 eq {exit } if } loop } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Convert to radians if trigo function call %% (name) -> /TrigoFunc { dup (cos) eq 1 index (sin) eq or exch (tan) eq or { /ExpressionVector ExpressionVector aload length 3.14159265359 /div cvx 180 /mul cvx 5 -1 roll 4 add array astore def } if } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% No derivative for condition.... /EvalCondOp { 3 -1 roll pop } bind def /PutIntervalOneAdd {putinterval 1 add} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add open parenthesis in string at the given index %% str index -> str index+1 /AddOpPar {2 copy (\() PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add close parenthesis in string at the given index %% str index -> str index+1 /AddClPar {2 copy (\)) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add 0 in string at the given index %% str index -> str index+1 /AddZero {2 copy (0) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add open parenthesis in string at the given index %% str index -> str index+1 /AddMul {2 copy (*) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add open parenthesis in string at the given index %% str index -> str index+1 /AddDiv {2 copy (/) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add a plus sign in string at the given index %% str index -> str index+1 /AddAdd {2 copy (+) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add a minus sign in string at the given index %% str index -> str index+1 /AddSub {2 copy (-) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Add a pipe sign in string at the given index %% str index -> str index+1 /AddPipe {2 copy (|) PutIntervalOneAdd} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% H O O K S /AnalyzePreHook { dup 5 1 roll } bind def /PreEvalHook {} def /AnalyzePostHook { 7 -1 roll pop } bind def /AnalyzeListOfEPostHook { 6 -1 roll mark 6 1 roll cleartomark } bind def /RollOp { 5 1 roll } bind def end%%%tx@CoreAnalyzerDict /tx@AddMathFunc 12 dict def tx@AddMathFunc begin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% NEW FUNC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% function arcsine in radians asin(x)=atan(x/sqrt(1-x^2)) %% x -> theta /asin {% dup abs 1 gt { EQDFasinrangeerror } if dup dup dup mul 1 exch sub sqrt atan exch 0 lt { 360 sub } if 90 div 1.57079632680 mul } def %% function arccosine in radians acos(x)=atan(sqrt(1-x^2)/x) %% x -> theta /acos {% dup abs 1 gt { EQDFacosrangeerror } if dup dup mul 1 exch sub sqrt exch atan 90 div 1.57079632680 mul } def %% function arctangent in radians %% x -> theta /atg { 1 atan dup 90 gt { 360 sub } if 90 div 1.57079632680 mul } bind def %% HYPERBOLIC FUNCTIONS /sh { dup Ex exch neg Ex sub 2 div } def /ch { dup Ex exch neg Ex add 2 div } def /th { dup sh exch ch div } def /Argsh { dup dup mul 1 add sqrt add ln } def /Argch { dup dup mul 1 sub sqrt add ln } def /Argth { dup 1 add exch 1 exch sub div ln 2 div } def %% modified exponential funtion for 0 %% x n -> x^n /Exp { dup 0 eq { pop pop 1 } { exp } ifelse } bind def %% modified exponential funtion for 0 %% x -> e^x /Ex { 2.71828182846 exch exp } bind def %% %% factorial function %% n -> n! /Fact { 1 exch 2 exch 1 exch { mul } for } bind def /fact { Fact } bind def /PI 3.14159265358 def /e 2.71828182846 def end % END pstricks.pro %%EndProcSet %%BeginProcSet: pst-dots.pro 0 0 %! %% PostScript prologue for pstricks.tex. %% Version 2.00, Suggestion of 2006/12/19 %% For distribution, see pstricks.tex. %% %% Timothy Van Zandt %% %% Modified by Etienne Riga - Dec. 16, 1999 %% Modified by Herbert Voss (hv) - 2004/12/27 %% Modified by Etienne Riga - 2005/01/01 (er) %% to add /Diamond, /SolidDiamond and /BoldDiamond % 10 dict dup begin /FontType 3 def /FontMatrix [.001 0 0 .001 0 0] def /FontBBox [-571.5 -742.5 571.5 742.5] def % /FontBBox [-1000 -1000 1000 1000] def % See end of file in /BuildGlyph /Encoding 256 array def 0 1 255 {Encoding exch/.notdef put} for Encoding dup (b) 0 get /Bullet put dup (c) 0 get /Circle put dup (C) 0 get /BoldCircle put dup (u) 0 get /SolidTriangle put dup (t) 0 get /Triangle put dup (T) 0 get /BoldTriangle put dup (r) 0 get /SolidSquare put dup (s) 0 get /Square put dup (S) 0 get /BoldSquare put dup (q) 0 get /SolidPentagon put dup (p) 0 get /Pentagon put dup (P) 0 get /BoldPentagon put %%% dup (k) 0 get /Asterisk put dup (K) 0 get /BoldAsterisk put dup (J) 0 get /SolidAsterisk put dup (h) 0 get /Hexagon put dup (H) 0 get /BoldHexagon put dup (G) 0 get /SolidHexagon put dup (a) 0 get /Add put dup (A) 0 get /BoldAdd put dup (x) 0 get /Mul put dup (X) 0 get /BoldMul put dup (m) 0 get /Oplus put dup (M) 0 get /BOplus put dup (e) 0 get /SolidOplus put dup (n) 0 get /Otimes put dup (N) 0 get /BOtimes put dup (E) 0 get /SolidOtimes put dup (i) 0 get /Bar put dup (I) 0 get /BoldBar put dup (l) 0 get /SolidDiamond put dup (d) 0 get /Diamond put (D) 0 get /BoldDiamond put %%% /CharProcs 47 dict def CharProcs begin /CirclePath {0 0 500 0 360 arc closepath} def /Bullet {CirclePath fill} def /Circle {CirclePath .9 .9 scale CirclePath eofill} def /BoldCircle {CirclePath .8 .8 scale CirclePath eofill} def /TrianglePath {0 660 moveto -571.5 -330 lineto 571.5 -330 lineto closepath} def /SolidTriangle {TrianglePath fill} def /Triangle {TrianglePath .85 .85 scale TrianglePath eofill} def /BoldTriangle {TrianglePath .7 .7 scale TrianglePath eofill} def /SquarePath {-450 450 moveto 450 450 lineto 450 -450 lineto -450 -450 lineto closepath} def /SolidSquare {SquarePath fill} def /Square {SquarePath .89 .89 scale SquarePath eofill} def /BoldSquare {SquarePath .78 .78 scale SquarePath eofill} def /PentagonPath {-337.8 -465 moveto 337.8 -465 lineto 546.6 177.6 lineto 0 574.7 lineto -546.6 177.6 lineto closepath} def /SolidPentagon {PentagonPath fill} def /Pentagon {PentagonPath .89 .89 scale PentagonPath eofill} def /BoldPentagon {PentagonPath .78 .78 scale PentagonPath eofill} def %-------------- hv begin 2004/07/25 from: er 2003/03/24 /HexagonPath {0 550 moveto -476 275 lineto -476 -275 lineto 0 -550 lineto 476 -275 lineto 476 275 lineto closepath} def /SolidHexagon {HexagonPath fill} def /Hexagon {HexagonPath .89 .89 scale HexagonPath eofill} def /BoldHexagon {HexagonPath .79 .79 scale HexagonPath eofill} def /AsteriskPath {20 0 moveto 10 250 180 500 0 500 curveto -180 500 -10 250 -20 0 curveto closepath} def /Asterisk {AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath fill} def /Basterp {50 250 220 500 0 500 curveto -220 500 -50 250 -50 30 cos 100 mul curveto} def /BoldAsteriskPath {50 30 cos 100 mul moveto Basterp 60 rotate Basterp 60 rotate Basterp 60 rotate Basterp 60 rotate Basterp 60 rotate Basterp closepath} def /BoldAsterisk {BoldAsteriskPath fill} def /SolidAsterisk {CirclePath .9 .9 scale BoldAsteriskPath eofill} def /CrossPath {40 550 moveto -40 550 lineto -40 40 lineto -550 40 lineto -550 -40 lineto -40 -40 lineto -40 -550 lineto 40 -550 lineto 40 -40 lineto 550 -40 lineto 550 40 lineto 40 40 lineto closepath} def /BoldCrossPath {80 550 moveto -80 550 lineto -80 80 lineto -550 80 lineto -550 -80 lineto -80 -80 lineto -80 -550 lineto 80 -550 lineto 80 -80 lineto 550 -80 lineto 550 80 lineto 80 80 lineto closepath} def /Add {CrossPath fill} def /Mul {45 rotate CrossPath fill} def /BoldAdd {BoldCrossPath fill} def /BoldMul {45 rotate BoldCrossPath fill} def /Oplus {CirclePath .9 .9 scale CirclePath eofill .775 .775 scale CrossPath fill} def /SolidOplus {CirclePath .775 .775 scale BoldCrossPath eofill} def /BOplus {CirclePath .8 .8 scale CirclePath eofill .775 .775 scale BoldCrossPath fill} def /Otimes {CirclePath .9 .9 scale CirclePath eofill 45 rotate .775 .775 scale CrossPath fill} def /BOtimes {CirclePath .8 .8 scale CirclePath eofill 45 rotate .775 .775 scale BoldCrossPath fill } def /SolidOtimes {CirclePath 45 rotate .775 .775 scale BoldCrossPath eofill} def /BarPath {40 660 moveto -40 660 lineto -40 -660 lineto 40 -660 lineto closepath} def /Bar {BarPath fill} def /BoldBarPath {80 660 moveto -80 660 lineto -80 -660 lineto 80 -660 lineto closepath} def /BoldBar {BoldBarPath fill} def /DiamondPath {0 742.5 moveto -428.5 0 lineto 0 -742.5 lineto 428.5 0 lineto closepath} def /SolidDiamond {DiamondPath fill} def /Diamond {DiamondPath .865 .865 scale DiamondPath eofill} def /BoldDiamond {DiamondPath .73 .73 scale DiamondPath eofill} def %%% /.notdef { } def end /BuildGlyph { exch begin % Metrics 1 index get exec 0 0 0 % BBoxes 3 index get exec -1000 -1000 1000 1000 % -571.5 -742.5 571.5 742.5 setcachedevice CharProcs begin load exec end end } def /BuildChar { 1 index /Encoding get exch get 1 index /BuildGlyph get exec } bind def end /PSTricksDotFont exch definefont pop %%EndProcSet %%BeginProcSet: pst-node.pro 0 0 %! % PostScript prologue for pst-node.tex. % Version 97 patch 1, 97/05/09. % For distribution, see pstricks.tex. % /tx@NodeDict 400 dict def tx@NodeDict begin tx@Dict begin /T /translate load def end /NewNode { gsave /next ED dict dup 3 1 roll def exch { dup 3 1 roll def } if begin tx@Dict begin STV CP T exec end /NodeMtrx CM def next end grestore } def /InitPnode { /Y ED /X ED /NodePos { NodeSep Cos mul NodeSep Sin mul } def } def /InitCnode { /r ED /Y ED /X ED /NodePos { NodeSep r add dup Cos mul exch Sin mul } def } def /GetRnodePos { Cos 0 gt { /dx r NodeSep add def } { /dx l NodeSep sub def } ifelse Sin 0 gt { /dy u NodeSep add def } { /dy d NodeSep sub def } ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx dup Sin mul Cos Div } ifelse } def /InitRnode { /Y ED /X ED X sub /r ED /l X neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def /DiaNodePos { w h mul w Sin mul abs h Cos mul abs add Div NodeSep add dup Cos mul exch Sin mul } def /TriNodePos { Sin s lt { d NodeSep sub dup Cos mul Sin Div exch } { w h mul w Sin mul h Cos abs mul add Div NodeSep add dup Cos mul exch Sin mul } ifelse } def /InitTriNode { sub 2 div exch 2 div exch 2 copy T 2 copy 4 index index /d ED pop pop pop pop -90 mul rotate /NodeMtrx CM def /X 0 def /Y 0 def d sub abs neg /d ED d add /h ED 2 div h mul h d sub Div /w ED /s d w Atan sin def /NodePos { TriNodePos } def } def /OvalNodePos { /ww w NodeSep add def /hh h NodeSep add def Sin ww mul Cos hh mul Atan dup cos ww mul exch sin hh mul } def /GetCenter { begin X Y NodeMtrx transform CM itransform end } def /XYPos { dup sin exch cos Do /Cos ED /Sin ED /Dist ED Cos 0 gt { Dist Dist Sin mul Cos div } { Cos 0 lt { Dist neg Dist Sin mul Cos div neg } { 0 Dist Sin mul } ifelse } ifelse Do } def /GetEdge { dup 0 eq { pop begin 1 0 NodeMtrx dtransform CM idtransform exch atan sub dup sin /Sin ED cos /Cos ED /NodeSep ED NodePos NodeMtrx dtransform CM idtransform end } { 1 eq {{exch}} {{}} ifelse /Do ED pop XYPos } ifelse } def /AddOffset { 1 index 0 eq { pop pop } { 2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def /GetEdgeA { NodeSepA AngleA NodeA NodeSepTypeA GetEdge OffsetA AngleA AddOffset yA add /yA1 ED xA add /xA1 ED } def /GetEdgeB { NodeSepB AngleB NodeB NodeSepTypeB GetEdge OffsetB AngleB AddOffset yB add /yB1 ED xB add /xB1 ED } def /GetArmA { ArmTypeA 0 eq { /xA2 ArmA AngleA cos mul xA1 add def /yA2 ArmA AngleA sin mul yA1 add def } { ArmTypeA 1 eq {{exch}} {{}} ifelse /Do ED ArmA AngleA XYPos OffsetA AngleA AddOffset yA add /yA2 ED xA add /xA2 ED } ifelse } def /GetArmB { ArmTypeB 0 eq { /xB2 ArmB AngleB cos mul xB1 add def /yB2 ArmB AngleB sin mul yB1 add def } { ArmTypeB 1 eq {{exch}} {{}} ifelse /Do ED ArmB AngleB XYPos OffsetB AngleB AddOffset yB add /yB2 ED xB add /xB2 ED } ifelse } def /InitNC { /b ED /a ED /NodeSepTypeB ED /NodeSepTypeA ED /NodeSepB ED /NodeSepA ED /OffsetB ED /OffsetA ED tx@NodeDict a known tx@NodeDict b known and dup { /NodeA a load def /NodeB b load def NodeA GetCenter /yA ED /xA ED NodeB GetCenter /yB ED /xB ED } if } def /LPutLine { 4 copy 3 -1 roll sub neg 3 1 roll sub Atan /NAngle ED 1 t sub mul 3 1 roll 1 t sub mul 4 1 roll t mul add /Y ED t mul add /X ED } def /LPutLines { mark LPutVar counttomark 2 div 1 sub /n ED t floor dup n gt { pop n 1 sub /t 1 def } { dup t sub neg /t ED } ifelse cvi 2 mul { pop } repeat LPutLine cleartomark } def /BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED /t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3 mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul mul 2 bx t mul mul add cx add atan /NAngle ED /Y ED /X ED } def /HPosBegin { yB yA ge { /t 1 t sub def } if /Y yB yA sub t mul yA add def } def /HPosEnd { /X Y yyA sub yyB yyA sub Div xxB xxA sub mul xxA add def /NAngle yyB yyA sub xxB xxA sub Atan def } def /HPutLine { HPosBegin /yyA ED /xxA ED /yyB ED /xxB ED HPosEnd } def /HPutLines { HPosBegin yB yA ge { /check { le } def } { /check { ge } def } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { dup Y check { exit } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark HPosEnd } def /VPosBegin { xB xA lt { /t 1 t sub def } if /X xB xA sub t mul xA add def } def /VPosEnd { /Y X xxA sub xxB xxA sub Div yyB yyA sub mul yyA add def /NAngle yyB yyA sub xxB xxA sub Atan def } def /VPutLine { VPosBegin /yyA ED /xxA ED /yyB ED /xxB ED VPosEnd } def /VPutLines { VPosBegin xB xA ge { /check { le } def } { /check { ge } def } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { 1 index X check { exit } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark VPosEnd } def /HPutCurve { gsave newpath /SaveLPutVar /LPutVar load def LPutVar 8 -2 roll moveto curveto flattenpath /LPutVar [ {} {} {} {} pathforall ] cvx def grestore exec /LPutVar /SaveLPutVar load def } def /NCCoor { /AngleA yB yA sub xB xA sub Atan def /AngleB AngleA 180 add def GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 xA1 yA1 ] cvx def /LPutPos { LPutVar LPutLine } def /HPutPos { LPutVar HPutLine } def /VPutPos { LPutVar VPutLine } def LPutVar } def /NCLine { NCCoor tx@Dict begin ArrowA CP 4 2 roll ArrowB lineto pop pop end } def /NCLines { false NArray n 0 eq { NCLine } { 2 copy yA sub exch xA sub Atan /AngleA ED n 2 mul dup index exch index yB sub exch xB sub Atan /AngleB ED GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 n 2 mul 4 add 4 roll xA1 yA1 ] cvx def mark LPutVar tx@Dict begin false Line end /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } ifelse } def /NCCurve { GetEdgeA GetEdgeB xA1 xB1 sub yA1 yB1 sub Pyth 2 div dup 3 -1 roll mul /ArmA ED mul /ArmB ED /ArmTypeA 0 def /ArmTypeB 0 def GetArmA GetArmB xA2 yA2 xA1 yA1 tx@Dict begin ArrowA end xB2 yB2 xB1 yB1 tx@Dict begin ArrowB end curveto /LPutVar [ xA1 yA1 xA2 yA2 xB2 yB2 xB1 yB1 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def /HPutPos { { HPutLines } HPutCurve } def /VPutPos { { VPutLines } HPutCurve } def } def /NCAngles { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate def xA2 yA2 mtrx transform pop xB2 yB2 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 x0 y0 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA2 yA2 xA1 yA1 ] cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def /NCAngle { GetEdgeA GetEdgeB GetArmB /mtrx AngleA matrix rotate def xB2 yB2 mtrx itransform pop xA1 yA1 mtrx itransform exch pop mtrx transform /y0 ED /x0 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 x0 y0 xA1 yA1 tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA1 yA1 ] cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def /NCBar { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate def xA2 yA2 mtrx itransform pop xB2 yB2 mtrx itransform pop sub dup 0 mtrx transform 3 -1 roll 0 gt { /yB2 exch yB2 add def /xB2 exch xB2 add def } { /yA2 exch neg yA2 add def /xA2 exch neg xA2 add def } ifelse mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def /NCDiag { GetEdgeA GetEdgeB GetArmA GetArmB mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def /NCDiagg { GetEdgeA GetArmA yB yA2 sub xB xA2 sub Atan 180 add /AngleB ED GetEdgeB mark xB1 yB1 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end /LPutVar [ xB1 yB1 xA2 yA2 xA1 yA1 ] cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def /NCLoop { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate def xA2 yA2 mtrx transform loopsize add /yA3 ED /xA3 ED /xB3 xB2 yB2 mtrx transform pop def xB3 yA3 mtrx itransform /yB3 ED /xB3 ED xA3 yA3 mtrx itransform /yA3 ED /xA3 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 xB3 yB3 xA3 yA3 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 xB3 yB3 xA3 yA3 xA2 yA2 xA1 yA1 ] cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def } def % DG/SR modification begin - May 9, 1997 - Patch 1 %/NCCircle { 0 0 NodesepA nodeA \tx@GetEdge pop xA sub 2 div dup 2 exp r %r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add %exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360 %mul add dup 5 1 roll 90 sub \tx@PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED /NCCircle { NodeSepA 0 NodeA 0 GetEdge pop 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360 mul add dup 5 1 roll 90 sub PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED % DG/SR modification end } def /HPutPos { LPutPos } def /VPutPos { LPutPos } def r AngleA 90 sub a add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c 57.2957 r Div def /y ED /x ED } def /NCBox { /d ED /h ED /AngleB yB yA sub xB xA sub Atan def /AngleA AngleB 180 add def GetEdgeA GetEdgeB /dx d AngleB sin mul def /dy d AngleB cos mul neg def /hx h AngleB sin mul neg def /hy h AngleB cos mul def /LPutVar [ xA1 hx add yA1 hy add xB1 hx add yB1 hy add xB1 dx add yB1 dy add xA1 dx add yA1 dy add ] cvx def /LPutPos { LPutLines } def /HPutPos { xB yB xA yA LPutLine } def /VPutPos { HPutPos } def mark LPutVar tx@Dict begin false Polygon end } def /NCArcBox { /l ED neg /d ED /h ED /a ED /AngleA yB yA sub xB xA sub Atan def /AngleB AngleA 180 add def /tA AngleA a sub 90 add def /tB tA a 2 mul add def /r xB xA sub tA cos tB cos sub Div dup 0 eq { pop 1 } if def /x0 xA r tA cos mul add def /y0 yA r tA sin mul add def /c 57.2958 r div def /AngleA AngleA a sub 180 add def /AngleB AngleB a add 180 add def GetEdgeA GetEdgeB /AngleA tA 180 add yA yA1 sub xA xA1 sub Pyth c mul sub def /AngleB tB 180 add yB yB1 sub xB xB1 sub Pyth c mul add def l 0 eq { x0 y0 r h add AngleA AngleB arc x0 y0 r d add AngleB AngleA arcn } { x0 y0 translate /tA AngleA l c mul add def /tB AngleB l c mul sub def 0 0 r h add tA tB arc r h add AngleB PtoC r d add AngleB PtoC 2 copy 6 2 roll l arcto 4 { pop } repeat r d add tB PtoC l arcto 4 { pop } repeat 0 0 r d add tB tA arcn r d add AngleA PtoC r h add AngleA PtoC 2 copy 6 2 roll l arcto 4 { pop } repeat r h add tA PtoC l arcto 4 { pop } repeat } ifelse closepath /LPutVar [ x0 y0 r AngleA AngleB h d ] cvx def /LPutPos { LPutVar /d ED /h ED /AngleB ED /AngleA ED /r ED /y0 ED /x0 ED t 1 le { r h add AngleA 1 t sub mul AngleB t mul add dup 90 add /NAngle ED PtoC } { t 2 lt { /NAngle AngleB 180 add def r 2 t sub h mul t 1 sub d mul add add AngleB PtoC } { t 3 lt { r d add AngleB 3 t sub mul AngleA 2 t sub mul add dup 90 sub /NAngle ED PtoC } { /NAngle AngleA 180 add def r 4 t sub d mul t 3 sub h mul add add AngleA PtoC } ifelse } ifelse } ifelse y0 add /Y ED x0 add /X ED } def /HPutPos { LPutPos } def /VPutPos { LPutPos } def } def /Tfan { /AngleA yB yA sub xB xA sub Atan def GetEdgeA w xA1 xB sub yA1 yB sub Pyth Pyth w Div CLW 2 div mul 2 div dup AngleA sin mul yA1 add /yA1 ED AngleA cos mul xA1 add /xA1 ED /LPutVar [ xA1 yA1 m { xB w add yB xB w sub yB } { xB yB w sub xB yB w add } ifelse xA1 yA1 ] cvx def /LPutPos { LPutLines } def /VPutPos@ { LPutVar flag { 8 4 roll pop pop pop pop } { pop pop pop pop 4 2 roll } ifelse } def /VPutPos { VPutPos@ VPutLine } def /HPutPos { VPutPos@ HPutLine } def mark LPutVar tx@Dict begin /ArrowA { moveto } def /ArrowB { } def false Line closepath end } def /LPutCoor { NAngle tx@Dict begin /NAngle ED end gsave CM STV CP Y sub neg exch X sub neg exch moveto setmatrix CP grestore } def /LPut { tx@NodeDict /LPutPos known { LPutPos } { CP /Y ED /X ED /NAngle 0 def } ifelse LPutCoor } def /HPutAdjust { Sin Cos mul 0 eq { 0 } { d Cos mul Sin div flag not { neg } if h Cos mul Sin div flag { neg } if 2 copy gt { pop } { exch pop } ifelse } ifelse s add flag { r add neg } { l add } ifelse X add /X ED } def /VPutAdjust { Sin Cos mul 0 eq { 0 } { l Sin mul Cos div flag { neg } if r Sin mul Cos div flag not { neg } if 2 copy gt { pop } { exch pop } ifelse } ifelse s add flag { d add } { h add neg } ifelse Y add /Y ED } def end % END pst-node.pro %%EndProcSet %%BeginProcSet: solides.pro 0 0 %! % PostScript prologue for pst-solides3d.tex. % Version 3.05, 2008/03/21 % %% COPYRIGHT 2008 by Jean-Paul Vignault, Manuel Luque %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN %% archives in directory macros/latex/base/lppl.txt. % /SolidesDict 100 dict def /SolidesbisDict 100 dict def SolidesDict begin %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% les variables globales gerees par PSTricks %% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% les lignes dessous sont a decommenter si l on veut utiliser le %% %% fichier solides.pro independamment du package PSTricks %% /Dobs 20 def %% /THETA 20 def %% /PHI 50 def %% /Decran 30 def %% /XpointVue {Dobs Cos1Cos2 mul} def %% /YpointVue {Dobs Sin1Cos2 mul} def %% /ZpointVue {Dobs Sin2 mul} def %% /xunit 28.14 def %% /solidhollow false def %% /solidbiface false def %% /xunit 28.45 def %% /tracelignedeniveau? true def %% /hauteurlignedeniveau 1 def %% /couleurlignedeniveau {rouge} def %% /linewidthlignedeniveau 4 def %% /solidgrid true def /aretescachees true def /defaultsolidmode 2 def /activationgestioncouleurs true def /fillstyle {} def /startest false def /cm {} def /cm_1 {} def /yunit {xunit} def /angle_repere 90 def /hadjust 2.5 def /vadjust 2.5 def /pointilles { [6.25 3.75] 1.25 setdash } def /stockcurrentcpath {} def /newarrowpath {} def /chaine 15 string def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% choix d une fonte accentuee pour le .ps %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /ReEncode { exch findfont dup length dict begin { 1 index /FID eq {pop pop} {def} ifelse }forall /Encoding ISOLatin1Encoding def currentdict end definefont pop }bind def /Font /Times-Roman /ISOfont ReEncode /ISOfont def %Font findfont 10 scalefont setfont %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% extrait de color.pro pour pouvoir recuperer ses couleurs %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /GreenYellow{0.15 0 0.69 0 setcmykcolor}def /Yellow{0 0 1 0 setcmykcolor}def /Goldenrod{0 0.10 0.84 0 setcmykcolor}def /Dandelion{0 0.29 0.84 0 setcmykcolor}def /Apricot{0 0.32 0.52 0 setcmykcolor}def /Peach{0 0.50 0.70 0 setcmykcolor}def /Melon{0 0.46 0.50 0 setcmykcolor}def /YellowOrange{0 0.42 1 0 setcmykcolor}def /Orange{0 0.61 0.87 0 setcmykcolor}def /BurntOrange{0 0.51 1 0 setcmykcolor}def /Bittersweet{0 0.75 1 0.24 setcmykcolor}def /RedOrange{0 0.77 0.87 0 setcmykcolor}def /Mahogany{0 0.85 0.87 0.35 setcmykcolor}def /Maroon{0 0.87 0.68 0.32 setcmykcolor}def /BrickRed{0 0.89 0.94 0.28 setcmykcolor}def /Red{0 1 1 0 setcmykcolor}def /OrangeRed{0 1 0.50 0 setcmykcolor}def /RubineRed{0 1 0.13 0 setcmykcolor}def /WildStrawberry{0 0.96 0.39 0 setcmykcolor}def /Salmon{0 0.53 0.38 0 setcmykcolor}def /CarnationPink{0 0.63 0 0 setcmykcolor}def /Magenta{0 1 0 0 setcmykcolor}def /VioletRed{0 0.81 0 0 setcmykcolor}def /Rhodamine{0 0.82 0 0 setcmykcolor}def /Mulberry{0.34 0.90 0 0.02 setcmykcolor}def /RedViolet{0.07 0.90 0 0.34 setcmykcolor}def /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}def /Lavender{0 0.48 0 0 setcmykcolor}def /Thistle{0.12 0.59 0 0 setcmykcolor}def /Orchid{0.32 0.64 0 0 setcmykcolor}def /DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}def /Purple{0.45 0.86 0 0 setcmykcolor}def /Plum{0.50 1 0 0 setcmykcolor}def /Violet{0.79 0.88 0 0 setcmykcolor}def /RoyalPurple{0.75 0.90 0 0 setcmykcolor}def /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}def /Periwinkle{0.57 0.55 0 0 setcmykcolor}def /CadetBlue{0.62 0.57 0.23 0 setcmykcolor}def /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}def /MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}def /NavyBlue{0.94 0.54 0 0 setcmykcolor}def /RoyalBlue{1 0.50 0 0 setcmykcolor}def /Blue{1 1 0 0 setcmykcolor}def /Cerulean{0.94 0.11 0 0 setcmykcolor}def /Cyan{1 0 0 0 setcmykcolor}def /ProcessBlue{0.96 0 0 0 setcmykcolor}def /SkyBlue{0.62 0 0.12 0 setcmykcolor}def /Turquoise{0.85 0 0.20 0 setcmykcolor}def /TealBlue{0.86 0 0.34 0.02 setcmykcolor}def /Aquamarine{0.82 0 0.30 0 setcmykcolor}def /BlueGreen{0.85 0 0.33 0 setcmykcolor}def /Emerald{1 0 0.50 0 setcmykcolor}def /JungleGreen{0.99 0 0.52 0 setcmykcolor}def /SeaGreen{0.69 0 0.50 0 setcmykcolor}def /Green{1 0 1 0 setcmykcolor}def /ForestGreen{0.91 0 0.88 0.12 setcmykcolor}def /PineGreen{0.92 0 0.59 0.25 setcmykcolor}def /LimeGreen{0.50 0 1 0 setcmykcolor}def /YellowGreen{0.44 0 0.74 0 setcmykcolor}def /SpringGreen{0.26 0 0.76 0 setcmykcolor}def /OliveGreen{0.64 0 0.95 0.40 setcmykcolor}def /RawSienna{0 0.72 1 0.45 setcmykcolor}def /Sepia{0 0.83 1 0.70 setcmykcolor}def /Brown{0 0.81 1 0.60 setcmykcolor}def /Tan{0.14 0.42 0.56 0 setcmykcolor}def /Gray{0 0 0 0.50 setcmykcolor}def /Black{0 0 0 1 setcmykcolor}def /White{0 0 0 0 setcmykcolor}def %% fin de l extrait color.pro %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% autres couleurs %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /bleu {0 0 1 setrgbcolor} def /rouge {1 0 0 setrgbcolor} def /vert {0 .5 0 setrgbcolor} def /gris {.4 .4 .4 setrgbcolor} def /jaune {1 1 0 setrgbcolor} def /noir {0 0 0 setrgbcolor} def /blanc {1 1 1 setrgbcolor} def /orange {1 .65 0 setrgbcolor} def /rose {1 .01 .58 setrgbcolor} def /cyan {1 0 0 0 setcmykcolor} def /magenta {0 1 0 0 setcmykcolor} def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% definition du point de vue %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% pour la 3D conventionnelle %% Dony : graphisme scientifique : page 187 %% Editeur : Masson %% calcul des coefficients de la matrice %% de transformation /Sin1 {THETA sin} def /Sin2 {PHI sin} def /Cos1 {THETA cos} def /Cos2 {PHI cos} def /Cos1Sin2 {Cos1 Sin2 mul} def /Sin1Sin2 {Sin1 Sin2 mul} def /Cos1Cos2 {Cos1 Cos2 mul} def /Sin1Cos2 {Sin1 Cos2 mul} def /3dto2d { 6 dict begin /Zcote exch def /Yordonnee exch def /Xabscisse exch def /xObservateur Xabscisse Sin1 mul neg Yordonnee Cos1 mul add def /yObservateur Xabscisse Cos1Sin2 mul neg Yordonnee Sin1Sin2 mul sub Zcote Cos2 mul add def /zObservateur Xabscisse neg Cos1Cos2 mul Yordonnee Sin1Cos2 mul sub Zcote Sin2 mul sub Dobs add def %% maintenant on depose les resultats sur la pile Decran xObservateur mul zObservateur div cm Decran yObservateur mul zObservateur div cm end } def /getpointVue { XpointVue YpointVue ZpointVue } def /GetCamPos { getpointVue } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% jps modifie pour PSTricks %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /solid {continu} def /dashed {pointilles} def %%% les 3 procedures utilisees pour transformer les depots de AlgToPs en nombres /pstrickactionR3 { 3 dict begin /len@3 exch def /len@2 exch def /len@1 exch def len@1 exec len@2 exec len@3 exec end } def /pstrickactionR2 { exec exch exec exch } def /pstrickactionR { exec } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% geometrie basique %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% syntaxe~: [x1 y1 ... xn yn] ligne /ligne { gsave newpath dup 0 getp smoveto ligne_ starfill stroke grestore } def %% syntaxe~: [x1 y1 ... xn yn] ligne_ /ligne_ { reversep aload length 2 idiv { slineto } repeat } def %% syntaxe~: [x1 y1 ... xn yn] polygone /polygone* { 1 dict begin /startest {true} def polygone end } def /polygone { gsave newpath aload length 2 idiv 3 copy pop smoveto { slineto } repeat closepath starfill currentlinewidth 0 eq {} {stroke} ifelse grestore } def %% syntaxe : x y point /point { gsave 1 setlinecap newpath smoveto 0 0 rlineto 5 setlinewidth stroke grestore } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% %%%% insertion librairie jps %%%% %%%% %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% le repere jps %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### AAAopacity ### %% les parametres pour la gestion de la transparence /setstrokeopacity { /strokeopacity exch def } def /setfillopacity { /fillopacity exch def } def %% d apres un code de Jean-Michel Sarlat %% http://melusine.eu.org/syracuse/swf/pdf2swf/setdash/ %% Mise en reserve de la procedure stroke originelle. /sysstroke {systemdict /stroke get exec} def /sysfill {systemdict /fill get exec} def % Mise en place de la nouvelle procedure /stroke { /strokeopacity where { /strokeopacity get } { 1 } ifelse .setopacityalpha sysstroke } def /fill { /fillopacity where { /fillopacity get } { 1 } ifelse .setopacityalpha sysfill } def %%%%% ### AAAscale ### %%%%%%%%%%%%%%%% les deplacements a l echelle %%%%%%%%%%%%%%%%%%% /v@ct_I {xunit 0} def /v@ct_J {angle_repere cos yunit mul angle_repere sin yunit mul} def /xscale {} def /yscale {} def /xscale-1 {} def /yscale-1 {} def /gtransform {} def /gtransform-1 {} def /jtoppoint { 2 dict begin gtransform /y exch yscale def /x exch xscale def v@ct_I x mulv v@ct_J y mulv addv end } def /rptojpoint { xtranslate ytranslate 3 1 roll %% xA yB yA xB 4 1 roll %% xB xA yB yA sub neg 3 1 roll %% yB-yA xB xA sub neg exch ptojpoint } def /rptoppoint { xtranslate ytranslate 3 1 roll %% xA yB yA xB 4 1 roll %% xB xA yB yA sub neg 3 1 roll %% yB-yA xB xA sub neg exch } def /ptojpoint { 4 dict begin /Y exch yscale-1 def /X exch xscale-1 def /y Y yunit angle_repere sin mul div def /x X y yunit mul angle_repere cos mul sub xunit div def x y gtransform-1 end } def /smoveto { jtoppoint moveto } def /srmoveto { jtoppoint rmoveto } def /slineto { jtoppoint lineto } def /srlineto { jtoppoint rlineto } def /stranslate { jtoppoint translate } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% les tests %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### isbool ### %% syntaxe : any isbool --> booleen /isbool { type (booleantype) cvn eq } def %%%%% ### isarray ### %% syntaxe : any isarray --> booleen /isarray { type (arraytype) cvn eq } def %%%%% ### isstring ### %% syntaxe : any isstring --> booleen /isstring { type (stringtype) cvn eq } def %%%%% ### isinteger ### %% syntaxe : any isinteger --> booleen /isinteger { type (integertype) cvn eq } def %%%%% ### isnum ### %% syntaxe : any isnum --> booleen /isnum { dup isreal exch isinteger or } def %%%%% ### isreal ### %% syntaxe : any isreal --> booleen /isreal { type (realtype) cvn eq } def %%%%% ### eq ### %% syntaxe : A B eqp3d --> booleen = true si les points A et B sont identiques /eqp3d { %% x1 y1 z1 x2 y2 z2 4 -1 roll %% x1 y1 x2 y2 z2 z1 eq { %% x1 y1 x2 y2 eqp } { pop pop pop pop false } ifelse } def %% syntaxe : A B eqp --> booleen = true si les points A et B sont identiques /eqp { 3 -1 roll eq { eq {true} {false} ifelse } {pop pop false} ifelse } def %% syntaxe : z z' eqc --> true si z = z', false sinon /eqc { eqp } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% conversions de types %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### astr2str ### %% syntaxe : array str astr2str --> str %% convertit le contenu de array en chaines de caracteres puis les %% concatene avec str, en inserant un caractere "space" apres chaque %% element du tableau array /astr2str { 5 dict begin /str exch def /table exch def /n table length def n 0 eq { str } { table 0 n 1 sub getinterval table n 1 sub get ( ) cvs ( ) append str append astr2str } ifelse end } def %%%%% ### numstr2array ### %% syntaxe : str numstr2array -> array %% ou str est une chaine de nombres entiers separes par des espaces %% et array est constitue des elements numeriques entiers de string. %% exemple : %% (0 12 4 54) --> [0 12 4 54] /numstr2array { 3 dict begin /str exch def /n str length def /j -1 def [ 0 1 n 1 sub { /i exch def /j j 1 add store str i get dup 32 eq { %% c est un espace /j -1 store pop } { j 1 ge { exch 10 mul 48 sub add } { 48 sub } ifelse } ifelse } for ] end } def %% syntaxe : array numstr2array -> array /arraynumstr2arrayarray { {numstr2array} apply } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% macros de projection %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### projtext ### /initpr@jtext { 5 dict begin dup isbool { /mybool exch def } { /mybool true def } ifelse dup isarray { %% c est un planprojpath /type_plan_proj true def /table exch def /z0 exch def /y0 exch def /x0 exch def 0 0 } { %% c est un solidprojpath /type_plan_proj false def %% y a-t-il un str2 dup isstring { /str2 exch def } { /str2 {} def } ifelse %% y a-t-il un alpha 2 copy pop issolid { /alpha 0 def } { /alpha exch def } ifelse /i exch def /solid exch def 0 0 } ifelse } def /closepr@jtext { type_plan_proj { x0 y0 z0 table mybool projpath } { solid i alpha str2 mybool projpath } ifelse fill stroke end } def %% syntaxe : str x0 y0 z0 [normal_vect] ultextp3d --> - %% syntaxe : str x0 y0 z0 [normal_vect] bool ultextp3d --> - %% syntaxe : str1 solid i str2 ultextp3d --> - %% syntaxe : str1 solid i str2 bool ultextp3d --> - %% syntaxe : str1 solid i alpha str2 bool ultextp3d --> - /ultextp3d {initpr@jtext ultext_ closepr@jtext} def /cltextp3d {initpr@jtext cltext_ closepr@jtext} def /bltextp3d {initpr@jtext bltext_ closepr@jtext} def /dltextp3d {initpr@jtext bltext_ closepr@jtext} def /ubtextp3d {initpr@jtext ubtext_ closepr@jtext} def /cbtextp3d {initpr@jtext cbtext_ closepr@jtext} def /bbtextp3d {initpr@jtext bbtext_ closepr@jtext} def /dbtextp3d {initpr@jtext bbtext_ closepr@jtext} def /uctextp3d {initpr@jtext uctext_ closepr@jtext} def /cctextp3d {initpr@jtext cctext_ closepr@jtext} def /bctextp3d {initpr@jtext bctext_ closepr@jtext} def /dctextp3d {initpr@jtext bctext_ closepr@jtext} def /urtextp3d {initpr@jtext urtext_ closepr@jtext} def /crtextp3d {initpr@jtext crtext_ closepr@jtext} def /brtextp3d {initpr@jtext brtext_ closepr@jtext} def /drtextp3d {initpr@jtext brtext_ closepr@jtext} def %%%%% ### currentppathtransform ### %% syntaxe : {f} currentppathtransform --> applique la transformation f %% au chemin courant /currentppathtransform { 6 dict begin /warp exch def %% pour remplacer 'move' /warpmove{ 2 index { newpath } if warp moveto pop false } def %% pour remplacer 'lineto' /warpline { warp lineto } bind def %% pour remplacer 'curveto' /warpcurve { 6 2 roll warp 6 2 roll warp 6 2 roll warp curveto } bind def true { warpmove } { warpline } { warpcurve } { closepath } pathforall pop end } def %% syntaxe : {f} currentpathtransform --> applique la transformation f %% au chemin courant /currentpathtransform { 7 dict begin /transform exch def /warp {ptojpoint transform} def %% pour remplacer 'move' /warpmove{ 2 index { newpath } if warp smoveto pop false } def %% pour remplacer 'lineto' /warpline { warp slineto } bind def %% pour remplacer 'curveto' /warpcurve { 6 2 roll warp 6 2 roll warp 6 2 roll warp scurveto } bind def true { warpmove } { warpline } { warpcurve } { closepath } pathforall pop end } def %%%%% ### normalvect_to_orthobase ### %% syntaxe : [normal_vect] normalvect_to_orthobase %% --> imI imJ imK /normalvect_to_orthobase { 4 dict begin dup length 3 eq { aload pop normalize3d /normal_vect defpoint3d normal_vect -1 0 0 eqp3d { /imageI {0 -1 0} def /imageK {-1 0 0} def /imageJ {0 0 1} def } { %% on calcule l image de la base (I,J,K) /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def /imageK {normal_vect} def /imageI {imageJ imageK vectprod3d} def 1 0 0 imageK angle3d 0 eq { 0 1 0 normal_vect vectprod3d /imageI defpoint3d /imageJ {0 1 0} def normal_vect /imageK defpoint3d } if } ifelse } { dup length 6 eq { aload pop normalize3d /imageK defpoint3d normalize3d /imageI defpoint3d imageK imageI vectprod3d /imageJ defpoint3d } { dup length 7 eq { aload pop /alpha exch 2 div def normalize3d /imageK defpoint3d normalize3d /imageI defpoint3d imageK imageI vectprod3d /imageJ defpoint3d %% et ensuite, on fait tourner la base autour de imageK imageI alpha cos mulv3d imageJ alpha sin mulv3d addv3d imageI alpha sin neg mulv3d imageJ alpha cos mulv3d addv3d /imageJ defpoint3d /imageI defpoint3d } { %% length = 4 aload pop /alpha exch def normalize3d /normal_vect defpoint3d normal_vect -1 0 0 eqp3d { /imageI {0 -1 0} def /imageK {-1 0 0} def /imageJ {0 0 1} def } { %% on calcule l image de la base (I,J,K) /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def /imageK {normal_vect} def /imageI {imageJ imageK vectprod3d} def 1 0 0 imageK angle3d 0 eq { 0 1 0 normal_vect vectprod3d /imageI defpoint3d /imageJ {0 1 0} def normal_vect /imageK defpoint3d } if } ifelse } ifelse %% et ensuite, on fait tourner la base autour de imageK imageI alpha cos mulv3d imageJ alpha sin mulv3d addv3d imageI alpha sin neg mulv3d imageJ alpha cos mulv3d addv3d /imageJ defpoint3d /imageI defpoint3d } ifelse } ifelse imageI imageJ imageK end } def %%%%% ### projpath ### %% syntaxe : x y z [normal] projpath --> planprojpath %% syntaxe : x y z [normal] bool projpath --> planprojpath %% syntaxe : solid i projpath --> solidprojpath %% syntaxe : solid i bool projpath --> solidprojpath %% syntaxe : solid i str bool projpath --> solidprojpath %% syntaxe : solid i alpha str bool projpath --> solidprojpath /projpath { 2 dict begin dup isbool { /mybool exch def } { /mybool true def } ifelse dup isarray { mybool planprojpath } { mybool solidprojpath } ifelse end } def %% syntaxe : solid i str bool solidprojpath --> - %% ou %% syntaxe : solid i alpha str bool solidprojpath --> - %% projette le chemin courant sur la face i du solide, apres %% eventuellement une rotation d angle alpha autour de la normale %% bool : pour savoir si on tient compte de la visibilite /solidprojpath { 5 dict begin /visibility exch def dup isstring { /option exch def } if 2 copy pop issolid { /alpha 0 def } { /alpha exch def } ifelse /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidprojpath) == } if /n solid solidnombrefaces def i n 1 sub le { visibility not solid i solidfacevisible? or { currentdict /option known { option cvx exec } { solid i solidcentreface } ifelse [ solid 0 i solidgetsommetface solid 1 i solidgetsommetface vecteur3d normalize3d solid i solidnormaleface alpha ] false planprojpath } { newpath 0 0 smoveto } ifelse } { (Error : indice trop grand dans solidprojpath) == quit } ifelse end } def %% syntaxe : x y z [normal] bool planprojpath /planprojpath { 6 dict begin /visibility exch def %% on calcule l image de la base (I,J,K) normalvect_to_orthobase /imageK defpoint3d /imageJ defpoint3d /imageI defpoint3d /z exch def /y exch def /x exch def visibility not x y z imageK planvisible? or { {ptojpoint 0 imageI imageJ imageK transformpoint3d x y z addv3d 3dto2d jtoppoint} currentppathtransform } { newpath } ifelse end } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% fonctions numeriques %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### courbeparam ### /setresolution { /resolution exch def } def /resolution 200 def /courbe_dic 2 dict def courbe_dic /X {} put courbe_dic /Y {} put %% syntaxe : tmin tmax C@urbeparam_ /C@urbeparam_ { 6 dict begin /tmax@ exch def /tmin@ exch def /t tmin@ def /dt tmax@ tmin@ sub resolution 1 sub div def tmin@ courbe_dic /X get exec pstrickactionR tmin@ courbe_dic /Y get exec pstrickactionR smoveto resolution 1 sub { t courbe_dic /X get exec pstrickactionR t courbe_dic /Y get exec pstrickactionR slineto /t t dt add store %% on incremente } repeat tmax@ courbe_dic /X get exec pstrickactionR tmax@ courbe_dic /Y get exec pstrickactionR slineto end } def %% syntaxe : tmin tmax {X} {Y} Courbeparam_ /Courbeparam_ { courbe_dic exch /Y exch put courbe_dic exch /X exch put C@urbeparam_ } def %% syntaxe : {X} {Y} courbeparam_ /courbeparam_ { tmin tmax 4 -1 roll 4 -1 roll Courbeparam_ } def %% syntaxe : tmin tmax {X} {Y} Courbeparam /Courbeparam { gsave 6 dict begin dup isstring { /option exch def } if courbe_dic exch /Y exch put courbe_dic exch /X exch put /tmax exch def /tmin exch def newpath tmin courbe_dic /X get exec pstrickactionR tmin courbe_dic /Y get exec pstrickactionR smoveto %% on commence le chemin tmin tmax C@urbeparam_ starfill stockcurrentcpath newarrowpath currentdict /option known { /dt tmax tmin sub resolution 1 sub div def tmin dt add courbe_dic /X get exec tmin dt add courbe_dic /Y get exec tmin courbe_dic /X get exec tmin courbe_dic /Y get exec arrowpath0 tmax dt sub courbe_dic /X get exec tmax dt sub courbe_dic /Y get exec tmax courbe_dic /X get exec tmax courbe_dic /Y get exec currentdict /dt undef arrowpath1 option gere_arrowhead } if currentlinewidth 0 eq {} {stroke} ifelse end grestore } def %% syntaxe : {X} {Y} courbeparam /courbeparam { dup isstring { tmin tmax 5 -1 roll 5 -1 roll 5 -1 roll } { tmin tmax 4 -1 roll 4 -1 roll } ifelse Courbeparam } def %% syntaxe : tmin tmax {X} {Y} Courbeparam* /Courbeparam* { 1 dict begin /startest {true} def Courbeparam end } def %% syntaxe : {X} {Y} courbeparam* /courbeparam* { 1 dict begin /startest {true} def courbeparam end } def %%%%% ### courbe ### %% syntaxe : {f} courbe /courbe { dup isstring %% y a-t-il une option de fin de ligne ? { xmin xmax {} 5 -1 roll 5 -1 roll } { xmin xmax {} 4 -1 roll } ifelse Courbeparam } def %% syntaxe : mini maxi {f} Courbe /Courbe { dup isstring { {} 3 -1 roll 3 -1 roll } { {} 2 -1 roll } ifelse Courbeparam } def %% syntaxe : {f} courbe_ /courbe_ { xmin xmax {} 4 -1 roll Courbeparam_ } def %% syntaxe : mini maxi {f} Courbe_ /Courbe_ { {} 2 -1 roll Courbeparam_ } def %% syntaxe : mini maxi {f} Courbe* /Courbe* { 1 dict begin /startest {true} def Courbe end } def %% syntaxe : {f} courbe* /courbe* { 1 dict begin /startest {true} def courbe end } def %%%%% ### courbeR2 ### %% syntaxe : tmin tmax C@urbeR2_ /C@urbeR2_ { 6 dict begin /tmax@ exch def /tmin@ exch def /t tmin@ def /dt tmax@ tmin@ sub resolution 1 sub div def tmin@ courbe_dic /X get exec pstrickactionR2 smoveto /t t dt add store resolution 2 sub { t courbe_dic /X get exec pstrickactionR2 slineto /t t dt add store %% on incremente } repeat tmax@ courbe_dic /X get exec pstrickactionR2 slineto end } def %% syntaxe : tmin tmax {X} CourbeR2_ /CourbeR2_ { courbe_dic exch /X exch put C@urbeR2_ } def %% syntaxe : {X} courbeR2_ /courbeR2_ { tmin tmax 3 -1 roll 3 -1 roll CourbeR2_ } def %% syntaxe : tmin tmax {X} CourbeR2 /CourbeR2+ { 2 dict begin /slineto {} def /smoveto {} def CourbeR2 end } bind def /CourbeR2 { gsave 6 dict begin dup isstring { /option exch def } if courbe_dic exch /X exch put /tmax exch def /tmin exch def newpath tmin tmax C@urbeR2_ starfill currentlinewidth 0 eq {} {stroke} ifelse end grestore } def %% syntaxe : {X} courbeR2 /courbeR2 { tmin tmax 3 -1 roll CourbeR2 } def %% syntaxe : tmin tmax {X} CourbeR2* /CourbeR2* { 1 dict begin /startest {true} def CourbeR2 end } def %% syntaxe : {X} {Y} courbeR2* /courbeR2* { 1 dict begin /startest {true} def courbeR2 end } def %%%%% ### courbeR3 ### %% syntaxe : t1 t2 {f} (option) CourbeR3 /CourbeR3 { 2 dict begin dup isstring { /option exch def } if /lafonction exch def {lafonction 3dto2d} currentdict /option known {option} if CourbeR2 end } def %% syntaxe : {f} (option) CourbeR3 /courbeR3 { tmin tmax 3 -1 roll CourbeR3 } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% fonctions et constantes mathematiques %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### math ### %%%%%%%%%%% constantes mathematiques %%%%%%%%%%%%%% /pi 3.14159 def /e 2.71828 def %%%%%%%%%%% fonctions mathematiques %%%%%%%%%%%%%%% /rd {180 pi div mul} def %% transforme des rd en degres /deg {pi mul 180 div} def %% transforme des degres en rd /log {ln 10 ln div} def /Exp {e exch exp} def /Cos {rd cos} def /Sin {rd sin} def /tan {dup sin exch cos div} def /cotan {dup cos exch sin div} def /Tan {dup Sin exch Cos div} def /Cotan {dup Cos exch Sin div} def /coTan {Cotan} def /arctan { dup 0 ge {1 atan} {neg 1 atan neg} ifelse } def /Arctan {arctan deg} def /arccos { dup dup mul neg 1 add sqrt exch atan } def /Arccos {arccos deg} def /arcsin { dup 1 eq { 90 } { dup dup mul neg 1 add sqrt atan dup 90 lt {} {360 sub} ifelse } ifelse } def /Arcsin {arcsin deg} def /cosh {dup Exp exch neg Exp add 2 div} def /sinh {dup Exp exch neg Exp sub 2 div} def /tanh {dup sinh exch cosh div} def /cotanh {dup cosh exch sinh div} def /argcosh {dup dup mul 1 sub sqrt add ln} def /argsinh {dup dup mul 1 add sqrt add ln} def /argtanh { setxvar x 1 add 1 x sub div ln 2 div } def /factorielle { dup 0 eq {pop 1} {dup 1 sub factorielle mul} ifelse } def /Gauss { 3 dict begin /sigma exch def /m exch def /x exch def x m sub dup mul sigma dup mul 2 mul div neg Exp 2 pi mul sigma dup mul mul sqrt div end } def %% syntaxe : a n modulo /modulo { 2 dict begin /n exch def /a exch def { a 0 lt { /a a n add store } { exit } ifelse } loop a n mod end } def %%%%% ### max ### /max { 2 copy lt {exch} if pop } def %%%%% ### min ### /min { 2 copy gt {exch} if pop } def %%%%% ### setcolor ### %% syntaxe : tableau setcolor /setcolor { dup length 4 eq {aload pop setcmykcolor} {aload pop setrgbcolor} ifelse } def %%%%% ### in ### %% cherche si un elt donne appartient au tableau donne %% rque : utilise 3 variables locales %% syntaxe : elt array in --> index boolean /in { 3 dict begin /liste exch def /elt exch def /i 0 def false %% la reponse a priori liste length { liste i get elt eq { pop %% en enleve la reponse i true %% pour mettre la bonne exit } if /i i 1 add store } repeat end } def %%%%% ### starfill ### %% la procedure pour les objets "star" %% si c est "star" on fait le fillstyle, sinon non /starfill { startest { gsave clip fillstyle grestore /startest false def } if } def %%%%% ### addv ### %% syntaxe : u v addv --> u+v /addv { %% xA yA xB yB 3 1 roll %% xA yB yA xB 4 1 roll %% xB xA yB yA add 3 1 roll %% yB+yA xB xA add exch } def %%%%% ### continu ### /continu { [] 0 setdash } def %%%%% ### trigospherique ### %% passage spherique --> cartesiennes %% les formules de passage ont été récupérées ici : %% http://fr.wikipedia.org/wiki/Coordonn%C3%A9es_polaires %% syntaxe : r theta phi rtp2xyz -> x y z /rtp2xyz { 6 dict begin /phi exch def /theta exch def /r exch def /x phi sin theta cos mul r mul def /y phi sin theta sin mul r mul def /z phi cos r mul def x y z end } def %% trace d'un arc sur une sphere de centre O %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique /arcspherique { 9 dict begin dup isstring { /option exch def } if /phi2 exch def /theta2 exch def pop /phi1 exch def /theta1 exch def /r exch def /n 12 def 1 theta1 phi1 rtp2xyz /u defpoint3d 1 theta2 phi2 rtp2xyz /v defpoint3d u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d /sinalpha u v vectprod3d norme3d def /cosalpha u v scalprod3d def /alpha sinalpha cosalpha atan def /n 12 def /pas alpha n div def gsave /t pas neg def [ n 1 add { /t t pas add store u t cos r mul mulv3d w t sin r mul mulv3d addv3d } repeat ] currentdict /option known { option } if ligne3d grestore end } def %% trace d'un arc sur une sphere de centre O %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique /arcspherique_ { 8 dict begin /phi2 exch def /theta2 exch def pop /phi1 exch def /theta1 exch def /r exch def /n 12 def 1 theta1 phi1 rtp2xyz /u defpoint3d 1 theta2 phi2 rtp2xyz /v defpoint3d u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d /sinalpha u v vectprod3d norme3d def /cosalpha u v scalprod3d def /alpha sinalpha cosalpha atan def /n 12 def /pas alpha n div def /t pas neg def [ n 1 add { /t t pas add store u t cos r mul mulv3d w t sin r mul mulv3d addv3d } repeat ] ligne3d_ end } def %% trace d'une geodesique sur une sphere de centre O %% syntaxe : r theta1 phi1 r theta2 phi2 geodesique_sphere /geodesique_sphere { 13 dict begin /phi2 exch def /theta2 exch def pop /phi1 exch def /theta1 exch def /r exch def /n 360 def 1 theta1 phi1 rtp2xyz /u defpoint3d 1 theta2 phi2 rtp2xyz /v defpoint3d u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d /sinalpha u v vectprod3d norme3d def /cosalpha u v scalprod3d def /alpha sinalpha cosalpha atan def /pas 360 n div def gsave /t pas neg def [ n 1 add { /t t pas add store u t cos r mul mulv3d w t sin r mul mulv3d addv3d } repeat ] ligne3d grestore end } def %% syntaxe : A B C trianglespherique --> trace le rtiangle ABC %% (coordonnees spheriques) /trianglespherique* { 1 dict begin /startest {true} def trianglespherique end } def /trianglespherique { 10 dict begin /C defpoint3d /B defpoint3d /A defpoint3d gsave newpath A rtp2xyz 3dto2d smoveto A B arcspherique_ B C arcspherique_ C A arcspherique_ closepath starfill currentlinewidth 0 eq {} {stroke} ifelse grestore end } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% operations sur les tableaux %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### duparray ### /duparray { 1 dict begin /table exch def table [ table aload pop ] end } def %%%%% ### append ### %% syntaxe : string1 string2 append --> concatene les 2 chaines ou fusionne 2 tableaux /append { 3 dict begin dup isarray { /tab2 exch def /tab1 exch def [ tab1 aload pop tab2 aload pop ] } { /str2 exch def /str1 exch def /result str1 length str2 length add string def str1 result copy pop result str1 length str2 putinterval result } ifelse end } def %%%%% ### rollparray ### %% syntaxe : array n rollparray -> array %% opere une rotation de n sur les couplets du tableau array /rollparray { 4 dict begin /k exch def /table exch def /n table length def k 0 eq { table } { k 0 ge { [ table aload pop 2 {n 1 roll} repeat ] k 1 sub } { [ table aload pop 2 {n -1 roll} repeat ] k 1 add } ifelse rollparray } ifelse end } def %%%%% ### bubblesort ### %% syntaxe : array bubblesort --> array2 trie par ordre croissant %% code de Bill Casselman %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/ /bubblesort { 4 dict begin /a exch def /n a length 1 sub def n 0 gt { % at this point only the n+1 items in the bottom of a remain to % the sorted largest item in that blocks is to be moved up into % position n n { 0 1 n 1 sub { /i exch def a i get a i 1 add get gt { % if a[i] > a[i+1] swap a[i] and a[i+1] a i 1 add a i get a i a i 1 add get % set new a[i] = old a[i+1] put % set new a[i+1] = old a[i] put } if } for /n n 1 sub def } repeat } if a end } def %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est %% trie par ordre croissant et array2 correspond a la position des %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2] %% code de Bill Casselman, modifie par jpv, 15/08/2006 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/ /doublebubblesort { 5 dict begin /table exch def /n table length 1 sub def /indices [ 0 1 n {} for ] def n 0 gt { % at this point only the n+1 items in the bottom of a remain to % the sorted largest item in that blocks is to be moved up into % position n n { 0 1 n 1 sub { /i exch def table i get table i 1 add get gt { % if a[i] > a[i+1] swap a[i] and a[i+1] table i 1 add table i get table i table i 1 add get % set new a[i] = old a[i+1] put % set new a[i+1] = old a[i] put indices i 1 add indices i get indices i indices i 1 add get % set new a[i] = old a[i+1] put % set new a[i+1] = old a[i] put } if } for /n n 1 sub def } repeat } if indices table end } def %%%%% ### quicksort ### %% src : http://www.math.ubc.ca/~cass/graphics/text/www/code/sort.inc %% code de Bill Casselman, modifie par jpv, 18/10/2007 /qsortdict 8 dict def qsortdict begin % args: /comp a L R x % effect: effects a partition into two pieces [L j] [i R] % leaves i j on stack /partition { 8 dict begin /x exch def /j exch def /i exch def /a exch def load /comp exch def { { a i get x comp exec not { exit } if /i i 1 add def } loop { x a j get comp exec not { exit } if /j j 1 sub def } loop i j le { % swap a[i] a[j] a j a i get a i a j get put put indices j indices i get indices i indices j get put put /i i 1 add def /j j 1 sub def } if i j gt { exit } if } loop i j end } def % args: /comp a L R % effect: sorts a[L .. R] according to comp /subsort { % /c a L R [ 3 1 roll ] 3 copy % /c a [L R] /c a [L R] aload aload pop % /c a [L R] /c a L R L R add 2 idiv % /c a [L R] /c a L R (L+R)/2 3 index exch get % /c a [L R] /c a L R x partition % /c a [L R] i j % if j > L subsort(a, L, j) dup % /c a [L R] i j j 3 index 0 get gt { % /c a [L R] i j 5 copy % /c a [L R] i j /c a [L R] i j exch pop % /c a [L R] i j /c a [L R] j exch 0 get exch % ... /c a L j subsort } if % /c a [L R] i j pop dup % /c a [L R] i i % if i < R subsort(a, i, R) 2 index 1 get lt { % /c a [L R] i exch 1 get % /c a i R subsort }{ 4 { pop } repeat } ifelse } def end % args: /comp a % effect: sorts the array a % comp returns truth of x < y for entries in a /quicksort { qsortdict begin dup length 1 gt { % /comp a dup % /comp a a length 1 sub % /comp a n-1 0 exch subsort } { pop pop } ifelse end } def % ---------------------------------------- %% fin du code de Bill Casselman %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est %% trie par ordre croissant et array2 correspond a la position des %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2] %% code de Bill Casselman, modifie par jpv, 18/10/2007 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/ /doublequicksort { qsortdict begin /comp exch /a exch def a dup length /n exch def /indices [0 1 n 1 sub {} for ] def dup length 1 gt { % /comp a dup % /comp a a length 1 sub % /comp a n-1 0 exch subsort } { pop pop } ifelse indices a end } def /comp {lt} def %%%%% ### apply ### %% syntaxe : [x1 ... xn] (f) apply --> [f(x1) ... f(xn)] /apply { 3 dict begin dup isstring {/fonction exch cvx def} {/fonction exch def} ifelse /liste exch def /@i 0 def [ liste length { liste @i get fonction /@i @i 1 add store } repeat counttomark 0 eq {pop} {]} ifelse end } def %% syntaxe : [x1 ... xn] (f) papply /papply { 3 dict begin dup isstring {/fonction exch cvx def} {/fonction exch def} ifelse /liste exch def /@i 0 def [ liste length 2 idiv { liste @i get liste @i 1 add get fonction /@i @i 2 add store } repeat counttomark 0 eq {pop} {]} ifelse end } def %% syntaxe : [x1 ... xn] (f) capply /capply { 3 dict begin dup isstring {/fonction exch cvx def} {/fonction exch def} ifelse /liste exch def /@i 0 def [ liste length 3 idiv { liste @i get liste @i 1 add get liste @i 2 add get fonction /@i @i 3 add store } repeat counttomark 0 eq {pop} {]} ifelse end } def %%%%% ### reverse ### %% syntaxe : array reverse --> inverse l ordre des items dans %% le tableau /reverse { 3 dict begin /le_tableau exch def /n le_tableau length def /i n 1 sub def [ n { le_tableau i get /i i 1 sub store } repeat ] end } def %% syntaxe : array_points reversep --> inverse l ordre des points dans %% le tableau /reversep { 3 dict begin /le_tableau exch def /n le_tableau length 2 idiv def /i n 1 sub def [ n { le_tableau i getp /i i 1 sub store } repeat ] end } def %%%%% ### get ### %% syntaxe : array_points n getp --> le n-ieme point du tableau de %% points array_points /getp { 2 copy 2 mul get 3 1 roll 2 mul 1 add get } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% matrices %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### linear ### %% syntaxe : M i j any --> depose any dans M en a_ij /put_ij { 5 dict begin /a exch def /j exch def /i exch def /M exch def /L M i get_Li def L j a put M i L put_Li end } def %% syntaxe : M i j get_ij --> le coeff c_ij /get_ij { 3 1 roll %% j M i get_Li %% j L_i exch get } def %% syntaxe : M i L put_Li --> remplace dans M la ligne Li par L /put_Li { put } def %% syntaxe : M i get_Li --> la ligne Li de M /get_Li { get } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% geometrie 3d (calculs) %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### dupp3d ### %% duplique le vecteur 3d /dupp3d { %% x y z 3 copy } def /dupv3d {dupp3d} def %%%%% ### angle3d ### %% syntaxe : vect1 vect2 angle3d /angle3d { 4 dict begin normalize3d /vect2 defpoint3d normalize3d /vect1 defpoint3d /cosalpha vect1 vect2 scalprod3d def /sinalpha vect1 vect2 vectprod3d norme3d def sinalpha cosalpha atan end } def %%%%% ### transformpoint3d ### %% syntaxe : x y z a11 a21 a31 a12 a22 a32 a13 a23 a33 %% transformpoint3d -> X Y Z /transformpoint3d { 12 dict begin /a33 exch def /a23 exch def /a13 exch def /a32 exch def /a22 exch def /a12 exch def /a31 exch def /a21 exch def /a11 exch def /z exch def /y exch def /x exch def a11 x mul a12 y mul add a13 z mul add a21 x mul a22 y mul add a23 z mul add a31 x mul a32 y mul add a33 z mul add end } def %%%%% ### normalize3d ### %% rend le vecteur 3d unitaire. Ne fait rien si u=0 /unitaire3d { %% x y z 2 dict begin /u defpoint3d /norme u norme3d def norme 0 eq { u } { u 1 norme div mulv3d } ifelse end } def /normalize3d {unitaire3d} def %%%%% ### mulv ### %% syntaxe : u a mulv --> au /mulv { %% xA, yA, a dup %% xA, yA, a, a 3 1 roll %% xA, a, yA, a mul 3 1 roll %% ayA, xA, a mul exch } def %%%%% ### geom3d ### %% syntaxe : A k1 B k2 barycentre3d -> G, barycentre du systeme %% [(A, k1) (B, k2)] /barycentre3d { 4 dict begin /k2 exch def /B defpoint3d /k1 exch def /A defpoint3d A k1 mulv3d B k2 mulv3d addv3d 1 k1 k2 add div mulv3d end } def %% syntaxe : array isobarycentre3d --> G /isobarycentre3d { 2 dict begin /table exch def /n table length 3 idiv def table 0 getp3d 1 1 n 1 sub { table exch getp3d addv3d } for 1 n div mulv3d end } def %% syntaxe : M A alpha hompoint3d -> le point M' tel que AM' = alpha AM /hompoint3d { 3 dict begin /alpha exch def /A defpoint3d /M defpoint3d A M vecteur3d alpha mulv3d A addv3d end } def %% syntaxe : M A sympoint3d -> le point M' tel que AM' = -AM /sympoint3d { 2 dict begin /A defpoint3d /M defpoint3d A M vecteur3d -1 mulv3d A addv3d end } def %% syntaxe : A u translatepoint3d --> B image de A par la translation de vecteur u /translatepoint3d { addv3d } def /scaleOpoint3d { 6 dict begin /k3 exch def /k2 exch def /k1 exch def /z exch def /y exch def /x exch def k1 x mul k2 y mul k3 z mul end } def % syntaxe : M alpha_x alpha_y alpha_z rotateOpoint3d --> M' /rotateOpoint3d { 21 dict begin /RotZ exch def /RotY exch def /RotX exch def /Zpoint exch def /Ypoint exch def /Xpoint exch def /c1 {RotX cos} bind def /c2 {RotY cos} bind def /c3 {RotZ cos} bind def /s1 {RotX sin} bind def /s2 {RotY sin} bind def /s3 {RotZ sin} bind def /M11 {c2 c3 mul} bind def /M12 {c3 s1 mul s2 mul c1 s3 mul sub} bind def /M13 {c1 c3 mul s2 mul s1 s3 mul add} bind def /M21 {c2 s3 mul} bind def /M22 {s1 s2 mul s3 mul c1 c3 mul add} bind def /M23 {s3 s2 mul c1 mul c3 s1 mul sub} bind def /M31 {s2 neg} bind def /M32 {s1 c2 mul} bind def /M33 {c1 c2 mul} bind def M11 Xpoint mul M12 Ypoint mul add M13 Zpoint mul add M21 Xpoint mul M22 Ypoint mul add M23 Zpoint mul add M31 Xpoint mul M32 Ypoint mul add M33 Zpoint mul add end } def %%%%% ### vecteur3d ### %% creation du vecteur AB a partir de A et B /vecteur3d { %% xA yA zA xB yB zB 6 dict begin /zB exch def /yB exch def /xB exch def /zA exch def /yA exch def /xA exch def xB xA sub yB yA sub zB zA sub end }def %%%%% ### vectprod3d ### %% produit vectoriel de deux vecteurs 3d /vectprod3d { %% x1 y1 z1 x2 y2 z2 6 dict begin /zp exch def /yp exch def /xp exch def /z exch def /y exch def /x exch def y zp mul z yp mul sub z xp mul x zp mul sub x yp mul y xp mul sub end } def %%%%% ### scalprod3d ### %% produit scalaire de deux vecteurs 3d /scalprod3d { %% x1 y1 z1 x2 y2 z2 6 dict begin /zp exch def /yp exch def /xp exch def /z exch def /y exch def /x exch def x xp mul y yp mul add z zp mul add end } def %%%%% ### papply3d ### %% syntaxe : [A1 ... An] (f) papply3d --> [f(A1) ... f(An)] /papply3d { 3 dict begin /fonction exch def /liste exch def /i 0 def [ liste length 3 idiv { liste i get liste i 1 add get liste i 2 add get fonction /i i 3 add store } repeat counttomark 0 eq {pop} {]} ifelse end } def %%%%% ### defpoint3d ### %% creation du point A a partir de xA yA yB et du nom /A /defpoint3d { %% xA yA zA /nom 1 dict begin /memo exch def [ 4 1 roll ] cvx memo exch end def }def %%%%% ### distance3d ### /distance3d { %% A B vecteur3d norme3d } def %%%%% ### get3d ### /getp3d { %% [tableau de points 3d] i --> donne le ieme point du tableau 2 copy 2 copy 3 mul get 5 1 roll 3 mul 1 add get 3 1 roll 3 mul 2 add get } def %%%%% ### norme3d ### %% norme d un vecteur 3d /norme3d { %% x y z 3 dict begin /z exch def /y exch def /x exch def x dup mul y dup mul add z dup mul add sqrt end } def %%%%% ### mulv3d ### %% (scalaire)*(vecteur 3d) Attention : dans l autre sens ! /mulv3d { %% x y z lambda 4 dict begin /lambda exch def /z exch def /y exch def /x exch def x lambda mul y lambda mul z lambda mul end } def %%%%% ### addv3d ### %% addition de deux vecteurs 3d /addv3d { %% x1 y1 z1 x2 y2 z2 6 dict begin /zp exch def /yp exch def /xp exch def /z exch def /y exch def /x exch def x xp add y yp add z zp add end } def %%%%% ### milieu3d ### /milieu3d { %% A B --> I le milieu de [AB] addv3d 0.5 mulv3d } def %%%%% ### exch ### /exchp { 4 -1 roll 4 -1 roll } def /exchc { 6 -1 roll 6 -1 roll 6 -1 roll } def /exchd { 4 {8 -1 roll} repeat } def /exchp3d { 6 -1 roll 6 -1 roll 6 -1 roll } def %%%%% ### ABpoint3d ### %% syntaxe : A B k ABpoint3d --> M %% M tel que vect(AM) = k vect (AB) /ABpoint3d { 3 dict begin /k exch def /B defpoint3d /A defpoint3d A B vecteur3d k mulv3d A addv3d end } def %%%%% ### angle3doriente ### %% syntaxe : vect1 vect2 vect3 angle3d %% vect3 est la normale au plan (vect1, vect2) /angle3doriente { 4 dict begin normalize3d /vect3 defpoint3d normalize3d /vect2 defpoint3d normalize3d /vect1 defpoint3d /cosalpha vect1 vect2 scalprod3d def /sinalpha vect1 vect2 vectprod3d vect3 scalprod3d def sinalpha cosalpha atan end } def %%%%% ### points3dalignes ### %% syntaxe : A B C points3dalignes -> bool /points3dalignes { 3 dict begin /C defpoint3d /B defpoint3d /A defpoint3d A B vecteur3d /u defpoint3d A C vecteur3d /v defpoint3d u v vectprod3d norme3d 1E-7 lt end } def %% syntaxe : M A B point3dsursegment --> true si M in [AB], false sinon /point3dsursegment { 3 dict begin /B defpoint3d /A defpoint3d /M defpoint3d M A B points3dalignes { M A vecteur3d M B vecteur3d scalprod3d 0 lt { true } { false } ifelse } { false } ifelse end } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% geometrie 3d (dessins) %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### point3d ### /point3d { %% A 3dto2d point } def /points3d { %% tableau de points3d tab3dto2d points } def %%%%% ### ligne3d ### %% [tableau de points3d] option --> trace la ligne brisee /ligne3d { 1 dict begin dup isstring {/option exch def} if tab3dto2d currentdict /option known {option} if ligne end } def %% [tableau de points3d] option --> trace la ligne brisee /ligne3d_ { 1 dict begin dup isstring {/option exch def} if tab3dto2d currentdict /option known {option} if ligne_ end } def %%%%% ### tab3dto2d ### %% transforme un tableau de points 3d en tableau de points 2d /tab3dto2d { 2 dict begin /T exch def /n T length def [ T aload pop n 1 sub -1 n 3 idiv 2 mul { 1 dict begin /i exch def 3dto2d i 2 roll end } for ] end } def %%%%% ### polygone3d ### /polygone3d { %% tableau de points3d tab3dto2d polygone } def /polygone3d* { %% tableau de points3d tab3dto2d polygone* } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% gestion du texte %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### pathtext ### %% syntaxe : string x y initp@thtext /initp@thtext { 7 dict begin /y exch def /x exch def /str exch def str 0 0 show_dim /wy exch def /wx exch def /lly exch def /llx exch def pop pop pop newpath x y smoveto } def /closep@thtext { str true charpath end } def %% syntaxe : string x y cctext_ /cctext_ { initp@thtext llx wx add lly wy add -.5 mulv rmoveto closep@thtext } def /brtext_ { initp@thtext hadjust 0 rmoveto llx neg 0 rmoveto closep@thtext } def /bbtext_ { initp@thtext 0 0 rmoveto 0 0 rmoveto closep@thtext } def /bltext_ { initp@thtext hadjust neg 0 rmoveto wx neg 0 rmoveto closep@thtext } def /bctext_ { initp@thtext 0 0 rmoveto wx llx add -.5 mul 0 rmoveto closep@thtext } def /ubtext_ { initp@thtext 0 vadjust rmoveto 0 lly neg rmoveto closep@thtext } def /urtext_ { initp@thtext hadjust vadjust rmoveto llx neg lly neg rmoveto closep@thtext } def /ultext_ { initp@thtext hadjust neg vadjust rmoveto wx neg lly neg rmoveto closep@thtext } def /uctext_ { initp@thtext 0 vadjust rmoveto llx wx add -.5 mul lly neg rmoveto closep@thtext } def /drtext_ { initp@thtext hadjust vadjust neg rmoveto llx neg wy neg rmoveto closep@thtext } def /dbtext_ { initp@thtext 0 vadjust neg rmoveto 0 wy neg rmoveto closep@thtext } def /dltext_ { initp@thtext hadjust neg vadjust neg rmoveto wx neg wy neg rmoveto closep@thtext } def /dctext_ { initp@thtext 0 vadjust neg rmoveto llx wx add -2 div wy neg rmoveto closep@thtext } def /crtext_ { initp@thtext hadjust 0 rmoveto llx neg lly wy add -2 div rmoveto closep@thtext } def /cbtext_ { initp@thtext 0 0 rmoveto 0 lly wy add -2 div rmoveto closep@thtext } def /cltext_ { initp@thtext hadjust neg 0 rmoveto wx neg lly wy add -2 div rmoveto closep@thtext } def /cctext_ { initp@thtext 0 0 rmoveto llx wx add lly wy add -.5 mulv rmoveto closep@thtext } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% bibliotheque sur les solides %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### solide ### %% solid = [Sommets Faces Colors_Faces InOut_Table] /solidgetsommets { 0 get } def /solidgetpointstable {solidgetsommets} def /solidgetfaces { 1 get } def /solidgetface { 1 dict begin /i exch def solidgetfaces i get end } def /solidgetfcolors { 2 get } def %% syntaxe : solid i solidgetfcolor --> str /solidgetfcolor { 1 dict begin /i exch def solidgetfcolors i get end } def %% syntaxe : solid i str solidputfcolor --> - /solidputfcolor { 2 dict begin /str exch def /i exch def solidgetfcolors i str put end } def /solidgetinouttable { 3 get } def /solidputsommets { 0 exch put } def /solidputpointstable {solidputsommets} def /solidputfaces { 1 exch put } def /solidputfcolors { 2 exch put } def /solidputinouttable { 3 exch put } def %% syntaxe : any issolid --> booleen, vrai si any est de type solid /issolid { 1 dict begin /candidat exch def candidat isarray { candidat length 4 eq { candidat 0 get isarray candidat 1 get isarray and candidat 2 get isarray and candidat 3 get isarray and } { false } ifelse } { false } ifelse end } def /dupsolid { 5 dict begin /solid exch def /S solid solidgetsommets def /F solid solidgetfaces def /FC solid solidgetfcolors def /IO solid solidgetinouttable def solid [ S duparray exch pop F duparray exch pop FC duparray exch pop IO duparray exch pop ] end } def %% syntaxe : solid array solidputinfaces --> - /solidputinfaces { 4 dict begin /facesinternes exch def /solid exch def /n2 facesinternes length def /IO solid solidgetinouttable def /facesexternes solid solidgetoutfaces def /n1 facesexternes length def solid [facesexternes aload pop facesinternes aload pop] solidputfaces IO 0 0 put IO 1 n1 1 sub put IO 2 n1 put IO 3 n1 n2 add 1 sub put end } def %% %% syntaxe : solid array solidputoutfaces --> - %% /solidputoutfaces { %% 4 dict begin %% /facesexternes exch def %% /solid exch def %% /n1 facesexternes length def %% /IO solid solidgetinouttable def %% /facesinternes solid solidgetinfaces def %% /n2 facesinternes length def %% solid %% [facesexternes aload pop facesinternes aload pop] %% solidputfaces %% IO 0 0 put %% IO 1 n1 1 sub put %% IO 2 n1 put %% IO 3 n1 n2 add 1 sub put %% end %% } def %% syntaxe : solid array solidputoutfaces --> - /solidputoutfaces { 4 dict begin /facesexternes exch def /solid exch def /n1 facesexternes length def /IO solid solidgetinouttable def /facesinternes solid solidgetinfaces def /n2 facesinternes length def solid [facesexternes aload pop facesinternes aload pop] solidputfaces IO 0 0 put IO 1 n1 1 sub put IO 2 n1 put IO 3 n1 n2 add 1 sub put end } def /solidnombreinfaces { 1 dict begin /solid exch def solid solidwithinfaces { /IO solid solidgetinouttable def IO 3 get IO 2 get sub 1 add } { 0 } ifelse end } def /solidnombreoutfaces { 1 dict begin /solid exch def /IO solid solidgetinouttable def IO 1 get IO 0 get sub 1 add end } def %% syntaxe : solid solidgetinfaces --> array /solidgetinfaces { 4 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetinfaces) == quit } if solid solidwithinfaces { /IO solid solidgetinouttable def /F solid solidgetfaces def /n1 IO 2 get def /n2 IO 3 get def /n n2 n1 sub 1 add def F n1 n getinterval } { [] } ifelse end } def %% syntaxe : solid solidgetoutfaces --> array /solidgetoutfaces { 4 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetoutfaces) == quit } if /IO solid solidgetinouttable def /F solid solidgetfaces def /n1 IO 0 get def /n2 IO 1 get def /n n2 n1 sub 1 add def F n1 n getinterval end } def /tracelignedeniveau? false def /hauteurlignedeniveau 1 def /couleurlignedeniveau {rouge} def /linewidthlignedeniveau 4 def /solidgrid true def /aretescachees true def /defaultsolidmode 2 def /solidgridOn { /solidgrid true def } def /solidgridOff { /solidgrid false def } def %% syntaxe : solid i string solidputfcolor %% syntaxe : solid str outputcolors %% syntaxe : solid str1 str2 inoutputcolors %% syntaxe : solid string n solidputncolors %% syntaxe : solid array solidputincolors --> - %% syntaxe : solid array solidputoutcolors --> - %% syntaxe : solid solidgetincolors --> array %% syntaxe : solid solidgetoutcolors --> array %% syntaxe : solid array solidputinfaces --> - %% syntaxe : solid array solidputoutfaces --> - %% syntaxe : solid solidgetinfaces --> array %% syntaxe : solid solidgetoutfaces --> array %% syntaxe : solid1 solid2 solidfuz -> solid %% syntaxe : solid i solidgetsommetsface -> array %% array = tableau de points 3d /solidgetsommetsface { 1 dict begin /i exch def /solid exch def /F solid i solidgetface def [ 0 1 F length 1 sub { /k exch def solid F k get solidgetsommet } for ] end } def %% syntaxe : solid index table solidputface -> - /solidputface { 1 dict begin /table exch def /i exch def solidgetfaces i table put end } def %% syntaxe : solid table solidaddface -> - %% on ne se preoccupe pas des faces internes /solidaddface { 1 dict begin /table exch def /solid exch def /IO solid solidgetinouttable def /n2 IO 1 get def /FC solid solidgetoutcolors def IO 1 n2 1 add put solid [ solid solidgetfaces aload pop table ] solidputfaces solid IO solidputinouttable % solid solidnombrefaces solid [ FC aload pop () ] solidputoutcolors end } def /solidnombrefaces { 1 dict begin /solid exch def solid solidnombreinfaces solid solidnombreoutfaces add end } def %% syntaxe : solid M solidaddsommetexterne -> - %% on ajoute le sommet sans se preoccuper de rien /solidaddsommetexterne { 2 dict begin /M defpoint3d /solid exch def solid [ solid solidgetsommets aload pop M ] solidputsommets end } def %% syntaxe : solid array solidaddsommets -> - /solidaddsommets { 2 dict begin /table exch def /solid exch def /n table length 3 idiv def 0 1 0 { /i exch def solid table i getp3d solidaddsommet pop } for end } def %% syntaxe : solid M solidaddsommet -> k %% on ajoute le sommet M. Si il est deja sur une arete, %% on l incorpore a la face concernee %% s il est deja present, on ne le rajoute pas. %% Renvoie l indice du sommet rajoute. /solidaddsommet { 10 dict begin /M defpoint3d /solid exch def /nbf solid solidnombrefaces def /N solid solidnombresommets def /sortie -1 def %% le sommet est-il deja dans la structure 0 1 N 1 sub { /i exch def %% (addsommet) == %% solid i solidgetsommet == == == %% M == == == %% solid i solidgetsommet M eqp3d == % solid i solidgetsommet M eqp3d { solid i solidgetsommet M distance3d 1e-7 le { %% oui => c est fini /sortie i store } if } for sortie 0 lt { %% non => on le rajoute /sortie N def solid M solidaddsommetexterne %% est il sur une arete deja codee 0 1 nbf 1 sub { %% face d indice i /i exch def solid i solidgetface /F exch def /nbsf F length def 0 1 nbsf 1 sub { /j exch def M solid j i solidgetsommetface solid j 1 add nbsf mod i solidgetsommetface point3dsursegment { %% il est sur l arete concernee solid i [ 0 1 j { /k exch def F k get } for N j 1 add nbsf mod dup 0 eq { pop } { 1 nbsf 1 sub { /k exch def F k get } for } ifelse ] solidputface exit } if } for } for } if sortie end } def %%%%% ### solidrmsommet ### %% syntaxe : solid i solidrmsommet -> - /solidrmsommet { 5 dict begin /i exch def /solid exch def solid issolid not { (Erreur : mauvais type d argument dans solidrmsommet) == quit } if solid i solidsommetsadjsommet length 0 gt { (Erreur : sommet non isole dans solidrmsommet) == quit } if %% on s occupe des sommets /n solid solidnombresommets def /S [ 0 1 n 1 sub { /j exch def j i ne { solid j solidgetsommet } if } for ] def solid S solidputsommets %% on s occupe des faces /n solid solidnombrefaces def /F [ 0 1 n 1 sub { %% face d indice j /j exch def /Fj solid j solidgetface def [0 1 Fj length 1 sub { %% sommet d indice k de la face Fj /k exch def Fj k get dup i gt { 1 sub } if } for] } for ] def solid F solidputfaces end } def %%%%% ### solidsommetsadjsommet ### %% syntaxe : solid i solidsommetsadjsommet --> array %% array est le tableau des indices des sommets adjacents au %% sommet d indice i /solidsommetsadjsommet { 6 dict begin /no exch def /solid exch def solid no solidfacesadjsommet /facesadj exch def /sommetsadj [] def /nbadj facesadj length def 0 1 nbadj 1 sub { /j exch def %% examen de la jieme face %/j 0 def /F solid facesadj j get solidgetface def /nbsommetsface F length def no F in { /index exch def /i1 F index 1 sub nbsommetsface modulo get def /i2 F index 1 add nbsommetsface mod get def %% si i1 n est pas deja note, on le rajoute i1 sommetsadj in { pop } { /sommetsadj [ sommetsadj aload pop i1 ] store } ifelse %% si i2 n est pas deja note, on le rajoute i2 sommetsadj in { pop } { /sommetsadj [ sommetsadj aload pop i2 ] store } ifelse } { (Error : bug dans solidsommetsadjsommet) == quit } ifelse } for sommetsadj end } def %%%%% ### solidfacesadjsommet ### %% syntaxe : solid i solidfacesadjsommet --> array %% array est le tableau des indices des faces adjacentes au %% sommet d indice i /solidfacesadjsommet { 6 dict begin /no exch def /solid exch def /n solid solidnombrefaces def /indicesfacesadj [] def 0 1 n 1 sub { /j exch def /F solid j solidgetface def no F in { pop /indicesfacesadj [ indicesfacesadj aload pop j ] store } if } for indicesfacesadj end } def %%%%% ### fin insertion ### %% /tracelignedeniveau? false def %% /hauteurlignedeniveau 1 def %% /couleurlignedeniveau {rouge} def %% /linewidthlignedeniveau 4 def %% %% /solidgrid true def %% /aretescachees true def %% /defaultsolidmode 2 def %%%%% ### newsolid ### %% syntaxe : newsolid --> depose le solide nul sur la pile /newsolid { [] [] generesolid } def %%%%% ### generesolid ### /generesolid { 2 dict begin /F exch def /S exch def [S F [F length {()} repeat] [0 F length 1 sub -1 -1]] end } def %%%%% ### nullsolid ### %% syntaxe : solide nullsolid -> booleen, vrai si le solide est nul /nullsolid { 1 dict begin /candidat exch def candidat issolid not { (Error type argument dans "nullsolid") == quit } if candidat solidgetsommets length 0 eq { true } { false } ifelse end } def %%%%% ### solidnombreoutfaces ### /solidnombreoutfaces { 4 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidnombreoutfaces) == quit } if solid nullsolid { 0 } { /IO solid solidgetinouttable def IO 1 get IO 0 get sub 1 add } ifelse end } def %%%%% ### solidnombreinfaces ### /solidnombreinfaces { 4 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidnombreinfaces) == quit } if solid solidwithinfaces { /IO solid solidgetinouttable def IO 3 get IO 2 get sub 1 add } { 0 } ifelse end } def %%%%% ### solidtests ### %% syntaxe : solid solidwithinfaces --> bool, true si le solide est vide /solidwithinfaces { 2 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidwithinfaces) == quit } if /table solid solidgetinouttable def table 2 get -1 ne { true } { false } ifelse end } def %%%%% ### solidgetsommet ### %% syntaxe : solid i j solidgetsommetface --> sommet i de la face j /solidgetsommetface { 6 dict begin /j exch def /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetsommetface) == quit } if /table_faces solid solidgetfaces def /table_sommets solid solidgetsommets def /k table_faces j get i get def table_sommets k getp3d end } def %% syntaxe : solid i solidgetsommetsface --> array, tableau des %% sommets de la face i du solide /solidgetsommetsface { 6 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetsommetsface) == quit } if /table_faces solid solidgetfaces def /table_sommets solid solidgetsommets def /table_indices table_faces i get def [ 0 1 table_indices length 1 sub { /j exch def table_sommets table_indices j get getp3d } for ] end } def %% syntaxe : solid i solidgetsommet --> sommet i du solide /solidgetsommet { 3 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetsommet) == quit } if /table_sommets solid solidgetsommets def table_sommets i getp3d end } def %%%%% ### solidcentreface ### %% syntaxe : solid i solidcentreface --> M /solidcentreface { solidgetsommetsface isobarycentre3d } def %%%%% ### solidnombre ### /solidnombresommets { solidgetsommets length 3 idiv } def /solidfacenombresommets { solidgetface length } def /solidnombrefaces { solidgetfaces length } def %%%%% ### solidshowsommets ### /solidshowsommets { 8 dict begin dup issolid not { %% on a un argument /option exch def } if /sol exch def /n sol solidnombresommets def /m sol solidnombrefaces def currentdict /option known not { /option [0 1 n 1 sub {} for] def } if 0 1 option length 1 sub { /k exch def option k get /i exch def %% indice du sommet examine sol i solidgetsommet point3d } for end } def %%%%% ### solidnumsommets ### /solidnumsommets { 8 dict begin % Font findfont 10 scalefont setfont dup issolid not { %% on a un argument /option exch def } if /sol exch def /n sol solidnombresommets def /m sol solidnombrefaces def currentdict /option known not { /option [0 1 n 1 sub {} for] def } if /result [ n {false} repeat ] def 0 1 option length 1 sub { /k exch def option k get /i exch def %% indice du sommet examine 0 1 m 1 sub { /j exch def %% indice de la face examinee i sol j solidgetface in { %% le sommet i est dans la face j pop exit } if } for %% le sommet i est dans la face j sol j solidcentreface /G defpoint3d sol i solidgetsommet /S defpoint3d i ( ) cvs G S vecteur3d normalize3d 15 dup ptojpoint pop mulv3d S addv3d 3dto2d cctext } for end } def %%%%% ### gestionsolidmode ### %% table = [ [vars] [mode0] [mode1] [mode2] [mode3] [mode4] ] /gestionsolidmode { 5 dict begin /table exch def dup xcheck { /mode exch def } { dup isarray { /tableaffectation exch def /mode -1 def } { /mode defaultsolidmode def } ifelse } ifelse /vars table 0 get def /nbvars vars length def mode 0 ge { /tableaffectation table mode 1 add 5 min get def } if 0 1 nbvars 1 sub { /i exch def vars i get tableaffectation i get } for nbvars end {def} repeat } def %%%%% ### solidfuz ### %% syntaxe : solid1 solid2 solidfuz -> solid /solidfuz { 5 dict begin /solid2 exch def /solid1 exch def /S1 solid1 solidgetsommets def /S2 solid2 solidgetsommets def /n S1 length 3 idiv def %% les sommets /S S1 S2 append def %% les faces internes et leurs couleurs /FI1 solid1 solidgetinfaces def /FIC1 solid1 solidgetincolors def solid2 solidnombreinfaces 0 eq { /FI2 [] def /FIC2 [] def } { /FI2 solid2 solidgetinfaces {{n add} apply} apply def /FIC2 solid2 solidgetincolors def } ifelse /FI [FI1 aload pop FI2 aload pop] def /FIC [FIC1 aload pop FIC2 aload pop] def %% les faces externes et leurs couleurs /FO1 solid1 solidgetoutfaces def /FOC1 solid1 solidgetoutcolors def /FO2 solid2 solidgetoutfaces {{n add} apply} apply def /FOC2 solid2 solidgetoutcolors def /FO [FO1 aload pop FO2 aload pop] def /FOC [FOC1 aload pop FOC2 aload pop] def /F [FO aload pop FI aload pop] def /FC [FOC aload pop FIC aload pop] def /IO [0 FO length 1 sub dup 1 add dup FI length add 1 sub] def S F generesolid dup FC solidputfcolors dup IO solidputinouttable end } def %%%%% ### solidnormaleface ### %% syntaxe : solid i solidnormaleface --> u, vecteur normale a la %% face d indice i du solide /solidnormaleface { 4 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetsommetface) == quit } if %% solid 0 i solidgetsommetface /G defpoint3d %% G %% solid 1 i solidgetsommetface %% vecteur3d %% G %% solid 2 i solidgetsommetface %% vecteur3d /n solid i solidfacenombresommets def solid i solidcentreface /G defpoint3d %% debug %% G 3dto2d point G solid 0 i solidgetsommetface /A defpoint3d % gsave bleu A point3d grestore A vecteur3d normalize3d G solid 1 i solidgetsommetface /A defpoint3d % gsave orange A point3d grestore A vecteur3d normalize3d vectprod3d /resultat defpoint3d resultat normalize3d end } def %%%%% ### solidtransform ### %% syntaxe : solid1 {f} solidtransform --> solid2, solid2 est le %% transforme de solid1 par la transformation f : R^3 -> R^3 /solidtransform { 3 dict begin /f exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidtransform) == quit } if /les_sommets solid solidgetsommets {f} papply3d def solid les_sommets solidputsommets solid end } def %%%%% ### solidputcolor ### %% syntaxe : solid i string solidputfcolor /solidputfcolor { 3 dict begin /str exch def /i exch def /solid exch def /FC solid solidgetfcolors def i FC length lt { FC i str put } if end } def %% syntaxe : solid solidgetincolors --> array /solidgetincolors { 3 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetincolors) == quit } if solid solidwithinfaces { /fcol solid solidgetfcolors def /IO solid solidgetinouttable def /n1 IO 2 get def /n2 IO 3 get def /n n2 n1 sub 1 add def fcol n1 n getinterval } { [] } ifelse end } def %% syntaxe : solid solidgetoutcolors --> array /solidgetoutcolors { 3 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetoutcolors) == quit } if /fcol solid solidgetfcolors def /IO solid solidgetinouttable def /n1 IO 0 get def /n2 IO 1 get def /n n2 n1 sub 1 add def fcol n1 n getinterval end } def %% syntaxe : solid array solidputincolors --> - /solidputincolors { 4 dict begin /newcolorstable exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidputincolors) == quit } if /n newcolorstable length def n solid solidnombreinfaces ne { (Error : mauvaise longueur de tableau dans solidputincolors) == quit } if n 0 ne { /FC solid solidgetfcolors def /IO solid solidgetinouttable def /n1 IO 2 get def FC n1 newcolorstable putinterval } if end } def %% syntaxe : solid array solidputoutcolors --> - /solidputoutcolors { 4 dict begin /newcolorstable exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidputoutcolors) == quit } if /n newcolorstable length def n solid solidnombreoutfaces ne { (Error : mauvaise longueur de tableau dans solidputoutcolors) == quit } if n 0 ne { /FC solid solidgetfcolors def /IO solid solidgetinouttable def /n1 IO 0 get def FC n1 newcolorstable putinterval } if end } def %% syntaxe : solid str outputcolors /outputcolors { 5 dict begin /color exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans inoutputcolors) == quit } if /n solid solidnombreoutfaces def solid [ n {color} repeat ] solidputoutcolors end } def %% syntaxe : solid str inputcolors /inputcolors { 5 dict begin /color exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans inoutputcolors) == quit } if /n solid solidnombreinfaces def solid [ n {color} repeat ] solidputincolors end } def %% syntaxe : solid str1 str2 inoutputcolors /inoutputcolors { 5 dict begin /colout exch def /colin exch def /solid exch def solid colin inputcolors solid colout outputcolors end } def %% syntaxe : solid array solidputoutcolors --> - /solidputoutcolors { 4 dict begin /newcolorstable exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidputoutcolors) == quit } if /n newcolorstable length def n solid solidnombreoutfaces ne { (Error : mauvaise longueur de tableau dans solidputoutcolors) == quit } if n 0 ne { /FC solid solidgetfcolors def /IO solid solidgetinouttable def /n1 IO 0 get def FC length n n1 add lt { solid newcolorstable solidputfcolors } { FC n1 newcolorstable putinterval } ifelse } if end } def %%%%% ### solidputhuecolors ### %% syntaxe : solid table solidputhuecolors --> - /solidputhuecolors { 1 dict begin 2 copy pop solidgetinouttable /IO exch def IO 0 get IO 1 get s@lidputhuec@l@rs end } def /solidputinhuecolors { 2 dict begin /table exch def /solid exch def solid solidgetinouttable /IO exch def solid solidwithinfaces { solid table IO 2 get IO 3 get s@lidputhuec@l@rs } if end } def /solidputinouthuecolors { 1 dict begin 2 copy pop solidgetinouttable /IO exch def IO 0 get IO 3 get IO 1 get max s@lidputhuec@l@rs end } def %% syntaxe : solid table n1 n2 s@lidputhuec@l@rs --> - %% affecte les couleurs des faces d indice n1 a n2 du solid solid, par %% un degrade defini par la table. /s@lidputhuec@l@rs { 9 dict begin /n2 exch def /n1 exch def /table exch def /solid exch def /n n2 n1 sub def table length 2 eq { /a0 table 0 get def /a1 table 1 get def a1 isstring { /lacouleurdepart { gsave [a0 cvx exec] length 0 eq { a0 cvx exec currentrgbcolor } { a0 cvx exec } ifelse grestore } def /lacouleurarrivee { gsave [a1 cvx exec] length 0 eq { a1 cvx exec currentrgbcolor } { a1 cvx exec } ifelse grestore } def /table [lacouleurdepart lacouleurarrivee] def } { /A {a0 i a1 a0 sub mul n 1 sub div add} def /B {1} def /C {1} def /D {} def /espacedecouleurs (sethsbcolor) def } ifelse } if table length 4 eq { /a0 table 0 get def /a1 table 1 get def /A {a0 i a1 a0 sub mul n 1 sub div add} def /B table 2 get def /C table 3 get def /D {} def /espacedecouleurs (sethsbcolor) def } if table length 6 eq { /a0 table 0 get def /b0 table 1 get def /c0 table 2 get def /a1 table 3 get def /b1 table 4 get def /c1 table 5 get def /A {a0 i a1 a0 sub mul n 1 sub div add} def /B {b0 i b1 b0 sub mul n 1 sub div add} def /C {c0 i c1 c0 sub mul n 1 sub div add} def /D {} def /espacedecouleurs (setrgbcolor) def } if table length 7 eq { /a0 table 0 get def /b0 table 1 get def /c0 table 2 get def /a1 table 3 get def /b1 table 4 get def /c1 table 5 get def /A {a0 i a1 a0 sub mul n 1 sub div add} def /B {b0 i b1 b0 sub mul n 1 sub div add} def /C {c0 i c1 c0 sub mul n 1 sub div add} def /D {} def /espacedecouleurs (sethsbcolor) def } if table length 8 eq { /a0 table 0 get def /b0 table 1 get def /c0 table 2 get def /d0 table 3 get def /a1 table 4 get def /b1 table 5 get def /c1 table 6 get def /d1 table 7 get def /A {a0 i a1 a0 sub mul n 1 sub div add} def /B {b0 i b1 b0 sub mul n 1 sub div add} def /C {c0 i c1 c0 sub mul n 1 sub div add} def /D {d0 i d1 d0 sub mul n 1 sub div add} def /espacedecouleurs (setcmykcolor) def } if n1 1 n2 { /i exch def solid i [A B C D] espacedecouleurs astr2str solidputfcolor } for end } def %%%%% ### solidrmface ### %% syntaxe : solid i solidrmface -> - /solidrmface { 5 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidrmface) == quit } if %% on enleve la face /F solid solidgetfaces def F length 1 sub i lt { (Error : indice trop grand dans solidrmface) == quit } if [ 0 1 F length 1 sub { /j exch def i j ne { F j get } if } for ] /NF exch def solid NF solidputfaces %% on enleve la couleur correspondante /FC solid solidgetfcolors def [ 0 1 FC length 1 sub { /j exch def i j ne { FC j get } if } for ] /NFC exch def solid NFC solidputfcolors %% on ajuste la table inout /IO solid solidgetinouttable def solid i solidisoutface { IO 1 IO 1 get 1 sub put solid solidwithinfaces { IO 2 IO 2 get 1 sub put IO 3 IO 3 get 1 sub put } if } if solid i solidisinface { IO 1 IO 1 get 1 sub put IO 2 IO 2 get 1 sub put IO 3 IO 3 get 1 sub put } if solid IO solidputinouttable end } def %% syntaxe : solid table solidrmfaces --> - /solidrmfaces { 2 dict begin /table exch bubblesort reverse def /solid exch def table {solid exch solidrmface} apply end } def %%%%% ### videsolid ### %% syntaxe : solid videsolid -> - /videsolid { 5 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans videsolid) == quit } if solid solidwithinfaces not { /IO solid solidgetinouttable def /FE solid solidgetfaces def /n FE length def IO 2 n put IO 3 2 n mul 1 sub put solid IO solidputinouttable %% on inverse chaque face /FI FE {reverse} apply def solid FE FI append solidputfaces %% et on rajoute autant de couleurs vides que de faces /FEC solid solidgetfcolors def % /FIC [FI length {()} repeat] def % solid FEC FIC append solidputfcolors solid FEC duparray append solidputfcolors } if end } def %%%%% ### solidnumfaces ### %% syntaxe : solid array solidnumfaces %% syntaxe : solid array bool solidnumfaces %% array, le tableau des indices des faces a numeroter, est optionnel %% si bool=true, on ne numerote que les faces visibles /solidnumfaces { 5 dict begin dup isbool { /bool exch def } { /bool true def } ifelse setTimes dup issolid not { %% on a un argument /option exch def } if /sol exch def /n sol solidnombrefaces def currentdict /option known not { /option [0 1 n 1 sub {} for] def } if 0 1 option length 1 sub { /i exch def /j option i get def j ( ) cvs sol j bool cctextp3d } for end } def %%%%% ### creusesolid ### %% syntaxe : solid creusesolid -> - /creusesolid { 5 dict begin /solid exch def solid issolid not { (Error : mauvais type d argument dans creusesolid) == quit } if %% on enleve le fond et le chapeau solid 1 solidrmface solid 0 solidrmface %% on inverse chaque face solid videsolid end } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% dessin des solides %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### solidisinface ### %% syntaxe : solid i solidisinface --> bool %% true si i est l indice d une face interne, false sinon /solidisinface { 4 dict begin /i exch def solidgetinouttable /IO exch def /n1 IO 2 get def /n2 IO 3 get def n1 i le i n2 le and end } def %%%%% ### solidisoutface ### %% syntaxe : solid i solidisoutface --> bool %% true si i est l indice d une face externe, false sinon /solidisoutface { 4 dict begin /i exch def solidgetinouttable /IO exch def /n1 IO 0 get def /n2 IO 1 get def n1 i le i n2 le and end } def %%%%% ### planvisible ### %% syntaxe : A k planvisible? --> true si le plan est visible /planvisible? { 4 dict begin /normale_plan defpoint3d /origine defpoint3d /ligne_de_vue { origine GetCamPos vecteur3d } def ligne_de_vue normale_plan scalprod3d 0 gt end } def %%%%% ### solidlight ### %/lightintensity 1 def %/lightsrc {10 15 20} def /setlightintensity { /lightintensity exch def } def /setlightsrc { /lightsrc defpoint3d } def /setlight { 1 dict begin gsave exec [ currentrgbcolor ] /lightcolor exch grestore end def } def %%%%% ### drawsolid ### %% syntaxe : solid i solidfacevisible? --> true si la face est visible /solidfacevisible? { 4 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetsommetface) == quit } if solid i solidgetface length 2 le { true } { /ligne_de_vue { solid i solidcentreface GetCamPos vecteur3d } def /normale_face { solid i solidnormaleface } def ligne_de_vue normale_face scalprod3d 0 gt } ifelse end } def %% syntaxe : solid i affectecouleursolid_facei --> si la couleur de %% la face i est definie, affecte fillstyle a cette couleur /affectecouleursolid_facei { 3 dict begin /i exch def /solid exch def solid solidgetfcolors /FC exch def FC length 1 sub i ge { FC i get length 1 ge { /fillstyle FC i get ( fill) append cvx true } { false } ifelse } { false } ifelse end {def} if } def %% syntaxe : A solid i dessinefacecachee /dessinefacecachee { 6 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans dessinefacecachee) == quit } if /A exch def /F solid solidgetfaces def /S solid solidgetsommets def solid i solidfacevisible? not { %% face cachee => on prend chacune des aretes de la face et on %% regarde si elle est deja dessinee. 4 dict begin /n F i get length def %% nb de sommets de la face 0 1 n 1 sub { /k exch def /k1 F i k get_ij def %% indice sommet1 /k2 F i k 1 add n mod get_ij def %% indice sommet2 A k1 k2 get_ij not { gsave currentlinewidth .5 mul setlinewidth pointilles [S k1 getp3d S k2 getp3d] ligne3d A k1 k2 true put_ij A k2 k1 true put_ij grestore } if } for end } if end } def %% syntaxe : A solid i dessinefacevisible /dessinefacevisible { 8 dict begin /i exch def /solid exch def /A exch def solid issolid not { (Error : mauvais type d argument dans dessinefacevisible) == quit } if /F solid solidgetfaces def /S solid solidgetsommets def solid i solidfacevisible? { /n F i get length def %% nb de sommets de la face startest { %% choix de la couleur /lightcolor where { pop /coeff lightintensity solid i solidnormaleface normalize3d solid i solidcentreface lightsrc vecteur3d normalize3d scalprod3d mul 0 max 1 min def /fillstyle { lightcolor {coeff mul} apply setcolor fill } def solidgrid not { lightcolor {coeff mul} apply setcolor } if } { /lightsrc where { pop /coeff lightintensity solid i solidnormaleface normalize3d solid i solidcentreface lightsrc vecteur3d normalize3d scalprod3d mul 0 max 1 min def /lacouleur [ gsave solid solidgetfcolors i get cvx exec currentrgbcolor grestore ] def /fillstyle { lacouleur {coeff mul} apply setcolor fill } def solidgrid not { lacouleur {coeff mul} apply setcolor } if } { % solid F i get length affectecouleursolid_ncotes solid i affectecouleursolid_facei } ifelse } ifelse } if /face_a_dessiner [ %% face visible : F [i] 0 1 n 1 sub { /j exch def solid j i solidgetsommetface } for ] def face_a_dessiner polygone3d /lignedeniveau [] def %% trace de la ligne de niveau tracelignedeniveau? { gsave linewidthlignedeniveau setlinewidth couleurlignedeniveau 0 1 n 1 sub { /j exch def face_a_dessiner j getp3d face_a_dessiner j 1 add n mod getp3d hauteurlignedeniveau segment_inter_planz { 1 dict begin /table exch def /lignedeniveau [ lignedeniveau aload pop table 0 getp3d table length 4 ge { table 1 getp3d } if ] store end } if } for lignedeniveau length 4 ge {lignedeniveau ligne3d} if grestore } if %% on marque les aretes aretescachees { 0 1 n 1 sub { /j exch def /k1 F i j get_ij def %% indice sommet1 /k2 F i j 1 add n mod get_ij def %% indice sommet2 A k1 k2 true put_ij A k2 k1 true put_ij } for } if } if end } def /drawsolid* { 1 dict begin /startest {true} def drawsolid end } def /peintrealgorithme false def /drawsolid** { 2 dict begin /aretescachees false def /peintrealgorithme true def drawsolid* end } def %% syntaxe : solid array drawsolid %% array est en option, il indique les faces triees /drawsolid { 8 dict begin dup issolid not { /ordre exch def } if /solid exch def solid issolid not { (Error : mauvais type d argument dans drawsolid) == quit } if solid nullsolid not { solid solidgetfaces /F exch def solid solidgetsommets /S exch def /n S length 3 idiv def %% tableau des aretes /A [ aretescachees { n { [n {false} repeat] } repeat } if ] def currentdict /ordre known not { peintrealgorithme { %% tri des indices des faces par distance decroissante [ 0 1 F length 1 sub { /i exch def solid i solidcentreface GetCamPos distance3d } for ] doublequicksort pop reverse } { [ 0 1 F length 1 sub { } for ] } ifelse /ordre exch def } if 0 1 F length 1 sub { /k exch def /i ordre k get def gsave A solid i dessinefacevisible grestore } for aretescachees { 0 1 F length 1 sub { /k exch def /i ordre k get def A solid i dessinefacecachee } for } if %% %% si on veut repasser les traits des faces visibles %% 0 1 F length 1 sub { %% /k exch def %% /i ordre k get def %% gsave %% 1 dict begin %% /startest false def %% A solid i dessinefacevisible %% end %% grestore %% } for } if end } def %%%%% ### segment_inter_planz ### %% syntaxe : A B k segment_inter_planz --> array true ou false /segment_inter_planz { 4 dict begin /k exch def /B defpoint3d /A defpoint3d A /zA exch def pop pop B /zB exch def pop pop zA k sub zB k sub mul dup 0 gt { %% pas d intersection pop false } { 0 eq { %% intersection en A ou en B [ zA k eq {A} if zB k eq {B} if ] true } { %% intersection entre A et B [ A B vecteur3d k zA sub zB zA sub div mulv3d A addv3d ] true } ifelse } ifelse end } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% operations sur des solides particuliers %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### dualpolyedre ### %% syntaxe : solid dualpolyedreregulier --> solid %% syntaxe : solid r dualpolyedreregulier --> solid %% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r /dualpolyedreregulier { 20 dict begin dup isnum { /r exch def /projection true def } { /projection false def } ifelse /solid exch def solid dupsolid /result exch def pop /n solid solidnombrefaces def /N solid solidnombresommets def /facesaenlever [] def %% pour chacun des sommets 0 1 N 1 sub { %% sommet d indice i /i exch def %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i /indicesfacesadj solid i solidfacesadjsommet def %% on recupere les centres des faces concernees /nouveauxsommets [ 0 1 indicesfacesadj length 1 sub { /k exch def solid indicesfacesadj k get solidgetsommetsface isobarycentre3d } for ] def %% et on pose G = barycentre de ces points nouveauxsommets isobarycentre3d /G defpoint3d %% il faut ordonner ces sommets nouveauxsommets 0 getp3d /ptref defpoint3d G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d nouveauxsommets duparray exch pop {1 dict begin /M defpoint3d G ptref vecteur3d G M vecteur3d vecteurnormal angle3doriente end} papply3d doublebubblesort pop %% nos sommets sont tries /indicesommetstries exch def projection { %% on projette les sommets sur la sphere /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store } if %% puis on les rajoute au solide /nouveauxindices [ 0 1 nouveauxsommets length 3 idiv 1 sub { /k exch def result nouveauxsommets k getp3d solidaddsommet } for ] def %% ainsi que la face concernee result [ 0 1 indicesommetstries length 1 sub { /k exch def nouveauxindices indicesommetstries k get get } for ] solidaddface /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store } for result [0 1 n 1 sub {} for] solidrmfaces [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply result end } def %%%%% ### solidchampfreine ### %% syntaxe : solid coeff i solidchampfreine -> - %% syntaxe : solid coeff array solidchampfreine -> - %% syntaxe : solid coeff solidchampfreine -> - %% syntaxe : solid coeff str solidchampfreine -> - %% syntaxe : solid coeff bool solidchampfreine -> - /solidchampfreine { 10 dict begin dup isbool { /rmfacecentrale exch def } { /rmfacecentrale true def } ifelse dup isstring { /couleurface exch def } if 2 copy pop issolid { %% 2 arguments --> on champfreine tout 2 copy pop solidnombrefaces /n exch def /table [n 1 sub -1 0 {} for] def } { %% 1 tableau --> il donne les faces a enlever dup isarray { /table exch bubblesort reverse def } { %% 1 seule face a enlever [ exch ] /table exch def } ifelse } ifelse /coeff exch def /solid exch def 0 1 table length 1 sub { /i exch def solid coeff table i get currentdict /couleurface known { couleurface } if rmfacecentrale s@lidchampfreineface } for end } def %% syntaxe : solid coeff i s@lidchampfreineface /s@lidchampfreineface { 10 dict begin /rmfacecentrale exch def dup isstring { /couleurface exch def } if /indice_a_chamfreiner exch def /i indice_a_chamfreiner def /coeff exch def /solid exch def solid issolid not { (Erreur : mauvais type d argument dans champfreine) == quit } if /n solid solidnombresommets def /F solid i solidgetsommetsface def /Findex solid i solidgetface def /ni F length 3 idiv def /couleurfaceorigine solid i solidgetfcolor def F isobarycentre3d /G defpoint3d %% on ajoute les nouveaux sommets /Sindex [] def 0 1 ni 1 sub { /j exch def /Sindex [ Sindex aload pop solid G F j getp3d vecteur3d coeff mulv3d G addv3d solidaddsommet ] store } for %% Sindex contient les indices des nouveaux sommets %% on prepare les faces a ajouter /facestoadd [] def /facestoadd [facestoadd aload pop 0 1 ni 1 sub { /j exch def [Findex j get Findex j 1 add ni mod get Sindex j 1 add ni mod get Sindex j get] } for ] store 0 1 ni 1 sub { /i exch def solid facestoadd i get solidaddface } for %% on enleve la face d origine solid indice_a_chamfreiner solidrmface %% on ajuste les couleurs des nouvelles faces /N solid solidnombrefaces def 0 1 ni 1 sub { /i exch def solid N 1 sub i sub couleurfaceorigine solidputfcolor } for %% puis on ajoute eventuellement la face centrale rmfacecentrale not { solid [0 1 ni 1 sub { /j exch def Sindex j get } for] solidaddface %% en ajustant la couleur de cette derniere solid N currentdict /couleurface known { couleurface } { couleurfaceorigine } ifelse solidputfcolor } if end } def %%%%% ### solidtronque ### %% syntaxe : solid indicesommet k solidtronque --> solid %% syntaxe : solid array k solidtronque --> solid %% syntaxe : solid k solidtronque --> solid %% k entier > 0, array = tableau des indices des sommets /solidtronque { 10 dict begin /coeff exch def dup issolid { dup solidnombresommets /N exch def /table [0 1 N 1 sub {} for] def } { dup isarray { /table exch def } { [ exch ] /table exch def } ifelse } ifelse /solid exch def solid dupsolid /result exch def pop /n solid solidnombrefaces def 0 1 table length 1 sub { table exch get /no exch def result no solidgetsommet /sommetvise defpoint3d %% on recup les sommets adjacents au sommet vise /sommetsadj solid no solidsommetsadjsommet def %% on calcule les nouveaux sommets /nouveauxsommets [ 0 1 sommetsadj length 1 sub { /i exch def solid sommetsadj i get solidgetsommet } for ] {sommetvise exchp3d coeff ABpoint3d} papply3d def %% on pose G = barycentre de ces points nouveauxsommets isobarycentre3d /G defpoint3d %% il faut ordonner ces sommets nouveauxsommets 0 getp3d /ptref defpoint3d G result no solidgetsommet vecteur3d /vecteurnormal defpoint3d %% on construit le tableau des angles ordonnes par rapport %% a la normale nouveauxsommets duparray exch pop {1 dict begin /M defpoint3d G ptref vecteur3d G M vecteur3d vecteurnormal angle3doriente end} papply3d doublebubblesort pop %% nos sommets sont tries /indicesommetstries exch def %% on rajoute les sommets au solide, et on note les nouveaux indices /nouveauxindices [ 0 1 nouveauxsommets length 3 idiv 1 sub { /k exch def result nouveauxsommets k getp3d solidaddsommet } for ] def %% on ajoute la face concernee result [ 0 1 indicesommetstries length 1 sub { /k exch def nouveauxindices indicesommetstries k get get } for ] solidaddface result no solidfacesadjsommet /lesfaces exch def %% on examine la face d indice i, et on elimine le %% sommet vise 0 1 lesfaces length 1 sub { /i exch def /j lesfaces i get def /F result j solidgetface def result [ 0 1 F length 1 sub { /k exch def F k get dup no eq {pop} if } for ] j exch solidputface } for } for table bubblesort reverse {result exch solidrmsommet} apply result end } def %%%%% ### dualpolyedre ### %% syntaxe : solid dualpolyedreregulier --> solid %% syntaxe : solid r dualpolyedreregulier --> solid %% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r /dualpolyedreregulier { 20 dict begin dup isnum { /r exch def /projection true def } { /projection false def } ifelse /solid exch def solid dupsolid /result exch def pop /n solid solidnombrefaces def /N solid solidnombresommets def /facesaenlever [] def %% pour chacun des sommets 0 1 N 1 sub { %% sommet d indice i /i exch def %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i /indicesfacesadj solid i solidfacesadjsommet def %% on recupere les centres des faces concernees /nouveauxsommets [ 0 1 indicesfacesadj length 1 sub { /k exch def solid indicesfacesadj k get solidgetsommetsface isobarycentre3d } for ] def %% et on pose G = barycentre de ces points nouveauxsommets isobarycentre3d /G defpoint3d %% il faut ordonner ces sommets nouveauxsommets 0 getp3d /ptref defpoint3d G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d nouveauxsommets duparray exch pop {1 dict begin /M defpoint3d G ptref vecteur3d G M vecteur3d vecteurnormal angle3doriente end} papply3d doublebubblesort pop %% nos sommets sont tries /indicesommetstries exch def projection { %% on projette les sommets sur la sphere /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store } if %% puis on les rajoute au solide /nouveauxindices [ 0 1 nouveauxsommets length 3 idiv 1 sub { /k exch def result nouveauxsommets k getp3d solidaddsommet } for ] def %% ainsi que la face concernee result [ 0 1 indicesommetstries length 1 sub { /k exch def nouveauxindices indicesommetstries k get get } for ] solidaddface /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store } for result [0 1 n 1 sub {} for] solidrmfaces [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply result end } def %%%%% ### newgeode ### %% syntaxe : solid r newgeode --> solid %% syntaxe : N r newgeode --> solid %% N in {3,4,5} -> polyhedre de depart, r = niveau de recursion /newgeode { 2 dict begin /r exch def dup issolid not { /N exch def N 3 eq { 1 newtetraedre } { N 4 eq { 1 newoctaedre } { 1 newicosaedre } ifelse } ifelse } if r { 15 dict begin /solid exch def solid dupsolid /result exch def pop /n solid solidnombrefaces def n 1 sub -1 0 { /i exch def %% la face d indice i solid i solidgetface /F exch def /i0 F 0 get def /i1 F 1 get def /i2 F 2 get def solid i0 solidgetsommet /A0 defpoint3d solid i1 solidgetsommet /A1 defpoint3d solid i2 solidgetsommet /A2 defpoint3d A0 A1 milieu3d normalize3d /A01 defpoint3d A1 A2 milieu3d normalize3d /A12 defpoint3d A2 A0 milieu3d normalize3d /A20 defpoint3d result A01 solidaddsommet /i01 exch def result A12 solidaddsommet /i12 exch def result A20 solidaddsommet /i20 exch def result i solidrmface result [i0 i01 i20] solidaddface result [i01 i1 i12] solidaddface result [i01 i12 i20] solidaddface result [i20 i12 i2] solidaddface } for result end } repeat end } def %% syntaxe : N r newdualgeode --> solid /newdualgeode { newgeode 1 dualpolyedreregulier } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% quelques solides precalcules %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ### newface ### %% syntaxe : array newmonoface -> solid %% ou array = tableau de points 2d /newmonoface { 4 dict begin /table exch def /n table length 2 idiv def /S table {0} papply def /F [ [0 1 n 1 sub {} for] ] def S F generesolid end } def %% syntaxe : array newbiface -> solid %% ou array = tableau de points 2d /newbiface { newmonoface dup videsolid } def %%%%% ### newpolreg ### %% syntaxe : r n newpolreg --> solid /newpolreg { 5 dict begin /n exch def /r exch def /S [ 0 360 n div 360 360 n div sub { /theta exch def theta cos r mul theta sin r mul 0 } for ] def /F [ [0 1 n 1 sub {} for] ] def S F generesolid dup videsolid end } def %%%%% ### newgrille ### %% syntaxe : xmin xmax ymin ymax [dx dy] newgrille -> solid %% syntaxe : xmin xmax ymin ymax [nx ny] newgrille -> solid %% syntaxe : xmin xmax ymin ymax {mode} newgrille -> solid %% syntaxe : xmin xmax ymin ymax newgrille -> solid /newgrille { 10 dict begin [[/nx /ny] [1 1] [1. 1.] [1. 1.] [1. 1.] [.5 .5]] gestionsolidmode %% ny nb d etages en y %% nx nb d etages en x /biface false def [nx ny] {0} newsurfaceparametree end } def %% %% syntaxe : xmin xmax ymin ymax [dx dy] {f} newsurface -> solid %% %% f : R^2 -> R /newsurface { true newsurfaceparametree } def /biface true def /newsurfaceparametree { 10 dict begin dup isbool { pop /surfz true def } { /surfz false def } ifelse /f_surface exch def [[/nx /ny] [2 2] [4 4] [1. 1.] [1. 1.] [.25 .25]] gestionsolidmode %% ny nb d etages en y %% nx nb d etages en x /ymax exch def /ymin exch def /xmax exch def /xmin exch def nx isinteger not { %% alors nx est un dx /nx xmax xmin sub nx div cvi store } if ny isinteger not { %% alors ny est un dy /ny ymax ymin sub ny div cvi store } if /dy ymax ymin sub ny div def %% le pas sur y /dx xmax xmin sub nx div def %% le pas sur x /S [ 0 1 nx { /i exch def 0 1 ny { /j exch def /u xmin i dx mul add def /v ymin j dy mul add def u v surfz {2 copy} if f_surface pstrickactionR3 } for } for ] def /F [ 0 1 nx 1 sub { /i exch def 0 1 ny 1 sub { /j exch def [ j 1 add i ny 1 add mul add j i ny 1 add mul add j ny 1 add add i ny 1 add mul add j ny 2 add add i ny 1 add mul add ] } for } for %% 0 1 0 {%nx 1 sub { %% /i exch def %% 0 1 0 {%ny 2 sub { %% /j exch def %% [ %% j 1 add %% i ny mul add %% j %% i ny mul add %% ny 1 add j add %% i ny mul add %% ny 2 add j add %% i ny mul add %% ] %% } for %% } for ] def S F generesolid biface {dup videsolid} if end } def %%%%% ### newgrillecirculaire ### %% syntaxe : r option newgrillecirculaire -> solid /newgrillecirculaire { 6 dict begin [[/K /N] [6 6] [6 8] [10 8] [16 12] [16 36]] gestionsolidmode %% N = nb de meridiens (diviseur de 360 = 2^4 * 3^2 * 5) %% K = nb d horizontales (diviseur de 160 = 2^5 * 5) /r exch def /F [ %% 1er etage 1 1 N { /i exch def [0 i i N mod 1 add] } for %% etages suivants 0 1 K 2 sub { /j exch def 1 1 N { /i exch def [i j N mul add i N add j N mul add i N mod N add 1 add j N mul add i N mod 1 add j N mul add] } for } for ] def %% tableau des sommets /S [ 0 0 0 1 1 K { /j exch def 1 1 N { /i exch def /theta i 360 mul N div def theta cos r j mul K div mul theta sin r j mul K div mul 2 copy exch atan 90 div } for } for ] def S F generesolid end } def %%%%% ### newruban ### %% syntaxe : array h u [n] newruban -> solid d axe (O, u), de maillage vertical n %% syntaxe : array h u newruban -> solid d axe (O, u), %% syntaxe : array h newruban -> solid d axe (O, k), %% ou array tableau de points 2d /newruban { 7 dict begin %% N = nb d etages [[/N] [1] [1] [1] [3] [4]] gestionsolidmode 2 copy pop isarray { /u {0 0 1} def } { /u defpoint3d } ifelse u 0 eq { (Error : 3eme composante nulle dans le vecteur pour newruban) == quit } if pop pop /h exch def /table exch def %% n = indice du dernier point /n table length 2 idiv 1 sub def %% vecteur de translation u h u norme3d div mulv3d /v defpoint3d %% tableau des sommets /S [ 0 1 N { /j exch def 0 1 n { /i exch def table i getp 0 v N j sub N div mulv addv3d } for } for ] def /F [ %% faces etage 1 1 N { /j exch def 1 1 n { /i exch def [i j 1 sub n 1 add mul add i 1 sub j 1 sub n 1 add mul add n 1 add i add 1 sub j 1 sub n 1 add mul add n 1 add i add j 1 sub n 1 add mul add] } for } for ] def S F generesolid dup videsolid end } def %%%%% ### newicosaedre ### /newicosaedre { 3 dict begin /a exch def /S [ 0.8944271 0 0.4472137 0.2763932 0.8506507 0.4472137 -0.7236067 0.5257311 0.4472137 -0.7236067 -0.5257311 0.4472137 0.2763932 -0.8506507 0.4472137 0 0 1 0 0 -1 -0.8944271 0 -0.4472137 -0.2763932 -0.8506507 -0.4472137 0.7236067 -0.5257311 -0.4472137 0.7236067 0.5257311 -0.4472137 -0.2763932 0.8506507 -0.4472137 ] {a mulv3d} papply3d def /F [ [0 1 5] %% 1 2 6 ] [1 2 5] %% 2 3 6 ] [2 3 5] %% 3 4 6 ] [3 4 5] %% 4 5 6 ] [4 0 5] %% 5 1 6 ] [9 0 4] %% 10 1 5 ] [0 9 10] %% 1 10 11] [10 1 0] %% 11 2 1 ] [1 10 11] %% 2 11 12] [11 2 1] %% 12 3 2 ] [2 11 7] %% 3 12 8 ] [2 7 3] %% 3 8 4 ] [3 7 8] %% 4 8 9 ] [3 8 4] %% 4 9 5 ] [4 8 9] %% 5 9 10 ] [6 7 11] %% 7 8 12 ] [6 8 7] %% 7 9 8 ] [6 9 8] %% 7 10 9 ] [6 10 9] %% 7 11 10] [6 11 10] %% 7 12 11] ] def S F generesolid end } def %%%%% ### newdodecaedre ### /newdodecaedre { 3 dict begin /a exch def /S [ 0 0.607062 0.7946545 -0.5773503 0.1875925 0.7946545 -0.3568221 -0.4911235 0.7946545 0.3568221 -0.4911235 0.7946545 0.5773503 0.1875925 0.7946545 0 0.982247 0.1875925 -0.9341724 0.303531 0.1875925 -0.5773503 -0.7946645 0.1875925 0.5773503 -0.7946645 0.1875925 0.9341724 0.303531 0.1875925 0 -0.982247 -0.1875925 0.9341724 -0.303531 -0.1875925 0.5773503 0.7946545 -0.1875925 -0.5773503 0.7946545 -0.1875925 -0.9341724 -0.303531 -0.1875925 -0.5773503 -0.1875925 -0.7946545 -0.3568221 0.4911235 -0.7946545 0.3568221 0.4911235 -0.7946545 0.5773503 -0.1875925 -0.7946545 0 -0.607062 -0.7946545 ] {a mulv3d} papply3d def /F [ [0 1 2 3 4] [4 3 8 11 9] [4 9 12 5 0] [0 5 13 6 1] [1 6 14 7 2] [2 7 10 8 3] [10 19 18 11 8] [11 18 17 12 9] [12 17 16 13 5] [13 16 15 14 6] [14 15 19 10 7] [15 16 17 18 19] ] def S F generesolid end } def %%%%% ### newoctaedre ### /newoctaedre { 3 dict begin /a exch def %%Sommets /S [ 0 0 1 1 0 0 0 1 0 -1 0 0 0 -1 0 0 0 -1 ] {a mulv3d} papply3d def /F [ [0 4 1] [1 2 0] [0 2 3] [3 4 0] [1 5 2] [2 5 3] [3 5 4] [4 5 1] ] def S F generesolid end } def %%%%% ### newtetraedre ### /newtetraedre { 3 dict begin /r exch def %%Tetraedre /S [ 0 0 1 -0.4714045 -0.8164965 -1 3 div 0.942809 0 -1 3 div -0.4714045 0.8164965 -1 3 div ] {r mulv3d} papply3d def /F [ [0 1 2] [0 2 3] [0 3 1] [1 3 2] ] def S F generesolid end } def %%%%% ### newcube ### /newcube { 3 dict begin [[/n] [1] [1] [1] [3] [4]] gestionsolidmode /a exch 2 div def n 1 le { /F [ [0 1 2 3] [0 4 5 1] [1 5 6 2] [2 6 7 3] [0 3 7 4] [4 7 6 5] ] def %% tableau des sommets /S [ 1 1 1 %% 0 -1 1 1 %% 1 -1 -1 1 %% 2 1 -1 1 %% 3 1 1 -1 %% 4 -1 1 -1 %% 5 -1 -1 -1 %% 6 1 -1 -1 %% 7 ] {a mulv3d} papply3d def S F generesolid } { /dl 2 n div def /N n dup mul n add 4 mul def /n1 n 1 sub dup mul def %% nb sommets centre d une face %% tableau des sommets /S1 [ 0 1 n 1 sub { /j exch def 0 1 n { /i exch def -1 i dl mul add -1 j dl mul add 1 } for } for ] def /S2 S1 {-90 0 0 rotateOpoint3d} papply3d def /S3 S2 {-90 0 0 rotateOpoint3d} papply3d def /S4 S3 {-90 0 0 rotateOpoint3d} papply3d def /S5 [ 1 1 n 1 sub { /j exch def 1 1 n 1 sub { /i exch def 1 -1 i dl mul add -1 j dl mul add } for } for ] def /S6 [ 1 1 n 1 sub { /j exch def 1 1 n 1 sub { /i exch def -1 -1 i dl mul add -1 j dl mul add } for } for ] def %% tableau des faces /F1 [ 0 1 n 1 sub { /j exch def 0 1 n 1 sub { /i exch def [ i n 1 add j mul add dup 1 add dup n 1 add add dup 1 sub ] } for } for ] def %% syntaxe : i sommettourgauche --> l indice du i-eme sommet du tour %% de la face gauche (en commencant par l indice 0). ATTENTION : %% utilise la variable globale n = nb d etages /sommettourgauche { 1 dict begin /i exch def i 4 n mul ge { i (Error: indice trop grand dans sommettourgauche) == exit } if n n 1 add i mul add end } def %% syntaxe : i sommetcentregauche --> l indice du i-eme sommet du centre %% de la face gauche (en commencant par l indice 0). ATTENTION : %% utilise les variables globales n = nb d etages, et N = nb sommets %% des 4 1eres faces /sommetcentregauche { 1 dict begin /i exch def i n 1 sub dup mul ge { i (Error: indice trop grand dans sommetcentregauche) == exit } if N i add end } def /F5 [ %%%%% la face gauche %%%%% %% le coin superieur gauche [ 1 sommettourgauche 0 sommettourgauche n 4 mul 1 sub sommettourgauche n1 n 1 sub sub sommetcentregauche ] %% la bande superieure (i from 1 to n-2) 1 1 n 2 sub { /i exch def [ i 1 add sommettourgauche i sommettourgauche n1 n sub i add sommetcentregauche n1 n sub i 1 add add sommetcentregauche ] } for %% le coin superieur droit [ n sommettourgauche n 1 sub sommettourgauche n1 1 sub sommetcentregauche n 1 add sommettourgauche ] %% la descente gauche %% j from 1 to n-2 1 1 n 2 sub { /j exch def [ n1 n 1 sub j mul sub sommetcentregauche n 4 mul j sub sommettourgauche n 4 mul j 1 add sub sommettourgauche n1 n 1 sub j 1 add mul sub sommetcentregauche ] } for %% les bandes centrales (j from 1 to n-2 et i from 1 to n-2) 1 1 n 2 sub { /j exch def 1 1 n 2 sub { /i exch def [ n1 i n 1 sub j 1 sub mul add sub sommetcentregauche n1 i 1 add n 1 sub j 1 sub mul add sub sommetcentregauche n1 i 1 add n 1 sub j mul add sub sommetcentregauche n1 i n 1 sub j mul add sub sommetcentregauche ] } for } for %% la descente droite 1 1 n 2 sub { /j exch def [ n j add sommettourgauche n1 1 sub j 1 sub n 1 sub mul sub sommetcentregauche n1 1 sub j n 1 sub mul sub sommetcentregauche n j 1 add add sommettourgauche ] } for %% le coin inferieur gauche [ 0 sommetcentregauche n 3 mul 1 add sommettourgauche n 3 mul sommettourgauche n 3 mul 1 sub sommettourgauche ] %% la bande inferieure (i from 1 to n-2) 1 1 n 2 sub { /i exch def [ i sommetcentregauche i 1 sub sommetcentregauche n 3 mul i sub sommettourgauche n 3 mul i sub 1 sub sommettourgauche ] } for %% le coin inferieur droit [ n 2 mul 1 sub sommettourgauche n 2 sub sommetcentregauche n 2 mul 1 add sommettourgauche n 2 mul sommettourgauche ] ] def %% syntaxe : i sommettourdroit --> l indice du i-eme sommet du tour %% de la face droit (en commencant par l indice 0). ATTENTION : %% utilise la variable globale n = nb d etages /sommettourdroit { 1 dict begin /i exch def i 4 n mul ge { i (Error: indice trop grand dans sommettourdroit) == exit } if n 1 add i mul end } def %% syntaxe : i sommetcentredroit --> l indice du i-eme sommet du centre %% de la face droit (en commencant par l indice 0). ATTENTION : %% utilise les variables globales n = nb d etages, et N = nb sommets %% des 4 1eres faces /sommetcentredroit { 1 dict begin /i exch def i n 1 sub dup mul ge { i (Error: indice trop grand dans sommetcentredroit) == exit } if N n1 add i add end } def /F6 [ %% coin superieur droit [ 0 sommettourdroit 1 sommettourdroit n1 n 1 sub sub sommetcentredroit 4 n mul 1 sub sommettourdroit ] %% coin superieur gauche [ n 1 sub sommettourdroit n sommettourdroit n 1 add sommettourdroit n1 1 sub sommetcentredroit ] %% coin inferieur gauche [ n 2 sub sommetcentredroit 2 n mul 1 sub sommettourdroit 2 n mul sommettourdroit 2 n mul 1 add sommettourdroit ] %% coin inferieur droit [ 3 n mul 1 add sommettourdroit 0 sommetcentredroit 3 n mul 1 sub sommettourdroit 3 n mul sommettourdroit ] %% bande superieure 1 1 n 2 sub { /i exch def [ i sommettourdroit i 1 add sommettourdroit n 1 sub n 2 sub mul i add sommetcentredroit n 1 sub n 2 sub mul i 1 sub add sommetcentredroit ] } for %% bande inferieure 1 1 n 2 sub { /i exch def [ i 1 sub sommetcentredroit i sommetcentredroit 3 n mul 1 sub i sub sommettourdroit 3 n mul i sub sommettourdroit ] } for %% descente gauche 1 1 n 2 sub { /i exch def [ n1 1 sub i 1 sub n 1 sub mul sub sommetcentredroit n i add sommettourdroit n i 1 add add sommettourdroit n1 1 sub i n 1 sub mul sub sommetcentredroit ] } for %% descente droite 1 1 n 2 sub { /i exch def [ 4 n mul i sub sommettourdroit n 1 sub n 1 sub i sub mul sommetcentredroit n 1 sub n 2 sub i sub mul sommetcentredroit 4 n mul i sub 1 sub sommettourdroit ] } for %% bandes interieures 1 1 n 2 sub { /j exch def 1 1 n 2 sub { /i exch def [ n 1 sub j mul i 1 sub add sommetcentredroit n 1 sub j mul i add sommetcentredroit n 1 sub j 1 sub mul i add sommetcentredroit n 1 sub j 1 sub mul i 1 sub add sommetcentredroit ] } for } for ] def /F2 F1 {{n dup mul n add add} apply} apply def /F3 F2 {{n dup mul n add add} apply} apply def /F4 F3 {{n dup mul n add add} apply} apply def S1 S2 append S3 append S4 append S5 append S6 append {a mulv3d} papply3d F1 F2 append F3 append F4 append {{N mod} apply} apply F5 append F6 append generesolid } ifelse end } def %%%%% ### newparallelepiped ### % 14 octobre 2006 /newparallelepiped { 2 dict begin /c exch 2 div def /b exch 2 div def /a exch 2 div def /F [ [0 1 2 3] [0 4 5 1] [1 5 6 2] [2 6 7 3] [0 3 7 4] [4 7 6 5] ] def %% tableau des sommets /S [ a b c %% 0 a neg b c %% 1 a neg b neg c %% 2 a b neg c %% 3 a b c neg %% 4 a neg b c neg %% 5 a neg b neg c neg %% 6 a b neg c neg %% 7 ] def S F generesolid } def %%%%% ### newcylindre ### %% syntaxe : z0 r0 z1 newcylindre -> solide /newcylindre { dup xcheck { 2 index exch } { dup isarray { 2 index exch } { 1 index } ifelse } ifelse newtronccone } def %% syntaxe : z0 r0 z1 newcylindrecreux -> solide /newcylindrecreux { newcylindre dup creusesolid } def %%%%% ### newtronccone ### %% syntaxe : z0 r0 z1 r1 newtronccone -> solid /newtronccone { 11 dict begin [[/n /N] [1 6] [1 8] [1 10] [3 12] [5 18]] gestionsolidmode /r1 exch def /z1 exch def /r0 exch def /z0 exch def /dz z1 z0 sub n div def /dr r1 r0 sub n div def /FE [ [0 1 N 1 sub {} for] [n 1 add N mul 1 sub -1 n N mul {} for] 0 1 n 1 sub { /k exch def k N mul 1 add 1 k 1 add N mul 1 sub { /i exch def [i i 1 sub N i add 1 sub N i add] } for [k N mul k 1 add N mul 1 sub k 2 add N mul 1 sub k 1 add N mul] } for ] def %% tableau des sommets /S [ n -1 0 { /k exch def 0 1 N 1 sub { /i exch def 360 N idiv i mul cos r0 dr k mul add mul 360 N idiv i mul sin r0 dr k mul add mul z0 dz k mul add } for } for ] def S FE generesolid end } def %% syntaxe : z0 r0 z1 r1 newtroncconecreux -> solid /newtroncconecreux { newtronccone dup creusesolid } def %%%%% ### newcone ### %% syntaxe : z0 r0 z1 newcone -> solid /newcone { 11 dict begin [ [/n /N] [1 6] [1 8] [1 10] [3 12] [5 18] ] gestionsolidmode /z1 exch def /r0 exch def /z0 exch def /dz z1 z0 sub n div def /dr r0 n div def /F [ %% la base [N 1 sub -1 0 {} for] %% le dernier etage n 1 sub N mul 1 add 1 n N mul 1 sub { /i exch def [i 1 sub i n N mul] } for [n N mul 1 sub n 1 sub N mul n N mul] %% les autres etages 0 1 n 2 sub { /j exch def 0 N j mul add 1 N N j mul add 2 sub { /i exch def [i i 1 add dup N add dup 1 sub] } for [N N j mul add 1 sub N j mul dup N add dup N add 1 sub] } for ] def %% tableau des sommets /S [ %% etage no j (in [1; n]) 0 1 n 1 sub { /j exch def 0 1 N 1 sub { /i exch def 360 N idiv i mul cos r0 dr j mul sub mul 360 N idiv i mul sin r0 dr j mul sub mul z0 dz j mul add } for } for 0 0 z1 ] def S F generesolid end } def %% syntaxe : z0 r0 z1 newconecreux -> solid /newconecreux { newcone dup 0 solidrmface dup videsolid } def %%%%% ### newtore ### %% syntaxe : r R newtore -> solid /newtore { 10 dict begin [[/n1 /n2] [4 5] [6 10] [8 12] [9 18] [18 36]] gestionsolidmode /n2 n2 3 max store /n1 n1 2 max store /R exch def /r exch def /S [ 0 1 n1 1 sub { /i exch def 360 n1 div i mul cos r mul R add 360 n1 div i mul sin r mul } for ] def S [n2] newanneau end } def %%%%% ### newprisme ### /newprismedroit { [[/N] [1] [1] [1] [3] [6]] gestionsolidmode 0 0 1 [N] newprisme } def %% syntaxe : array N z0 z1 u newprisme -> solid d axe (O, u), %% ou array tableau de points 2d /newprisme { 7 dict begin [[/N] [1] [1] [1] [3] [6]] gestionsolidmode dup 0 eq { (Error : 3eme composante nulle dans le vecteur pour newprisme) == quit } if /u defpoint3d /z1 exch def /z0 exch def %% N = nb d etages /table exch def %% n = indice du dernier point /n table length 2 idiv 1 sub def %% vecteur de translation u z1 z0 sub u norme3d div mulv3d /v defpoint3d %% tableau des sommets /S [ 0 1 N { /j exch def 0 1 n { /i exch def table i getp z0 v N j sub N div mulv addv3d } for } for ] def /F [ %% face superieure [0 1 n {} for] %% base [N 1 add n 1 add mul 1 sub -1 N n 1 add mul {} for] %% faces etage 1 1 N { /j exch def 1 1 n { /i exch def [i j 1 sub n 1 add mul add i 1 sub j 1 sub n 1 add mul add n 1 add i add 1 sub j 1 sub n 1 add mul add n 1 add i add j 1 sub n 1 add mul add] } for [0 j 1 sub n 1 add mul add n j 1 sub n 1 add mul add 2 n mul 1 add j 1 sub n 1 add mul add n 1 add j 1 sub n 1 add mul add] } for ] def S F generesolid end } def %%%%% ### newsphere ### %% syntaxe : r option newsphere -> solid /newsphere { 2 dict begin [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode -90 90 [K N] newcalottesphere end } def %% syntaxe : r phi theta option newcalottesphere -> solid /newcalottesphere { 6 dict begin [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode %% test de beta (ex-theta) dup 90 eq { /beta exch def /idebut 1 def } { /beta exch 80 min -80 max def /idebut 0 def } ifelse %% test de alpha (ex-phi) dup -90 eq { /alpha exch def } { /alpha exch beta min -80 max def } ifelse /r exch def beta 90 eq { alpha -90 eq { /ifin K def /db alpha beta sub K 1 add div def } { /ifin K def /db alpha beta sub K div def } ifelse } { alpha -90 eq { /ifin K 1 sub def /db alpha beta sub K div def } { /ifin K 1 sub def /db alpha beta sub K 1 sub div def } ifelse } ifelse %% nombre de sommets -2 /nb N K mul def %% tableau des sommets /S [ idebut 1 ifin { /j exch def /phi beta j db mul add def phi cos r mul /r_tmp exch def 0 1 N 1 sub { /i exch def 360 N idiv i mul cos r_tmp mul 360 N idiv i mul sin r_tmp mul phi sin r mul } for } for 0 0 r neg 0 0 r ] def /F [ %% calotte inferieure alpha -90 eq { 1 1 N 1 sub { /i exch def [ nb nb i sub nb i 1 add sub ] } for [nb nb N sub nb 1 sub] } { [nb 1 sub -1 nb N sub {} for ] } ifelse %% calotte superieure beta 90 eq { 0 1 N 1 sub { /i exch def [i i 1 add N mod N K mul 1 add] } for } { [0 1 N 1 sub {} for] } ifelse 1 1 K 1 sub { /j exch def [ j N mul j N mul 1 add j 1 sub N mul 1 add j 1 sub N mul ] N 2 sub {dup {1 add} apply} repeat [ j 1 add N mul 1 sub j N mul j 1 sub N mul j N mul 1 sub ] } for ] def S F generesolid end } def %% syntaxe : r phi theta option newcalottespherecreuse -> solid /newcalottespherecreuse { 6 dict begin [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode %% test de beta (ex-theta) dup 90 eq { /beta exch def /idebut 1 def } { /beta exch 80 min -80 max def /idebut 0 def } ifelse %% test de alpha (ex-phi) dup -90 eq { /alpha exch def } { /alpha exch beta min -80 max def } ifelse /r exch def beta 90 eq { alpha -90 eq { /ifin K def /db alpha beta sub K 1 add div def } { /ifin K def /db alpha beta sub K div def } ifelse } { alpha -90 eq { /ifin K 1 sub def /db alpha beta sub K div def } { /ifin K 1 sub def /db alpha beta sub K 1 sub div def } ifelse } ifelse %% nombre de sommets -2 /nb N K mul def %% tableau des sommets /S [ idebut 1 ifin { /j exch def /phi beta j db mul add def phi cos r mul /r_tmp exch def 0 1 N 1 sub { /i exch def 360 N idiv i mul cos r_tmp mul 360 N idiv i mul sin r_tmp mul phi sin r mul } for } for 0 0 r neg 0 0 r ] def /F [ %% calotte inferieure alpha -90 eq { 1 1 N 1 sub { /i exch def [ nb nb i sub nb i 1 add sub ] } for [nb nb N sub nb 1 sub] } { % [nb 1 sub -1 nb N sub {} for ] } ifelse %% calotte superieure beta 90 eq { 0 1 N 1 sub { /i exch def [i i 1 add N mod N K mul 1 add] } for } { % [0 1 N 1 sub {} for] } ifelse 1 1 K 1 sub { /j exch def [ j N mul j N mul 1 add j 1 sub N mul 1 add j 1 sub N mul ] N 2 sub {dup {1 add} apply} repeat [ j 1 add N mul 1 sub j N mul j 1 sub N mul j N mul 1 sub ] } for ] def S F generesolid dup videsolid end } def %%%%% ### newanneau ### %% syntaxe : array n newanneau --> solid %% syntaxe : array {mode} newanneau --> solid %% ou array est un tableau de points de R^2 et n un nombre entier positif /newanneau { 10 dict begin dup isnum { /n exch def [n] } if [[/n2] [6] [12] [24] [32] [36]] gestionsolidmode /n2 n2 3 max store %% on plonge la section dans R^3 par projection sur yOz /S1 exch {0 3 1 roll} papply def %% nombre de sommets /n1 S1 length 3 idiv def /S S1 n2 { duparray {0 0 360 n2 div rotateOpoint3d} papply3d } repeat n2 {append} repeat def /F [ 0 1 n2 1 sub { /j exch def n1 j mul 1 j 1 add n1 mul 2 sub { /i exch def [i 1 add i dup n1 add i n1 1 add add] } for [n1 j mul j 1 add n1 mul 1 sub j 2 add n1 mul 1 sub j 1 add n1 mul] } for ] def S F generesolid end } def %%%%% ### newvecteur ### %% syntaxe : x y z newvecteur /newvecteur { 4 dict begin /A defpoint3d %%Sommets /S [0 0 0 A] def /F [ [0 1] ] def S F generesolid %% /axe exch def [ A ] normalvect_to_orthobase /imK defpoint3d /imJ defpoint3d /imI defpoint3d A norme3d /z exch .3 sub def 0 .1 .3 [1 8] newcone dup (noir) outputcolors {0 0 z translatepoint3d} solidtransform {imI imJ imK transformpoint3d} solidtransform solidfuz end } def %%%%% ### readsolidfile ### %% syntaxe : str readsolidfile -> solid /readsolidfile { 1 dict begin /str exch def [str (-sommets.dat) append run] [str (-faces.dat) append run] generesolid dup [str (-couleurs.dat) append run] solidputfcolors dup [str (-io.dat) append run] solidputinouttable end } def %%%%% ### writesolidfile ### %% syntaxe : solid str writesolidfile -> - /writesolidfile { 10 dict begin /str exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans writesolidfile) == quit } if str (-sommets.dat) append (w) file /lefichiersommets exch def str (-faces.dat) append (w) file /lefichierfaces exch def str (-couleurs.dat) append (w) file /lefichiercouleurs exch def str (-io.dat) append (w) file /lefichierio exch def /S solid solidgetsommets def 0 1 S length 3 idiv 1 sub { /i exch def solid i solidgetsommet /z exch def /y exch def /x exch def lefichiersommets x chaine cvs writestring lefichiersommets 32 write %% espace lefichiersommets y chaine cvs writestring lefichiersommets 32 write %% espace lefichiersommets z chaine cvs writestring lefichiersommets 10 write %% CR } for lefichiersommets closefile /F solid solidgetfaces def 0 1 F length 1 sub { /i exch def /Fi solid i solidgetface def lefichierfaces 91 write %% [ 0 1 Fi length 1 sub { /j exch def lefichierfaces Fi j get chaine cvs writestring lefichierfaces 32 write %% espace } for lefichierfaces 93 write %% ] lefichierfaces 10 write %% CR } for lefichierfaces closefile /C solid solidgetfcolors def 0 1 C length 1 sub { /i exch def lefichiercouleurs 40 write %% ( lefichiercouleurs C i get writestring lefichiercouleurs 41 write %% ) lefichiercouleurs 10 write %% CR } for lefichiercouleurs closefile /IO solid solidgetinouttable def 0 1 3 { /i exch def lefichierio IO i get chaine cvs writestring lefichierio 32 write %% space } for lefichierio closefile end } def %%%%% ### writeobjfile ### %% syntaxe : solid str writeobjfile -> - /writeobjfile { 10 dict begin /str exch (.obj) append def /solid exch def solid issolid not { (Erreur : mauvais type d argument dans writeobjfile) == quit } if /n solid solidnombresommets def str (w) file /lefichier exch def 0 1 n 1 sub { /i exch def solid i solidgetsommet /z exch def /y exch def /x exch def lefichier (v ) writestring lefichier x chaine cvs writestring lefichier 32 write %% espace lefichier y chaine cvs writestring lefichier 32 write %% espace lefichier z chaine cvs writestring lefichier 10 write %% CR } for /n solid solidnombrefaces def 0 1 n 1 sub { /i exch def lefichier (f ) writestring /F solid i solidgetface def F { lefichier exch chaine cvs writestring lefichier 32 write %% espace } apply lefichier 10 write %% CR } for lefichier closefile end } def %%%%% ### newobjfile ### /newobjfile { 3 dict begin /objfilename exch (.obj) append def /v {} def /ok true def /f { ok { %% 1ere fois ] %% ferme les sommets [ [ %% ouvre les faces /ok false store } { %% les autres fois ] %% ferme la face [ %% ouvre la nouvelle } ifelse } def [ %0 0 0 objfilename run ]] /F exch def /S exch def S F generesolid % dup videsolid end } def %%%%% ### newtube ### /tub@dernierk1 [1 0 0] def /tub@dernierk2 [0 1 0] def /tub@dernierk3 [0 0 1] def /inittube { 2 dict begin normalize3d /vect3 defpoint3d normalize3d /vect2 defpoint3d normalize3d /vect1 defpoint3d vect1 norme3d 0 eq { vect2 vect3 vectprod3d /vect1 defpoint3d } if vect2 norme3d 0 eq { vect3 vect1 vectprod3d /vect2 defpoint3d } if vect3 norme3d 0 eq { vect1 vect2 vectprod3d /vect3 defpoint3d } if /tub@dernierk1 [vect1] store /tub@dernierk2 [vect2] store /tub@dernierk3 [vect3] store end } def %% syntaxe : tmin tmax (f) array r newtube -> solid %% array = [K N] /newtube { 10 dict begin /table exch def /K table 0 get def %% nb d etages /N table 1 get def %% nb de points sur le perimetre /@r exch def %% le rayon du tube /str exch def /lafonction str cvx def /laderivee str (') append cvx def /laderivee2nd str ('') append cvx def /tmax exch def /tmin exch def /pas tmax tmin sub K 1 sub div def %% definition des sommets [ tmin pas tmax { /a0 exch def %% definition du repere de Frenet (k1, k2, k3) au point f(a) a0 lafonction pstrickactionR3 /M defpoint3d a0 laderivee normalize3d pstrickactionR3 /k1 defpoint3d a0 laderivee2nd normalize3d pstrickactionR3 /k2 defpoint3d k1 norme3d 0 eq { tub@dernierk1 aload pop pstrickactionR3 /k1 defpoint3d } { /tub@dernierk1 [k1] store } ifelse k2 norme3d 0 eq { tub@dernierk2 aload pop pstrickactionR3 /k2 defpoint3d } { /tub@dernierk2 [k2] store } ifelse k1 k2 vectprod3d normalize3d pstrickactionR3 /k3 defpoint3d k3 norme3d 0 eq { tub@dernierk3 aload pop pstrickactionR3 /k3 defpoint3d } { /tub@dernierk3 [k3] store } ifelse k3 k1 vectprod3d normalize3d pstrickactionR3 /k2 defpoint3d /tub@dernierk2 [k2] store /@n 360 N div def %% le pas angulaire 0 @n 360 @n sub { /@i exch def M k2 @i cos @r mul mulv3d addv3d k3 @i sin @r mul mulv3d addv3d } for } for ] dup length 3 idiv /nb exch def %% definition des faces [ %% face de depart [N 1 sub -1 0 {} for] %% face d arrivee [nb 1 sub N 1 sub {dup 1 sub} repeat] reverse %% les etages /j 0 def tmin pas tmax pas sub { pop 0 1 N 1 sub { /i exch def [ i N j mul add i 1 add N mod N j mul add i 1 add N mod N add N j mul add i N add N j mul add ] } for /j j 1 add store } for ] generesolid end } def %%%%% ### fin insertion ### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% %%%% fin insertion librairie jps %%%% %%%% %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% gestion de chaine de caracteres %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Times-Roman findfont dup length dict begin { 1 index /FID ne {def} {pop pop} ifelse } forall /Encoding ISOLatin1Encoding def currentdict end /Times-Roman-ISOLatin1 exch definefont pop /setTimesRoman { /Times-Roman-ISOLatin1 findfont fontsize scalefont setfont } def /setTimes { setTimesRoman } def %% syntaxe : string x y cctext /cctext { 5 dict begin /y exch def /x exch def /str exch def str stringwidth /wy exch def /wx exch def gsave x y smoveto wx -2 div wy -2 div rmoveto str show grestore end } def %% syntaxe : str x y show_dim --> str x y llx lly wx wy %% attention, doit laisser la pile intacte /show_dim { 3 copy pop pop newpath 0 0 moveto true charpath flattenpath pathbbox closepath newpath } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% procedures pour PSTricks %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% procedures pour \psSolid %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /all (all) def /draw {drawsolid} def /draw* {drawsolid*} def /draw** {drawsolid**} def /writeobj {solidfilename writeobjfile} def /writesolid {solidfilename writesolidfile} def /none {pop} def /gere_pstricks_color_inout { gsave dup [fillincolor] (setrgbcolor) astr2str [fillcolor] (setrgbcolor) astr2str inoutputcolors grestore } def /gere_pstricks_color_out { gsave dup [fillcolor] (setrgbcolor) astr2str outputcolors grestore } def /gere_pstricks_opt { % /CourbeR2 {CourbeR2+} def linecolor solidlinewidth setlinewidth RotX 0 ne RotY 0 ne or RotZ 0 ne or { {RotX RotY RotZ rotateOpoint3d} solidtransform } if CX 0 ne CY 0 ne or CZ 0 ne or { {CX CY CZ translatepoint3d} solidtransform } if /rmfaces rmfaces bubblesort reverse store 0 1 rmfaces length 1 sub { /i exch def dup rmfaces i get solidrmface } for solidhollow { dup videsolid } if activationgestioncouleurs { dup solidwithinfaces { gere_pstricks_color_inout } { gere_pstricks_color_out } ifelse } if 0 1 fcol length 2 idiv 1 sub { /i exch def dup fcol 2 i mul get fcol 2 i mul 1 add get solidputfcolor } for tx@Dict /pst-transformoption known { dup {pst-transformoption} solidtransform } if solidinouthue length 0 gt { dup solidinouthue solidputinouthuecolors } { solidhue length 0 gt { dup solidhue solidputhuecolors } if solidinhue length 0 gt { dup solidinhue solidputinhuecolors } if } ifelse dup action noir solidnumf length 0 ne { solidnumf 0 get isstring { dup projectionsifacevisible solidnumfaces } { dup solidnumf projectionsifacevisible solidnumfaces } ifelse } if solidshow length 0 ne { solidshow 0 get isstring { dup solidshowsommets } { dup solidshow solidshowsommets } ifelse } if solidnum length 0 ne { solidnum 0 get isstring { dup solidnumsommets } { dup solidnum solidnumsommets } ifelse } { %% pop } ifelse tx@Dict /solidname known { solidname exch bind def tx@Dict /solidname undef } { pop } ifelse } def /pst-octahedron { a newoctaedre gere_pstricks_opt } def /pst-dodecahedron { a newdodecaedre gere_pstricks_opt } def /pst-icosahedron { a newicosaedre gere_pstricks_opt } def /pst-cube { a ngrid length 1 eq { ngrid } { {Mode} } ifelse newcube %% solidhollow { %% dup videsolid %% } if gere_pstricks_opt } def /pst-parallelepiped { a b c newparallelepiped gere_pstricks_opt } def /pst-tetrahedron { r newtetraedre gere_pstricks_opt } def /pst-tore { r0 r1 ngrid length 2 eq { ngrid } { {Mode} } ifelse newtore gere_pstricks_opt } def /pst-sphere { % rayon % mode % r {Mode} newsphere r ngrid length 2 eq { ngrid } { {Mode} } ifelse newsphere gere_pstricks_opt } def /pst-cylindre { % rayon % mode 0 r h ngrid length 2 eq { ngrid } { {Mode} } ifelse newcylindre solidhollow { dup creusesolid } if gere_pstricks_opt } def /pst-cylindrecreux { % rayon % mode 0 r h ngrid length 2 eq { ngrid } { {Mode} } ifelse newcylindre dup creusesolid gere_pstricks_opt } def /pst-cone { % rayon % mode 0 r h ngrid length 2 eq { ngrid } { {Mode} } ifelse solidhollow { newconecreux } { newcone } ifelse gere_pstricks_opt } def /pst-tronccone { % rayon % mode 0 r0 h r1 ngrid length 2 eq { ngrid } { {Mode} } ifelse solidhollow { newtroncconecreux } { newtronccone } ifelse gere_pstricks_opt } def /pst-troncconecreux { % rayon % mode 0 r0 h r1 ngrid length 2 eq { ngrid } { {Mode} } ifelse newtroncconecreux gere_pstricks_opt } def /pst-conecreux { % rayon % mode 0 r h ngrid length 2 eq { ngrid } { {Mode} } ifelse newconecreux gere_pstricks_opt } def /pst-anneau { [ section ] ngrid length 1 ge { [ngrid 0 get] } { [24] } ifelse newanneau gere_pstricks_opt } def /pst-prisme { % tableau des points de la base % h hauteur du prisme % axe : vecteur direction de l axe base decal rollparray 0 h axe ngrid length 1 ge { [ngrid 0 get] } if newprisme solidhollow { dup creusesolid } if gere_pstricks_opt } def /pst-prismecreux { % tableau des points de la base % h hauteur du prisme % axe : vecteur direction de l axe base 0 h axe ngrid length 1 ge { [ngrid 0 get] } if newprisme dup creusesolid gere_pstricks_opt } def /pst-grille { base aload pop ngrid length 2 ge { [ngrid 0 get ngrid 1 get] } { ngrid length 1 eq { [ngrid 0 get dup] } if } ifelse newgrille gere_pstricks_opt } def %% syntaxe : array N h u newruban -> solid d axe (O, u), /pst-ruban { % tableau des points de la base % h hauteur du prisme % axe : vecteur direction de l axe base h axe ngrid length 1 ge { [ngrid 0 get] } if newruban gere_pstricks_opt } def %% syntaxe : r phi option newcalottesphere -> solid /pst-calottesphere { % rayon % mode % r phi theta option newcalottesphere r phi theta ngrid length 2 eq { ngrid } { {Mode} } ifelse solidhollow { newcalottespherecreuse } { newcalottesphere } ifelse gere_pstricks_opt } def %% syntaxe : r phi option newcalottesphere -> solid /pst-calottespherecreuse { % rayon % mode % r phi theta option newcalottespherecreuse r phi theta ngrid length 2 eq { ngrid } { {Mode} } ifelse newcalottespherecreuse gere_pstricks_opt } def /pointtest{2 2 2} def /pst-face { % tableau des points de la base % h hauteur du prisme % axe : vecteur direction de l axe base solidbiface { newbiface } { newmonoface } ifelse gere_pstricks_opt } def /pst-surface { base base aload pop ngrid length 2 ge { [ngrid 0 get ngrid 1 get] } { ngrid length 1 eq { [ngrid 0 get dup] } ifelse } ifelse {f} newsurface solidbiface { dup videsolid } if gere_pstricks_opt } def /pst-polygoneregulier { r ngrid 0 get newpolreg solidbiface { } { dup 1 solidrmface } ifelse gere_pstricks_opt } def /pst-fusion { 1 dict begin /activationgestioncouleurs false def /n base length def base aload pop n 1 sub {solidfuz} repeat gere_pstricks_opt end } def /pst-new { sommets faces generesolid %% solidhollow { %% dup videsolid %% } if gere_pstricks_opt } def /pst-courbe { solidlinewidth setlinewidth r 0 eq { range aload pop {function cvx exec} CourbeR3 } { range aload pop function r ngrid newtube gere_pstricks_opt %% r function [36 12] newtube } ifelse } def /pst-surfaceparametree { base aload pop ngrid length 2 ge { [ngrid 0 get ngrid 1 get] } { ngrid length 1 eq { [ngrid 0 get dup] } if } ifelse { function cvx exec } newsurfaceparametree dup videsolid gere_pstricks_opt } def /pst-vecteur { gsave solidlinewidth setlinewidth 1 setlinejoin 1 setlinecap linecolor linestyle args newvecteur dup [linecolor currentrgbcolor] ( ) astr2str (setrgbcolor) append outputcolors gere_pstricks_opt grestore } def /pst-ligne { newpath base 0 get base 1 get base 2 get 3dto2d smoveto base ligne3d_ } def /pst-objfile { solidfilename newobjfile % dup {1 1 div mulv3d} solidtransform %% solidhollow { %% dup videsolid %% } if gere_pstricks_opt } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% procedures pour \psProjection %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /gere_pstricks_proj_opt { /solidprojname where { /solidprojname get noface phi xorigine 0 eq yorigine 0 eq and zorigine 0 eq and xorigine isinteger not and yorigine isinteger not and yorigine isinteger not and { } { [xorigine yorigine zorigine] ( ) astr2str } ifelse projectionsifacevisible solidprojpath } { xorigine yorigine zorigine [ normale ] projectionsifacevisible planprojpath } ifelse } def /proj-pst-chemin { solidlinewidth setlinewidth newpath path linecolor gere_pstricks_proj_opt } def /proj-pst-courbeR2 { solidlinewidth setlinewidth newpath linecolor range aload pop { function cvx exec } CourbeR2_ gere_pstricks_proj_opt } def /proj-pst-courbe { solidlinewidth setlinewidth newpath linecolor range aload pop {} { function cvx exec } Courbeparam_ gere_pstricks_proj_opt } def /proj-pst-texte { 2 dict begin setTimes solidlinewidth setlinewidth newpath linecolor texte 0 0 pos (text_) append cvx exec gere_pstricks_proj_opt fill end } def /pst-trigospherique { 3 dict begin gsave solidlinewidth setlinewidth linecolor linestyle args definition grestore end } def % END solides.pro %%EndProcSet %%BeginProcSet: special.pro 0 0 %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginProcSet: color.pro 0 0 %! TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll }repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def /TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{ setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{ /currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC /Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC /Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0 setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0 setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61 0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC /Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0 setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87 0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{ 0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{ 0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC /Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0 setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0 setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90 0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0 setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0 0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{ 0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{ 0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0 setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1 0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11 0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0 setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0 0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC /Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0 setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0 0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0 1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC /PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0 setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{ 0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor} DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70 setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0 setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1 setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end %%EndProcSet TeXDict begin 39158280 55380996 1000 600 600 (test_08.dvi) @start %DVIPSBitmapFont: Fa ecrm1000 10 2 /Fa 2 51 df<0001C0000003C0000007C000001FC00000FFC000FFFFC000FFFFC000FF1F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000003FE0007FFF FFF07FFFFFF07FFFFFF01C3779B62A>49 D<000FF00000007FFE000001FFFF800003E03F E0000F000FF0001E0007F8001C0003FC00380001FE00700001FE00700000FF00600000FF 00FE0000FF00FF00007F80FF80007F80FF80007F80FF80007F80FF80007F80FF80007F80 7F00007F801C00007F800000007F80000000FF00000000FF00000000FE00000001FE0000 0001FC00000003FC00000003F800000007F00000000FE00000000FC00000001F80000000 3F000000007E00000000FC00000001F800000001E000000003C000000007800000000F00 0000001E000180003C000180007800018000F000038001E000030003C000030007800003 0007000007000FFFFFFF001FFFFFFF003FFFFFFF007FFFFFFE00FFFFFFFE00FFFFFFFE00 FFFFFFFE0021377CB62A>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fb ecbx1440 14.4 23 /Fb 23 234 df<000000007FFC0000000000001FFFFF800000000001FFFFFFE000000000 07FFFFFFF8000000003FFFC00FFC00000000FFFC0001FE00000001FFF000007F00000007 FFC00003FF0000000FFF800007FF8000001FFF00000FFF8000003FFF00000FFF8000003F FE00000FFF8000007FFC00000FFF8000007FFC00001FFFC00000FFFC00000FFF800000FF F800000FFF800000FFF800000FFF800000FFF8000007FF000000FFF8000003FE000000FF F8000000F8000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF80007FFFFC000FFFF FFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFF FFFFFFFFFFC00000FFF800000FFFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000FFFF FFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFF FFF807FFFFFFC042547DD349>28 D<0000001E00000000003E0000000000FE0000000003 FE000000000FFE000000007FFE00000007FFFE000003FFFFFE0000FFFFFFFE0000FFFFFF FE0000FFFFFFFE0000FFF87FFE0000FC007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007F FE000000007FFE000000007FFE000000007FFE00007FFFFFFFFFFC7FFFFFFFFFFC7FFFFF FFFFFC7FFFFFFFFFFC7FFFFFFFFFFC2E4E76CD42>49 D<00001FFE0000000001FFFFF000 00000FFFFFFC0000003FFFFFFF8000007FFFFFFFE00001FF803FFFF00003FC0007FFFC00 07F00001FFFE000FE00000FFFF001F8000007FFF803F0000003FFF803F0000001FFFC07F E000001FFFE07FF800000FFFE07FFC00000FFFF0FFFC000007FFF0FFFE000007FFF0FFFE 000003FFF8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF87FFC00 0003FFF87FFC000003FFF83FF8000003FFF81FF0000003FFF80380000003FFF800000000 03FFF00000000007FFF00000000007FFF00000000007FFE0000000000FFFE0000000000F FFC0000000001FFFC0000000001FFF80000000003FFF00000000003FFE00000000007FFC 0000000000FFF80000000000FFF00000000001FFE00000000003FFC00000000007FF8000 00000007FF00000000000FFC00000000001FF800000000003FF000000000007FC0000000 0000FF800000000001FF000000000003FC000000000007F800000000000FF00000F80000 1FE00000F800003FC00000F800007F000000F80000FE000001F00001FC000001F00003F8 000001F00007F0000001F00007E0000001F0000F80000003F0001F00000003F0003E0000 0007F0007FFFFFFFFFF000FFFFFFFFFFE001FFFFFFFFFFE003FFFFFFFFFFE007FFFFFFFF FFE00FFFFFFFFFFFE01FFFFFFFFFFFE03FFFFFFFFFFFE07FFFFFFFFFFFE0FFFFFFFFFFFF E0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0354E7ACD42>I< FFFFFFFFFFFFFC000000FFFFFFFFFFFFFFE00000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFF FFFF8000FFFFFFFFFFFFFFFFE000000FFFE000003FFFF000000FFFE0000003FFFC00000F FFE0000000FFFE00000FFFE00000007FFF00000FFFE00000003FFF80000FFFE00000001F FFC0000FFFE00000000FFFE0000FFFE000000007FFE0000FFFE000000007FFF0000FFFE0 00000007FFF0000FFFE000000007FFF8000FFFE000000003FFF8000FFFE000000003FFF8 000FFFE000000003FFFC000FFFE000000003FFFC000FFFE000000003FFFC000FFFE00000 0003FFFC000FFFE000000003FFFC000FFFE000000003FFFC000FFFE000000003FFFC000F FFE000000003FFFC000FFFE000000003FFFC000FFFE000000003FFF8000FFFE000000003 FFF8000FFFE000000003FFF8000FFFE000000007FFF8000FFFE000000007FFF0000FFFE0 00000007FFF0000FFFE000000007FFE0000FFFE00000000FFFC0000FFFE00000001FFFC0 000FFFE00000003FFF80000FFFE00000007FFF00000FFFE0000000FFFE00000FFFE00000 07FFF800000FFFE000003FFFF000000FFFFFFFFFFFFFC000000FFFFFFFFFFFFF0000000F FFFFFFFFFFF80000000FFFFFFFFFFF800000000FFFE0000000000000000FFFE000000000 0000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0 000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000 000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE00000 00000000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000F FFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE000000000 0000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0 000000000000000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000 000FFFE0000000000000000FFFE0000000000000000FFFE0000000000000000FFFE00000 00000000000FFFE0000000000000FFFFFFFFFE0000000000FFFFFFFFFE0000000000FFFF FFFFFE0000000000FFFFFFFFFE0000000000FFFFFFFFFE00000000004E527CD15A>80 D<00000FFE00001C000000FFFFF0003C000007FFFFFC007C00001FFFFFFF00FC00007FFF FFFFC1FC0000FFF001FFE1FC0001FF80001FFBFC0003FF000007FFFC0007FC000001FFFC 000FF8000000FFFC001FF00000003FFC001FF00000001FFC003FE00000000FFC003FE000 00000FFC007FE000000007FC007FC000000003FC007FC000000003FC007FC000000001FC 00FFC000000001FC00FFC000000001FC00FFC000000000FC00FFE000000000FC00FFE000 000000FC00FFF0000000007C00FFF0000000007C00FFF8000000007C00FFFC000000007C 00FFFE0000000000007FFF0000000000007FFFC000000000007FFFF800000000007FFFFF 80000000003FFFFFF8000000003FFFFFFFC00000001FFFFFFFFC0000000FFFFFFFFF8000 000FFFFFFFFFF0000007FFFFFFFFFC000003FFFFFFFFFE000001FFFFFFFFFF800000FFFF FFFFFFC000007FFFFFFFFFE000001FFFFFFFFFF0000007FFFFFFFFF8000001FFFFFFFFF8 0000007FFFFFFFFC00000007FFFFFFFE000000007FFFFFFE0000000003FFFFFF00000000 003FFFFF000000000003FFFF800000000000FFFF8000000000003FFF8000000000001FFF 8000000000000FFFC0000000000007FFC0000000000003FFC0F80000000003FFC0F80000 000001FFC0F80000000001FFC0F80000000001FFC0F80000000000FFC0FC0000000000FF C0FC0000000000FFC0FC0000000000FFC0FC0000000000FF80FE0000000000FF80FE0000 000000FF80FF0000000001FF80FF0000000001FF00FF8000000001FF00FFC000000003FE 00FFE000000003FE00FFF000000007FC00FFFC0000000FF800FFFE0000001FF800FFFFC0 00003FF000FF7FF80000FFE000FE1FFF8007FFC000FE07FFFFFFFF0000FC01FFFFFFFC00 00F8007FFFFFF00000F0000FFFFFC00000E000007FFC0000003A5479D249>83 D<3FFFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFFFFFFF FFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFC0007FFF0003FFFC3FFC00007FFF00003FFC7F F000007FFF00000FFE7FE000007FFF000007FE7FC000007FFF000003FE7F8000007FFF00 0001FE7F0000007FFF000000FE7F0000007FFF000000FE7E0000007FFF0000007E7E0000 007FFF0000007E7E0000007FFF0000007E7C0000007FFF0000003E7C0000007FFF000000 3E7C0000007FFF0000003E7C0000007FFF0000003E7C0000007FFF0000003EFC0000007F FF0000003FF80000007FFF0000001FF80000007FFF0000001FF80000007FFF0000001FF8 0000007FFF0000001FF80000007FFF0000001FF80000007FFF0000001F000000007FFF00 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000 0000007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF00 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000 0000007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF00 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F FF000000000001FFFFFFFFFFFFC0000001FFFFFFFFFFFFC0000001FFFFFFFFFFFFC00000 01FFFFFFFFFFFFC0000001FFFFFFFFFFFFC00050517BD05B>I<00003FFE000000000007 FFFFE0000000001FFFFFFC000000007FFFFFFF00000001FFC00FFFC0000003FE0003FFE0 000007FF0000FFF0000007FF80007FF800000FFFC0007FFC00000FFFC0003FFE00000FFF C0003FFE00000FFFC0001FFF00000FFFC0001FFF00000FFFC0001FFF00000FFFC0000FFF 800007FF80000FFF800003FF00000FFF800001FE00000FFF8000000000000FFF80000000 00000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF 800000000007FFFF8000000003FFFFFF800000007FFFFFFF80000003FFFFFFFF8000001F FFF00FFF8000007FFF000FFF800000FFFC000FFF800003FFF0000FFF800007FFC0000FFF 80000FFF80000FFF80001FFF00000FFF80003FFF00000FFF80003FFE00000FFF80007FFC 00000FFF80007FFC00000FFF81F0FFFC00000FFF81F0FFF800000FFF81F0FFF800000FFF 81F0FFF800000FFF81F0FFF800001FFF81F0FFF800001FFF81F0FFFC00003FFF81F07FFC 00003FFF81F07FFE00007FFF81F03FFE0000F7FFC3F03FFF0001E3FFC3E01FFFC007E3FF FFE007FFF01F81FFFFC003FFFFFF00FFFF8000FFFFFC007FFF00001FFFF0003FFC000001 FF800007F0003C387CB642>97 D<000003FFE0000000003FFFFE00000000FFFFFF800000 03FFFFFFE000000FFF003FF800003FFC0007FC00007FF8000FFE0000FFF0001FFE0001FF E0003FFF0003FFC0003FFF0007FF80003FFF0007FF80003FFF000FFF00003FFF001FFF00 003FFF001FFE00003FFF003FFE00001FFE003FFE00000FFC003FFE000007F8007FFE0000 0000007FFC00000000007FFC00000000007FFC0000000000FFFC0000000000FFFC000000 0000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00000000 00FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000 FFFC00000000007FFC00000000007FFE00000000007FFE00000000007FFE00000000003F FE00000000003FFF00000000001FFF0000000F801FFF0000000F800FFF8000001F800FFF 8000001F0007FFC000003F0003FFE000003E0001FFF000007E0000FFF80000FC00007FFC 0001F800003FFF0007F000000FFFC01FE0000007FFFFFF80000001FFFFFE000000003FFF F80000000003FF80000031387CB63A>99 D<000000000003FF8000000000000FFFFF8000 000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000 00000000003FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 00000000000FFF800000000000000FFF800000000000000FFF8000000003FF800FFF8000 00003FFFF80FFF80000001FFFFFE0FFF80000007FFFFFF8FFF8000001FFFC03FEFFF8000 003FFE0007FFFF8000007FF80001FFFF800000FFF00000FFFF800001FFE000007FFF8000 03FFC000003FFF800007FF8000001FFF80000FFF8000000FFF80000FFF0000000FFF8000 1FFF0000000FFF80001FFE0000000FFF80003FFE0000000FFF80003FFE0000000FFF8000 7FFE0000000FFF80007FFC0000000FFF80007FFC0000000FFF80007FFC0000000FFF8000 FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000 FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000 FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000 FFFC0000000FFF80007FFC0000000FFF80007FFC0000000FFF80007FFC0000000FFF8000 7FFE0000000FFF80003FFE0000000FFF80003FFE0000000FFF80003FFE0000000FFF8000 1FFE0000000FFF80001FFF0000000FFF80000FFF0000001FFF800007FF8000003FFF8000 07FF8000007FFF800003FFC00000FFFF800001FFE00001FFFF800000FFF00003FFFFE000 007FFC000FEFFFFF80001FFF007F8FFFFF800007FFFFFF0FFFFF800001FFFFFC0FFFFF80 00007FFFE00FFFFF80000007FF000FFE000041547CD249>I<000007FF80000000007FFF F800000001FFFFFE00000007FFFFFF8000001FFF03FFE000003FFC007FF000007FF0003F F80000FFE0001FFC0001FFC0000FFC0003FF800007FE0007FF800007FF000FFF000003FF 000FFF000003FF801FFE000003FF801FFE000001FF803FFE000001FFC03FFE000001FFC0 3FFE000001FFC07FFC000001FFC07FFC000001FFE07FFC000000FFE07FFC000000FFE0FF FC000000FFE0FFFC000000FFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFF FFFFFFFFE0FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00 00000000FFFC00000000007FFC00000000007FFC00000000007FFC00000000007FFE0000 0000003FFE00000000003FFE00000000003FFE00000003E01FFF00000003E01FFF000000 07E00FFF00000007C007FF8000000FC007FF8000000F8003FFC000001F8001FFE000003F 0000FFF000007E00007FFC0001FC00001FFF0007F800000FFFE03FF0000003FFFFFFC000 0000FFFFFF800000003FFFFC0000000001FFE0000033387CB63C>I<00001FFE0000FE00 0001FFFFE007FF80000FFFFFFC1FFFC0003FFFFFFF7FFFE0007FF807FFFF07E001FFE001 FFF07FE003FFC000FFF07FE007FF80007FF83FE007FF00003FF83FC00FFF00003FFC1FC0 1FFF00003FFE07001FFE00001FFE00001FFE00001FFE00003FFE00001FFF00003FFE0000 1FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF0000 3FFE00001FFF00003FFE00001FFF00003FFE00001FFF00001FFE00001FFE00001FFE0000 1FFE00001FFF00003FFE00000FFF00003FFC000007FF00003FF8000007FF80007FF80000 03FFC000FFF0000001FFE001FFE0000000FFF807FF80000001FFFFFFFF00000003EFFFFF FC00000003C1FFFFE000000007C01FFE0000000007800000000000000780000000000000 0FC00000000000000FC00000000000000FC00000000000000FE00000000000000FE00000 000000000FF00000000000000FFC0000000000000FFFFFFFFE00000007FFFFFFFFF00000 07FFFFFFFFFC000007FFFFFFFFFF800003FFFFFFFFFFC00003FFFFFFFFFFF00001FFFFFF FFFFF80000FFFFFFFFFFFC00007FFFFFFFFFFC0001FFFFFFFFFFFE0007FFFFFFFFFFFE00 0FFC000003FFFF001FF80000003FFF003FF00000000FFF007FE000000007FF807FE00000 0003FF80FFC000000003FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80 FFC000000001FF80FFC000000001FF80FFE000000003FF807FE000000003FF007FF00000 0007FF003FF000000007FE001FF80000000FFC001FFE0000003FFC0007FF0000007FF000 03FFC00001FFE00000FFFC001FFF8000003FFFFFFFFE0000000FFFFFFFF800000001FFFF FFC0000000000FFFF80000003B4F7CB542>103 D<003FF8000000000000FFFFF8000000 000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000 00000003FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000 00000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8001FFC 00000000FFF800FFFF80000000FFF803FFFFE0000000FFF80FFFFFF8000000FFF81FC07F FC000000FFF87E003FFE000000FFF8F8001FFF000000FFF9F0001FFF000000FFF9E0000F FF800000FFFBC0000FFF800000FFFF80000FFF800000FFFF000007FFC00000FFFF000007 FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC000007 FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FF FFFFC0FFFFFFF807FFFFFFC042537CD249>I<003F000000FFC00001FFE00003FFF00003 FFF00007FFF80007FFF80007FFF80007FFF80007FFF80007FFF80003FFF00003FFF00001 FFE00000FFC000003F000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000001FF800FF FFF800FFFFF800FFFFF800FFFFF800FFFFF80001FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF800FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF01C547CD324 >I<0000003F00000000FFC0000001FFE0000003FFF0000003FFF0000007FFF8000007FF F8000007FFF8000007FFF8000007FFF8000007FFF8000003FFF0000003FFF0000001FFE0 000000FFC00000003F000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000003FF80001FFFFF80001FFFFF80001FFFFF80001FFFFF80001FF FFF8000003FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FF F8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8 000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF800 0000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF80000 00FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000 FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FF F8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8 000000FFF8000000FFF8000000FFF8000000FFF8078000FFF81FE000FFF83FF000FFF87F F800FFF8FFFC00FFF0FFFC01FFF0FFFC01FFF0FFFC01FFE0FFFC01FFE0FFFC03FFC07FF8 03FF807FF807FF003FF00FFE001FF03FFC000FFFFFF00007FFFFE00001FFFF0000003FF8 0000256C87D328>I<003FF80000000000FFFFF80000000000FFFFF80000000000FFFFF8 0000000000FFFFF80000000000FFFFF8000000000003FFF8000000000000FFF800000000 0000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8 000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000000 0000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8 000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000000 0000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8 0007FFFFF000FFF80007FFFFF000FFF80007FFFFF000FFF80007FFFFF000FFF80007FFFF F000FFF800007FF00000FFF800003FC00000FFF800007F800000FFF80000FF000000FFF8 0001FC000000FFF80003F8000000FFF8000FF0000000FFF8001FE0000000FFF8003FC000 0000FFF8007F00000000FFF800FE00000000FFF803FC00000000FFF807F800000000FFF8 0FF000000000FFF81FE000000000FFF83FF000000000FFF87FF800000000FFF9FFF80000 0000FFFBFFFC00000000FFFFFFFE00000000FFFFFFFE00000000FFFFFFFF00000000FFFF BFFF80000000FFFF1FFFC0000000FFFE1FFFC0000000FFFC0FFFE0000000FFF007FFF000 0000FFF003FFF8000000FFF003FFF8000000FFF001FFFC000000FFF000FFFE000000FFF0 007FFE000000FFF0007FFF000000FFF0003FFF800000FFF0001FFFC00000FFF0001FFFC0 0000FFF0000FFFE00000FFF00007FFF00000FFF00003FFF80000FFF00003FFF80000FFF0 0001FFFC0000FFF00000FFFE0000FFF00000FFFF00FFFFFFF00FFFFFFEFFFFFFF00FFFFF FEFFFFFFF00FFFFFFEFFFFFFF00FFFFFFEFFFFFFF00FFFFFFE3F537DD245>I<003FF000 1FFC000000FFFFF000FFFF800000FFFFF003FFFFE00000FFFFF00FFFFFF80000FFFFF01F C07FFC0000FFFFF07E003FFE000003FFF0F8001FFF000000FFF1F0001FFF000000FFF1E0 000FFF800000FFF3C0000FFF800000FFF780000FFF800000FFF7000007FFC00000FFFF00 0007FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC00 0007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 0007FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF8 07FFFFFFC0FFFFFFF807FFFFFFC042367CB549>110 D<003FF8007FF0000000FFFFF807 FFFF000000FFFFF81FFFFFC00000FFFFF87FFFFFF00000FFFFF9FF00FFFC0000FFFFFFF8 003FFF000003FFFFE0000FFF800000FFFF800007FFC00000FFFF000003FFE00000FFFE00 0003FFF00000FFFC000001FFF00000FFF8000000FFF80000FFF8000000FFFC0000FFF800 00007FFC0000FFF80000007FFE0000FFF80000007FFE0000FFF80000003FFE0000FFF800 00003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF800 00001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF800 00001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF800 00001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF800 00001FFF8000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF800 00003FFF0000FFF80000007FFE0000FFF80000007FFE0000FFF80000007FFC0000FFF800 0000FFFC0000FFF8000000FFF80000FFFC000001FFF80000FFFC000001FFF00000FFFE00 0003FFE00000FFFF000007FFC00000FFFF80000FFF800000FFFFE0001FFF000000FFFFF0 007FFE000000FFF9FE01FFF8000000FFF8FFFFFFF0000000FFF83FFFFFC0000000FFF807 FFFE00000000FFF800FFE000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF8000000000000FFFFFFF80000000000FFFFFFF8 0000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000414D7DB5 49>112 D<003FF001FC00FFFFF00FFF80FFFFF01FFFE0FFFFF07FFFF0FFFFF0FE1FF8FF FFF1F83FF801FFF1F07FFC00FFF3E07FFC00FFF3C07FFC00FFF7807FFC00FFF7807FFC00 FFFF007FFC00FFFF003FF800FFFE001FF000FFFE000FE000FFFE00000000FFFC00000000 FFFC00000000FFFC00000000FFFC00000000FFF800000000FFF800000000FFF800000000 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000 FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000 FFF800000000FFF8000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FF FFFFFE00002E367DB535>114 D<0003FFC00E00001FFFFC1E0000FFFFFF7E0003FFFFFF FE0007FE003FFE000FF0000FFE001FE00003FE003FC00001FE003F800000FE007F800000 FE007F0000007E007F0000007E00FF0000003E00FF0000003E00FF8000003E00FF800000 3E00FFC000003E00FFF000000000FFFC00000000FFFF800000007FFFFE0000007FFFFFF0 00003FFFFFFE00003FFFFFFF80001FFFFFFFE0000FFFFFFFF00007FFFFFFFC0003FFFFFF FE0000FFFFFFFF00003FFFFFFF00000FFFFFFF800001FFFFFF8000000FFFFFC00000003F FFC000000007FFE000000001FFE0F8000000FFE0F80000007FE0FC0000003FE0FC000000 3FE0FC0000001FE0FE0000001FE0FE0000001FE0FE0000001FC0FF0000001FC0FF800000 3FC0FF8000003F80FFC000003F80FFE000007F00FFF80000FF00FFFC0003FE00FFFF801F FC00FE7FFFFFF000F81FFFFFC000F007FFFF0000E0007FF000002B387CB634>I<00007C 00000000007C00000000007C00000000007C00000000007C00000000007C0000000000FC 0000000000FC0000000000FC0000000000FC0000000001FC0000000001FC0000000001FC 0000000003FC0000000003FC0000000007FC0000000007FC000000000FFC000000001FFC 000000003FFC000000007FFC00000000FFFC00000003FFFC0000000FFFFFFFFE00FFFFFF FFFE00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00007FFC000000007FFC000000007FFC 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC 000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC 000000007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC 000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC 001F00003FFE001F00003FFE001F00001FFE003E00001FFF003E00000FFF807C000007FF C1F8000003FFFFF0000000FFFFE00000003FFF8000000003FE0000294D7ECB33>I<003F F8000001FFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFF F80007FFFFC000FFFFF80007FFFFC00003FFF800001FFFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800000FFFC00000FF F800000FFFC00000FFF800000FFFC00000FFF800001FFFC00000FFF800001FFFC00000FF F800003FFFC000007FF800003FFFC000007FF800007FFFC000003FFC0000F7FFC000003F FC0001E7FFF000001FFE0007C7FFFFC0000FFF801F87FFFFC00007FFFFFF07FFFFC00001 FFFFFC07FFFFC000007FFFF007FFFFC0000007FFC007FF000042377CB549>II<00000003C0000000000007F000000000001FF800000000003FFC00000000007FFC 0000000000FFFE0000000001FFFE0000000003FFFE0000000007FFFE000000000FFFFE00 0000001FFFFC000000003FFFF8000000007FFFF000000000FFFFC000000001FFFE000000 0003FFF80000000003FFC00000000001FE000000000001F8000000000000C00000000000 000000000000000000000000000000000000000000000000000000000007FF8000000000 7FFFF800000001FFFFFE00000007FFFFFF8000001FFF03FFE000003FFC007FF000007FF0 003FF80000FFE0001FFC0001FFC0000FFC0003FF800007FE0007FF800007FF000FFF0000 03FF000FFF000003FF801FFE000003FF801FFE000001FF803FFE000001FFC03FFE000001 FFC03FFE000001FFC07FFC000001FFC07FFC000001FFE07FFC000000FFE07FFC000000FF E0FFFC000000FFE0FFFC000000FFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0 FFFFFFFFFFFFE0FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FF FC0000000000FFFC00000000007FFC00000000007FFC00000000007FFC00000000007FFE 00000000003FFE00000000003FFE00000000003FFE00000003E01FFF00000003E01FFF00 000007E00FFF00000007C007FF8000000FC007FF8000000F8003FFC000001F8001FFE000 003F0000FFF000007E00007FFC0001FC00001FFF0007F800000FFFE03FF0000003FFFFFF C0000000FFFFFF800000003FFFFC0000000001FFE0000033507CCE3C>233 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fc ecrm1200 12 10 /Fc 10 115 df<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000 E000C000C000C001C0018003800300070006000E001C003800700060000B1D78891B>44 D<0000FF00000007FFE000001F81F800003E007C0000FC003F0001F8001F8001F0000F80 03E00007C007C00003E007C00003E00FC00003F00F800001F01F800001F81F800001F83F 800001FC3F800001FC3F800001FC3F000000FC7F000000FE7F000000FE7F000000FE7F00 0000FE7F000000FEFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF0000 00FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000 FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FF FF000000FFFF000000FF7F000000FE7F000000FE7F000000FE7F000000FE7F000000FE7F 800001FE3F800001FC3F800001FC3F800001FC1F800001F81F800001F80FC00003F00FC0 0003F00FC00003F007E00007E003E00007C003F0000FC001F8001F8000FC003F00003E00 7C00001F81F8000007FFE0000000FF000028447CC131>48 D<0003FE0000001FFFC00000 7FFFF00001F80FFC0003C001FE00078000FF000E00007F801C00003FC01C00001FE03800 001FF03000000FF07000000FF860000007F86C000007F8FF000007FCFF800007FCFFC000 07FCFFC00003FCFFC00003FCFFC00003FCFFC00003FC7F800007FC3F000007FC00000007 FC00000007F800000007F80000000FF80000000FF00000001FF00000001FE00000001FE0 0000003FC00000007F800000007F00000000FF00000000FE00000001FC00000003F80000 0007F000000007E00000000FC00000001F800000003F000000007C00000000F800000000 F000000001E000000003C000000007800000000F00000C001E00000C003C00000C003800 0018007000001800E000001801C0000018038000003807000000300E000000701FFFFFFF F01FFFFFFFF03FFFFFFFF07FFFFFFFF0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE026427BC131 >50 D<0001FF0000000FFFE000003FFFFC0000FE01FE0001F0007F8003C0003FC0070000 1FE00E00001FE00E00000FF00FE0000FF01FF0000FF81FF0000FF81FF00007F81FF80007 F81FF00007F81FF00007F80FE0000FF803C0000FF80000000FF00000000FF00000000FF0 0000001FE00000001FE00000003FC00000003F800000007F00000000FE00000001FC0000 0003F00000001FC000000FFF0000000FFFF000000001FC000000007F000000003F800000 001FC00000000FE00000000FF000000007F800000007FC00000003FC00000003FE000000 03FE00000001FE00000001FF00000001FF00000001FF1E000001FF7F800001FFFFC00001 FFFFC00001FFFFC00001FFFFC00001FFFFC00001FEFF800003FEFF800003FE7E000003FC 70000007FC30000007F83800000FF81C00000FF00E00001FE00780003FC003E0007F8001 FE01FE00007FFFF800000FFFE0000001FF000028447CC131>I<0000FF00000007FFE000 001FFFF800007F00FE0000FC003F0001F0001F8003E0000FC003C00007E007C00003F00F 800001F00F800001F00F000001F81F000000F81F000000F81F000000F81F000000F81F80 0000F81F800000F81FC00001F81FC00001F01FE00001F00FF00003E00FFC0003E007FE00 07C007FF800F8003FFC01F0001FFF03E0001FFF87800007FFEF000003FFFC000001FFFC0 000007FFE0000003FFF8000007FFFC00001E7FFF00007C1FFF8000F80FFFC001E003FFE0 03C001FFF007C0007FF80F80003FFC1F00000FFC3E000007FE3E000001FE7C000000FE7C 000000FF7C0000007FF80000003FF80000003FF80000001FF80000001FF80000001FF800 00001FF80000001FFC0000001E7C0000003E7C0000003E7E0000003C3E0000007C1F0000 00F81F800001F00FC00003E007E00007C003F8001F8000FF00FF00003FFFFC00000FFFF0 000001FF800028447CC131>56 D77 D<0007FC000000003FFF80000000F80FE00000 03C003F00000070001F800000E0000FC00000FC0007E00001FE0007F00001FF0003F8000 1FF0003F80001FF0003F80001FF0001FC0001FF0001FC0000FE0001FC0000380001FC000 0000001FC0000000001FC0000000001FC0000000001FC00000000FFFC0000001FFFFC000 000FFE1FC000003FC01FC00000FF001FC00003FC001FC00007F8001FC0000FF0001FC000 1FE0001FC0003FC0001FC0007FC0001FC0007F80001FC0007F80001FC060FF00001FC060 FF00001FC060FF00001FC060FF00003FC060FF00003FC060FF00003FC060FF80007FC060 7F8000EFC0607FC000C7E0C03FC001C7E0C01FE00783F1C007F81E03FF8001FFFC01FF00 001FE0007C002B2E7CAC31>97 D<00007F80000003FFF000000FC07C00003F000F0000FC 00038001F80001C003F8000FC007F0001FE007E0003FE00FE0003FE01FC0003FE01FC000 3FE03F80003FE03F80001FC07F800007007F800000007F800000007F00000000FF000000 00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 FF00000000FF00000000FF000000007F000000007F800000007F800000003F800000003F 800000303FC00000301FC00000700FE00000600FE00000E007F00000C003F80001C001F8 00038000FC000700003F001E00001FC078000007FFF0000000FF8000242E7DAC2B>99 D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC01FE000001FC07FFC00001FC1E07F00001FC3801F80001FC7001FC 0001FCE000FC0001FDC000FE0001FD8000FE0001FF80007F0001FF00007F0001FF00007F 0001FE00007F0001FE00007F0001FE00007F0001FC00007F0001FC00007F0001FC00007F 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F 0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0003FE0000FF 80FFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFE2F457DC436>104 D<03F803F0FFF81FFCFFF83C3EFFF8707F07F8E0FF03F9C0FF01F980FF01FB80FF01FB00 7E01FB003C01FF000001FE000001FE000001FE000001FE000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC000003FF0000FFFFFE00FFFFFE00FFFFFE00202C7D AB26>114 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fd ecrm1728 17.28 5 /Fd 5 117 df<0F003FC07FE0FFF0FFF0FFF0FFF0FFF0FFF07FE03FC00F000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000F 003FC07FE0FFF0FFF0FFF0FFF0FFF0FFF07FE03FC00F000C3E74BD25>58 D<3FFFFFFFFFFFFFFFFFFFF03FFFFFFFFFFFFFFFFFFFF03FFFFFFFFFFFFFFFFFFFF03FFF FFFFFFFFFFFFFFFFF03FFF800007FF800007FFF03FFC000003FF000000FFF03FE0000003 FF0000001FF03FC0000003FF0000000FF07F80000003FF00000007F87F00000003FF0000 0003F87E00000003FF00000001F87C00000003FF00000000F87C00000003FF00000000F8 7C00000003FF00000000F87800000003FF00000000787800000003FF0000000078780000 0003FF00000000787800000003FF00000000787000000003FF00000000387000000003FF 00000000387000000003FF00000000387000000003FF00000000387000000003FF000000 00387000000003FF0000000038F000000003FF000000003CE000000003FF000000001CE0 00000003FF000000001CE000000003FF000000001CE000000003FF000000001CE0000000 03FF000000001CE000000003FF000000001CE000000003FF000000001C0000000003FF00 000000000000000003FF00000000000000000003FF00000000000000000003FF00000000 000000000003FF00000000000000000003FF00000000000000000003FF00000000000000 000003FF00000000000000000003FF00000000000000000003FF00000000000000000003 FF00000000000000000003FF00000000000000000003FF00000000000000000003FF0000 0000000000000003FF00000000000000000003FF00000000000000000003FF0000000000 0000000003FF00000000000000000003FF00000000000000000003FF0000000000000000 0003FF00000000000000000003FF00000000000000000003FF00000000000000000003FF 00000000000000000003FF00000000000000000003FF00000000000000000003FF000000 00000000000003FF00000000000000000003FF00000000000000000003FF000000000000 00000003FF00000000000000000003FF00000000000000000003FF000000000000000000 03FF00000000000000000003FF00000000000000000003FF00000000000000000003FF00 000000000000000003FF00000000000000000003FF00000000000000000003FF00000000 000000000003FF00000000000000000003FF00000000000000000003FF00000000000000 000003FF00000000000000000003FF00000000000000000003FF00000000000000000003 FF00000000000000000003FF00000000000000000003FF00000000000000000003FF0000 0000000000000003FF00000000000000000003FF00000000000000000003FF0000000000 0000000003FF00000000000000000003FF00000000000000000003FF0000000000000000 0003FF00000000000000000003FF00000000000000000003FF00000000000000000007FF 80000000000000000007FF8000000000000000003FFFF000000000000003FFFFFFFFFF00 0000000003FFFFFFFFFF000000000003FFFFFFFFFF000000000003FFFFFFFFFF00000056 627BE161>84 D<000003FE00000000001FFFE000000000FFFFF800000001FE03FE000000 07F0007F8000000FE0003FC000003FC0001FE000007F00000FF00000FF000007F80000FE 000003F80001FC000003FC0003F8000001FC0007F8000001FE0007F0000000FE000FF000 0000FF000FF00000007F001FE00000007F001FE00000007F803FE00000007F803FC00000 003F803FC00000003F807FC00000003FC07FC00000003FC07FC00000003FC07F80000000 3FC07F800000003FC0FF800000003FC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFF C0FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 FF800000000000FF800000000000FF800000000000FF8000000000007F8000000000007F C000000000007FC000000000007FC000000000003FC000000000003FC000000000003FE0 00000000001FE000000000001FE000000001C00FF000000001C00FF000000003C007F800 0000038007F8000000038003FC000000078001FC0000000F0001FE0000000E0000FF0000 001E00007F8000003C00003FC000007800001FE00000F0000007F00003E0000003FC0007 C0000000FF803F000000003FFFFC000000000FFFF00000000001FF80000032417BBF3C> 101 D<0000FFC00300000FFFF80700007FFFFE0F0001FF003F9F0003F00007DF0007E000 03FF000F800000FF001F8000007F003F0000007F003E0000003F007E0000001F007C0000 001F00FC0000000F00FC0000000F00FC0000000F00FC0000000F00FC0000000700FE0000 000700FE0000000700FF0000000700FF80000007007FC0000007007FE0000000007FF800 0000003FFE000000001FFFE00000000FFFFF0000000FFFFFF0000003FFFFFE000001FFFF FF8000007FFFFFE000001FFFFFF8000007FFFFFC000000FFFFFE00000007FFFF00000000 3FFF8000000007FF8000000001FFC0000000007FC0E00000003FE0E00000001FE0E00000 001FF0F00000000FF0F000000007F0F000000007F0F000000007F0F800000003F0F80000 0003F0F800000003F0FC00000003F0FC00000003F0FE00000003E0FE00000007E0FF0000 0007E0FF00000007C0FF8000000FC0FFC000000F80FFE000001F80FDF000003F00F8F800 007E00F87C0001FC00F01F801FF000F00FFFFFC000E003FFFF0000C0007FF000002C417C BF35>115 D<000070000000000070000000000070000000000070000000000070000000 0000700000000000700000000000F00000000000F00000000000F00000000000F0000000 0000F00000000001F00000000001F00000000001F00000000003F00000000003F0000000 0007F00000000007F0000000000FF0000000000FF0000000001FF0000000003FF0000000 007FF000000000FFF000000003FFF00000000FFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00 FFFFFFFFFF00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000 000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000 000FF0000000000FF0000000000FF0000000000FF00001C0000FF00001C0000FF00001C0 000FF00001C0000FF00001C0000FF00001C0000FF00001C0000FF00001C0000FF00001C0 000FF00001C0000FF00001C0000FF00001C0000FF00001C0000FF00001C00007F8000380 0007F80003800007F80003800007F80007800003FC0007000003FC000F000001FE000E00 0000FF001E0000007F803C0000003FE0F80000001FFFF000000007FFC000000000FF0000 2A597ED734>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fe ectt1728 17.28 10 /Fe 10 117 df<7FFFFFFFFFFC7FFFFFFFFFFCFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFF FEFFFFFFFFFFFE7FFFFFFFFFFC7FFFFFFFFFFC2F0874A248>45 D<000000FFF000000000 000FFFFF00000000007FFFFFC000000001FFFFFFF000000007FFFFFFFC0000001FFFFFFF FE0000003FFFFFFFFF0000007FFFFFFFFF800000FFFF801FFFC00001FFF80001FFE00001 FFC000007FF00003FF0000003FF80007FE0000000FF80007FC00000007FC0007F8000000 07FC000FF800000003FC000FF800000003FE000FFC00000001FE000FFC00000001FE000F FC00000001FE000FFC00000001FE0007F800000001FE0003F000000001FE0001E0000000 01FE00000000000003FE00000000000003FC00000000000003FC00000000000007FC0000 0000000007F80000000000000FF80000000000001FF00000000000001FF0000000000000 3FE0000000000000FFE0000000000001FFC0000000000007FF8000000000001FFF000000 00001FFFFE000000001FFFFFFC000000003FFFFFF8000000003FFFFFF0000000003FFFFF C0000000003FFFFFE0000000003FFFFFF8000000003FFFFFFE000000001FFFFFFF000000 0000001FFF80000000000003FFE00000000000007FF00000000000003FF8000000000000 0FFC00000000000007FC00000000000003FE00000000000001FF00000000000000FF0000 0000000000FF800000000000007F800000000000007FC00000000000003FC00000000000 003FC00000000000003FE00000000000001FE00000000000001FE00000000000001FE03F 00000000001FE07F80000000001FE07F80000000001FE0FFC0000000001FE0FFC0000000 001FE0FFC0000000003FE0FFC0000000003FC0FF80000000003FC0FF80000000007FC07F 80000000007FC07F8000000000FF807FC000000000FF803FE000000001FF003FF0000000 03FF001FF800000007FE001FFC0000000FFC000FFF0000003FFC0007FFC000007FF80003 FFF80003FFF00001FFFF801FFFE00000FFFFFFFFFFC000007FFFFFFFFF8000001FFFFFFF FF0000000FFFFFFFFC00000003FFFFFFF000000000FFFFFFC0000000001FFFFF00000000 0000FFF00000003B5C7AD948>51 D<000000003FFFC000000000007FFFC00000000000FF FFE00000000000FFFFE00000000000FFFFE00000000000FFFFE000000000007FFFE00000 0000003FFFE00000000000001FE00000000000001FE00000000000001FE0000000000000 1FE00000000000001FE00000000000001FE00000000000001FE00000000000001FE00000 000000001FE00000000000001FE00000000000001FE00000000000001FE0000000000000 1FE00000000000001FE00000000000001FE00000000000001FE00000000000001FE00000 0007FC001FE00000003FFFC01FE0000000FFFFF01FE0000003FFFFF81FE0000007FFFFFE 1FE000001FFFFFFF1FE000003FFFFFFF9FE000007FFFFFFFDFE00000FFFF01FFFFE00000 FFF8003FFFE00001FFE0000FFFE00003FF800007FFE00007FF000003FFE00007FE000001 FFE0000FFC000000FFE0000FF8000000FFE0001FF00000007FE0001FF00000007FE0003F E00000003FE0003FE00000003FE0003FC00000001FE0007FC00000001FE0007FC0000000 1FE0007F800000001FE0007F800000001FE000FF800000001FE000FF800000001FE000FF 000000001FE000FF000000001FE000FF000000001FE000FF000000001FE000FF00000000 1FE000FF000000001FE000FF000000001FE000FF000000001FE000FF000000001FE000FF 000000001FE000FF800000001FE000FF800000001FE0007F800000001FE0007F80000000 3FE0007F800000003FE0007FC00000003FE0003FC00000003FE0003FE00000007FE0003F E00000007FE0001FF0000000FFE0001FF0000000FFE0000FF8000001FFE0000FFC000003 FFE00007FC000003FFE00007FE000007FFE00003FF00000FFFE00003FFC0003FFFE00001 FFF0007FDFE00000FFFC03FFDFFFF0007FFFFFFF9FFFF8003FFFFFFF1FFFFC001FFFFFFE 1FFFFC000FFFFFF81FFFFC0007FFFFF01FFFFC0001FFFFC00FFFF800007FFF000FFFF000 000FF8000000003E597AD748>100 D<000001FFC0000000000FFFFC000000007FFFFF00 000001FFFFFFC0000003FFFFFFF000000FFFFFFFF800001FFFFFFFFC00003FFFFFFFFE00 007FFF807FFF0000FFFC000FFF8000FFF00003FF8001FFC00001FFC003FF8000007FE007 FF0000003FE007FE0000003FF00FFC0000001FF00FF80000000FF81FF00000000FF81FF0 00000007F83FE000000007FC3FE000000007FC3FC000000003FC7FC000000003FC7FC000 000003FC7F8000000003FE7F8000000003FEFF8000000001FEFF8000000001FEFF000000 0001FEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFF FFFEFFFFFFFFFFFFFCFFFFFFFFFFFFFCFF000000000000FF800000000000FF8000000000 007F8000000000007F8000000000007FC000000000007FC000000000003FE00000000000 3FE000000000003FF000000000001FF000000000FC1FF800000000FC0FFC00000001FE0F FE00000001FE07FF00000003FE03FF80000007FE03FFC000000FFC01FFF000001FFC00FF FC00003FF8007FFF0000FFF0003FFFF007FFE0001FFFFFFFFFE0000FFFFFFFFFC00007FF FFFFFF000001FFFFFFFE0000007FFFFFF80000001FFFFFE000000007FFFF80000000007F F80000374178BF48>I<000007C0000000000FE0000000001FF0000000003FF800000000 3FF8000000003FF8000000003FF8000000003FF8000000001FF0000000000FE000000000 07C000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000001FFFFFF000003FFF FFF000007FFFFFF800007FFFFFF800007FFFFFF800007FFFFFF800003FFFFFF800001FFF FFF80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F80000000007F800000000 07F80000000007F80000000007F80000000007F80000000007F800003FFFFFFFFFFC7FFF FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFE3FFF FFFFFFFC305974D848>105 D<3FFFFFF80000007FFFFFF8000000FFFFFFFC000000FFFF FFFC000000FFFFFFFC000000FFFFFFFC0000007FFFFFFC0000003FFFFFFC000000000003 FC000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC 000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC00 0000000003FC000000000003FC000000000003FC000000000003FC000000000003FC0000 00000003FC000000000003FC000000000003FC000000000003FC000000000003FC000000 000003FC000000000003FC000000000003FC000000000003FC000000000003FC00000000 0003FC000000000003FC000000000003FC000000000003FC000000000003FC0000000000 03FC000000000003FC000000000003FC000000000003FC000000000003FC000000000003 FC000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC 000000000003FC000000000003FC000000000003FC000000000003FC000000000003FC00 0000000003FC000000000003FC000000000003FC000000000003FC000000000003FC0000 00000003FC000000000003FC000000000003FC000000000003FC000000000003FC000000 000003FC000000000003FC000000000003FC000000000003FC000000000003FC00000000 0003FC000000000003FC000000000003FC000000000003FC000000000003FC0000000000 03FC000000000003FC000000000003FC000000000003FC000000000003FC0000003FFFFF FFFFFFC07FFFFFFFFFFFE0FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFF FFFFF07FFFFFFFFFFFE03FFFFFFFFFFFC0345876D748>108 D<000003FE00000000001F FFC000000000FFFFF800000001FFFFFC00000007FFFFFF0000000FFFFFFF8000001FFFFF FFC000003FFFFFFFE000007FFE03FFF00000FFF0007FF80001FFC0001FFC0003FF80000F FE0003FF000007FE0007FE000003FF0007FC000001FF000FF8000000FF800FF00000007F 801FF00000007FC01FE00000003FC03FE00000003FE03FC00000001FE03FC00000001FE0 7F800000000FF07F800000000FF07F800000000FF07F800000000FF07F0000000007F0FF 0000000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF00 00000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF0000000007F8FF0000 000007F8FF800000000FF87F800000000FF07F800000000FF07F800000000FF07FC00000 001FF07FC00000001FF03FE00000003FE03FE00000003FE03FE00000003FE01FF0000000 7FC01FF8000000FFC00FF8000000FF800FFC000001FF8007FE000003FF0007FF000007FF 0003FF80000FFE0001FFC0001FFC0000FFF0007FF800007FFE03FFF000007FFFFFFFF000 003FFFFFFFE000000FFFFFFF80000007FFFFFF00000003FFFFFE00000000FFFFF8000000 001FFFC00000000003FE000000354177BF48>111 D<000000007FC000003FFFC003FFF8 00007FFFC01FFFFE0000FFFFE03FFFFF8000FFFFE0FFFFFFC000FFFFE1FFFFFFE000FFFF E3FFFFFFF0007FFFE7FFFFFFF8003FFFEFFF00FFFC00001FFFF8003FFE00001FFFE0000F FF00001FFFC00003FF00001FFF800001FF80001FFF000000FFC0001FFE000000FFC0001F FC0000007FE0001FF80000003FE0001FF80000003FE0001FF00000001FF0001FF0000000 1FF0001FF00000000FF0001FE00000000FF8001FE000000007F8001FE000000007F8001F E000000007F8001FE000000007FC001FE000000007FC001FE000000003FC001FE0000000 03FC001FE000000003FC001FE000000003FC001FE000000003FC001FE000000003FC001F E000000003FC001FE000000003FC001FE000000003FC001FE000000003FC001FE0000000 07FC001FE000000007FC001FE000000007F8001FE000000007F8001FF00000000FF8001F F00000000FF8001FF00000000FF0001FF80000001FF0001FF80000001FF0001FF8000000 3FE0001FFC0000003FE0001FFC0000007FC0001FFE000000FFC0001FFF000001FF80001F FF800003FF80001FFFC00007FF00001FFFE0001FFE00001FFFF0007FFC00001FEFFE03FF F800001FE7FFFFFFF800001FE7FFFFFFF000001FE3FFFFFFC000001FE0FFFFFF8000001F E07FFFFF0000001FE01FFFFC0000001FE007FFF00000001FE001FF800000001FE0000000 0000001FE00000000000001FE00000000000001FE00000000000001FE00000000000001F E00000000000001FE00000000000001FE00000000000001FE00000000000001FE0000000 0000001FE00000000000001FE00000000000001FE00000000000001FE00000000000001F E00000000000001FE00000000000001FE00000000000001FE00000000000001FE0000000 0000001FE00000000000001FE00000000000001FE00000000000001FE000000000003FFF FFF0000000007FFFFFF800000000FFFFFFFC00000000FFFFFFFC00000000FFFFFFFC0000 0000FFFFFFFC000000007FFFFFF8000000003FFFFFF0000000003E5F7DBE48>I<00003F FF000F000003FFFFF01F80001FFFFFFC3F80007FFFFFFF3F8001FFFFFFFFFF8003FFFFFF FFFF8007FFFFFFFFFF800FFFFFFFFFFF801FFFE001FFFF803FFE00003FFF803FF000000F FF807FE0000003FF807FC0000001FF80FF80000001FF80FF80000000FF80FF00000000FF 80FF000000007F80FF000000007F80FF000000007F80FF000000007F807F800000007F80 7FC00000007F807FE00000003F003FF800000000001FFE00000000000FFFE00000000007 FFFF8000000003FFFFFC00000001FFFFFFF00000007FFFFFFE0000001FFFFFFF80000007 FFFFFFE00000007FFFFFF800000003FFFFFC000000001FFFFE00000000007FFF00000000 000FFF800000000001FFC03E000000007FE07F000000003FE0FF000000001FF0FF000000 000FF0FF800000000FF8FF8000000007F8FF8000000007F8FF8000000007F8FFC0000000 07F8FFC000000007F8FFE000000007F8FFF00000000FF8FFF00000000FF0FFF80000001F F0FFFC0000003FF0FFFE0000007FE0FFFF800000FFE0FFFFE00007FFC0FFFFFC007FFF80 FFFFFFFFFFFF80FF7FFFFFFFFF00FE3FFFFFFFFC00FE1FFFFFFFF800FE07FFFFFFE000FE 01FFFFFF8000FC007FFFFE0000780007FFC00000354177BF48>115 D<00000F800000000000001F800000000000003FC00000000000003FC00000000000003F C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F C00000000000003FC00000000000003FC00000000000003FC0000000003FFFFFFFFFFFFC 007FFFFFFFFFFFFC00FFFFFFFFFFFFFE00FFFFFFFFFFFFFE00FFFFFFFFFFFFFE00FFFFFF FFFFFFFE007FFFFFFFFFFFFC007FFFFFFFFFFFFC0000003FC00000000000003FC0000000 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000 0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000 0000003FC00000000000003FC000001F8000003FC000001F8000003FC000003FC000003F C000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003F C000003FC000003FC000003FC000003FC000003FC000003FC000003FE000007FC000003F E000007F8000001FF00000FF8000001FF80001FF0000001FFC0007FF0000000FFF803FFE 0000000FFFFFFFFC00000007FFFFFFF800000003FFFFFFF000000001FFFFFFE000000000 FFFFFF80000000003FFFFE00000000001FFFF8000000000003FF8000003A507DCE48>I E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: a4 /setpagedevice where { pop << /PageSize [595 842] >> setpagedevice } { /a4 where { pop a4 } if } ifelse %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 0 TeXcolorgray Black 0 TeXcolorgray 0 TeXcolorgray 0 TeXcolorgray 1371 304 a Fe(pst-solides3d)45 b Fd(:)1755 487 y(T)-11 b(est)1553 922 y Fc(Marc)m(h)33 b(23,)f(2008)144 1280 y Fb(1)131 b(T)-11 b(est)44 b(sauv)l(egarde)g(en) g(\034c)l(hier)h(dat)f(a)l(v)l(ec)h(jps)p 0 TeXcolorgray 0 TeXcolorgray 581 4464 a 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 581 4464 a 1762 3520 a @beginspecial @setspecial 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 @endspecial @beginspecial @setspecial 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 @endspecial 3180 4464 a currentpoint initclip moveto 3180 4464 a 0 TeXcolorgray 1860 6074 a Fa(1)p 0 TeXcolorgray eop end %%Page: 2 2 TeXDict begin 2 1 bop 0 TeXcolorgray 0 TeXcolorgray 0 TeXcolorgray 144 -45 a Fb(2)131 b(T)-11 b(est)44 b(\351criture)i(de)d (\034c)l(hier)j(dat)d(en)h(PST)-11 b(ric)l(ks)p 0 TeXcolorgray 0 TeXcolorgray 581 3117 a 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 581 3117 a 1762 2172 a @beginspecial @setspecial 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 @endspecial @beginspecial @setspecial 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 @endspecial 3180 3117 a currentpoint initclip moveto 3180 3117 a 0 TeXcolorgray 1860 6074 a Fa(2)p 0 TeXcolorgray eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF