; TeX output 1998.04.09:1412x>ffG Ս"V cmbx103D.MPT:3-DIMENSIONALREPRESENT ATIONSTANDANIMA TIONSINMETAPOST>ɉffGK`y cmr10versionUU1.0,8April1998DenisTRoQegel('ExXQ leorusedonwebpagesforinstance.p`SeethedocumentationenclosedintheUUdistributionformoredetails.ThanksUUtoJohnHobbyandUlrikViethforhelpfulhints.LIMIT*ATIONS: !", cmsy10anob8jectcannotincludeTU>'ExXlabGels;7toovercomethislimitationwouldneedtowrapthemetapostoutputwithUUdvipssothatthenecessaryfontsareloaded(easytodo,butnotdonehere)PROJECTSUUFORTHEFUTURE:UUtakelightsourcesintoaccountandshowshadowsanddarkerfacesUUhandleoverlappingUUofob8jects($': cmti10objffnamecanbGeusedwhengoingthroughallfaces)if &known*C-thr}'ee]\ffnndffversionmk:expandafterSrendinput*%UUavoidsloadingthispackqagetwice ;message+3 cmmi10:0;`1*x>ffG V*ectorUUopGerations0ffG%UUde nitionofvectoribyitscoGordinates defve}'ctىffdef7ҫ(exprci;xi ;yi ;zi «)UP=ve}'ct䏫[i]x:=xi ǫ;mve}'ct[i]y):=yi F=;mve}'ct[i]z:=zi ;0enddef'$;%UUapGointisstoredasavectorletJIsetىffp}'oint:=UPve}'ctىffdef'xM;%UUsetىffobj^ff pp}'oint?ᠫisUUlikesetىffp}'oint*ī,butthe rstparameter%UUisaloGcalpointnumbGerdefsetىffobj^ff pp}'ointL˫(exprci;xi ;yi ;zi «)UP=setىffp}'oint*(pnt (i);xi;yi ;zi «)enddef% ;%UUde nitionofavectorbyanothervectordefve}'ctىffdefff̧vectL$(exprci;j)UP=ve}'ct%A[i]xUP:=ve}'ct䏫[j]x;mve}'ct[i]y):=ve}'ct[j]y[٫;mve}'ct[i]z:=ve}'ct[j]zp;enddef"O;%UUvectorsum:qve}'ct[kP] ve}'ct䔫[i]+ve}'ct?[j]defve}'ctىffsum;A(exprckP;i;j)UP=ve}'ct%A[kP]xUP:=ve}'ct䏫[i]x8+ve}'ct[j]x;ve}'ct%A[kP]y):=UPve}'ct䏫[i]y+8ve}'ct[j]y[٫;ve}'ct%A[kP]z:=UPve}'ct䏫[i]zw+8ve}'ct[j]zp;enddef"O;%UUvectortranslation:qve}'ct[i] ve}'ct䔫[i]+ve}'ct?[v[٫]defve}'ctىfftranslateO ˫(exprci;v[٫)UP=ve}'ctىffsum*!(i;i;v[٫)enddef% ;%UUvectordi erence:qve}'ct[kP] ve}'ct䔫[i]ve}'ct?[j]defve}'ctىffdi 9IZ(exprckP;i;j)UP=ve}'ct%A[kP]xUP:=ve}'ct䏫[i]x8ve}'ct[j]x;ve}'ct%A[kP]y):=UPve}'ct䏫[i]y8ve}'ct[j]y[٫;ve}'ct%A[kP]z:=UPve}'ct䏫[i]zw8ve}'ct[j]zp;enddef"O;%UUdotproGductofve}'ct䔫[i]andve}'ct[j]v\rardef#_ve}'ctىffdprodQH(exprci;j)UP=(ve}'ct?[i]x8ve}'ct[j]x+ve}'ct[i]yve}'ct[j]y+ve}'ct[i]zwve}'ct[j]zp)enddef"O;%UUmoGdulusofve}'ct䔫[i]v\rardef#_ve}'ctىffmodK(exprci)UP=sqrt\n(ve}'ctىffdprod-^(i;i))enddef% ;%UUvectorproGduct:qve}'ct[kP] ve}'ct䔫[i]^ve}'ct[j]defve}'ctىffprodffG V*ectorUUrotation>ɉffG%UURotationofve}'ct䔫[v[٫]aroundve}'ct[axis]byananglealphaHTheUUvector~v gis rstpro8jectedontheaxisgivingvectors ~a ګand\qб~h L:_IӍ 8PSfile=vect-fig.9 llx=-23 lly=-6 urx=112 ury=86 rwi=13503IfGweset\q'~b = g 6t!b axis&fe"B&ekʍg t!baxis"Ak",Itherotatedvector~x卓v[ٟrO!cmsy70isequalto\q~h &Z+\q~~Tf \Iwhere\qM~f E=UPcos %η| ~Ta ث+Tsin* ~Tcp/.mand\q~Gh _V=UP(~vQ\qƱ~Tbf)\qr~bq} 1D8PSfile=vect-fig.10 llx=-13 lly=-18 urx=86 ury=86 rwi=990%UUTherotationisindepGendentofve}'ct䔫[axis]'smodule. %UUv.=oldandnewvector%UUaxisd=UUrotationaxis%UUalphao=UUrotationangle%v\rardef#_ve}'ctىffrotateRL(exprcv[;axis;alphas)UP=sa9ve,./vffa;j9;vffb]~;vffcL;vffdGH;vffe|A;vfffQ;vffa&\:=UPnewffve}'ct*;mvffb#:=UPnewffve}'ct;mvffcA:=UPnewffve}'ct;vffd&Ղ:=UPnewffve}'ct*;mvffe&:=UPnewffve}'ct;mvfff:=UPnewffve}'ct;vffg&,:=UPnewffve}'ct*;mvffhǫ:=UPnewffve}'ct;ve}'ctىffmult=;(vffbf;axis;1=ve}'ctىffmod()b(axis));ve}'ctىffmult=;(vffh< ;vffb]~;ve}'ctىffdprod0v(vffbf;v[٫));UU%pro8jectionofv.onaxisve}'ctىffdi 9(vffa< ;v[;vffh");ve}'ctىffprod<(vffc;vffb]~;vffa");ve}'ctىffmult=;(vffd0;vffa";cosd(alpha[));ve}'ctىffmult=;(vffe);vffcL;sindp(alpha[));ve}'ctىffsum;ӫ(vfff۱;vffdGH;vffe|A);ve}'ctىffsum;ӫ(v[;vfffQ;vffh");fr}'ee]\ffnnvect9s(vffh< );mfr}'ee]\ffnnvect+(vffgK);fr}'ee]\ffnnvect9s(vfff۫);mfr}'ee]\ffnnvect+(vffe));mfr}'ee]\ffnnvect(vffd0);fr}'ee]\ffnnvect9s(vffc);mfr}'ee]\ffnnvect+(vffbf);mfr}'ee]\ffnnvect(vffa< );enddef"O;`3nx>ffG *OpGerationsUUonob8jects0ffG%UUiname!isUUthehandlerforaninstanceofanob8jectofclassname %UUiname!mustUUbGealetterstringv\rardef#_assignadffrvobjP_(exprciname5%;name B)UP=sa9ve,./tmp}'defK-l;string4tmp}'defSO;UU%weneedtoadddoublequotes(char34)tmp}'def6T=UP"def?"%&8iname&8"_class="3&8ditto>&8name&8ditto&8"?enddef"1xū;scan9tokensLtmp}'defk;defff̧obj44(inameT:);enddef"O;%UUnameԫisUUthethenameofanob8jectinstance%UUItmustbGemadeonlyofletters(orunderscores),butnodigits.defdefff̧obj4k(exprcname2)UP=scan9tokensLbQegingroup(sa9ve@.1tmp}'def_-n;mstring&}tmp}'defE;(tmp}'defJT=UP"def_"%&8obj^ff pclasso"ff-Z(nameC*)8&"("1&ditto>&name&ditto&")"׫;(tmp}'defendgroupenddef"O;%UUThismacroputsanob8jectbackwhereitwasrightatthebGeginning.%UUiname!isUUthenameofanob8jectinstance.v\rardef#_r}'esetىffobjJ(exprciname5%)UP=sa9ve,./tmp}'defK-l;string4tmp}'defSO;de ne]\ffnncurr}'entىffpointىffo setىffHx(inameT:);tmp}'def6T=UP"set_"%&8obj^ff pclasso"ff-Z(inameT:)8&"_points"1xū;scan9tokensLtmp}'defk(inameT:);enddef"O;%UUPutanob8jectatpGositiongivenbyp}'osI(avector)and%UUwithorientationsgivenbyanglespsio,theta%,phi.%UUTheob8jectisscaledbysc}'alem.%UUiname!isUUthenameofanob8jectinstance.v\rardef#_putىffobjD(exprciname5%;p}'osf;sc}'ale0;psi2;theta;phi)UP=r}'esetىffobj;+f(inameT:);msc}'ale]\ffnnobj-6 (iname;sc}'ale0);vffx&Z:=UPnewffve}'ct*;mvffyt:=UPnewffve}'ct;mvffz_:=UPnewffve}'ct;ve}'ctىffdefff̧vectM`Q(vffx3;ve}'ctىffIt );ve}'ctىffdefff̧vectM`Q(vffy;ve}'ctىffJ);ve}'ctىffdefff̧vectM`Q(vffz;ve}'ctىffK!();r}'otate]\ffnnobj^ff pabso"ff4pv`(inameT:;p}'ointىffnull.ұ;vffzs;psi2);ve}'ctىffrotateC)(vffx3;vffzs;psi2);mve}'ctىffrotate5F#(vffy;vffz;psi);r}'otate]\ffnnobj^ff pabso"ff4pv`(inameT:;p}'ointىffnull.ұ;vffyϱ;theta);ve}'ctىffrotateC)(vffx3;vffyϱ;theta);mve}'ctىffrotate5F#(vffz;vffy;theta);r}'otate]\ffnnobj^ff pabso"ff4pv`(inameT:;p}'ointىffnull.ұ;vffx ;phi);ve}'ctىffrotateC)(vffy;vffx ;phi);mve}'ctىffrotate5F#(vffz;vffx;phi);fr}'ee]\ffnnvect9s(vffz);mfr}'ee]\ffnnvect+(vffy);mfr}'ee]\ffnnvect(vffx3);tr}'anslate]\ffnnobjL-(inameT:;p}'osf);enddef"O;`4)x>ffG *Rotation,UUtranslationandscalingofob8jects0ffG%UURotationofanob8jectinstancenameԫaroundanaxis %UUgoingthroughapGointp(localtotheob8ject)%UUanddirectedbyvectorve}'ct䔫[v[٫].qTheangleofrotationisa.v\rardef#_r}'otate]\ffnnobj^ff ppv]((exprcname2;p;v[;a)UP=de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);r}'otate]\ffnnobj^ff pabso"ff4pv`(nameC*;pnt#(p);v[;a);enddef"O;v\rardef#_r}'otate]\ffnnobj^ff pabso"ff4pvo#(exprcname2;p;v[;a)UP=sa9ve,./vffa;j9;de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);vffa&\:=UPnewffve}'ct*;for%ZKiUP:=18uptoqobj^ff pp}'ointso"ffK (nameC*):(ve}'ctىffdi M(vffa< ;pnt#(i);p);(ve}'ctىffrotateW)(vffa< ;v[;a);(ve}'ctىffsumOի(pnt (i);vffa";p);endfor4 j;fr}'ee]\ffnnvect9s(vffa< );enddef"O;%UURotationofanob8jectinstancenameԫaroundanaxis%UUgoingthroughapGointp(localtotheob8ject)%UUanddirectedbyvectorȍUc!N8hpq Ud.qTheangleofrotationisa.v\rardef#_r}'otate]\ffnnobj^ff ppp] (exprcname2;p;q[;a)UP=sa9ve,./vffa;j9;axis;de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);vffa&\:=UPnewffve}'ct*;maxis+:=UPnewffve}'ct;ve}'ctىffdi 9(axis;pnt#(q[٫);pnt(p));for%ZKiUP:=18uptoqobj^ff pp}'ointso"ffK (nameC*):(ve}'ctىffdi M(vffa< ;pnt#(i);pnt(p));(ve}'ctىffrotateW)(vffa< ;axis;a);(ve}'ctىffsumOի(pnt (i);vffa";pnt#(p));endfor4 j;fr}'ee]\ffnnvect9s(axis);mfr}'ee]\ffnnvect+(vffa< );enddef"O;%UUT*ranslationofanob8jectinstancenameԫbyavectorve}'ct䔫[v[٫].v\rardef#_tr}'anslate]\ffnnobj[w(exprcname2;v[٫)UP=de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);for%ZKiUP:=18uptoqobj^ff pp}'ointso"ffK (nameC*):(ve}'ctىffsumOի(pnt (i);pnt#(i);v[٫);endfor4 j;enddef"O;%UUScalarmultiplicationofanob8jectinstancenameԫbyascalarv[٫.v\rardef#_sc}'ale]\ffnnobjJy5(exprcname2;v[٫)UP=de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);for%ZKiUP:=18uptoqobj^ff pp}'ointso"ffK (nameC*):(ve}'ctىffmultQ=(pnt (i);pnt#(i);v[٫);endfor4 j;enddef"O;`5=Lx>ffG *F*unctionsUUtobuildnewpGointsinspace0ffG%UURotationinaplane:qthisisusefultode nearegularpGolygon. %UUkisanewpGointobtainedfrompointjbyrotationaroundo%UUbyaangle ^ϫequaltotheanglefromitoj.C/A6PSfile=vect-fig.11 llx=-7 lly=-7 urx=58 ury=57 rwi=650v\rardef#_r}'otate]\ffnninadffrvplane]\ffi@(exprckP;o;i;j)UP=sa9ve,./c}'osalphaQ(vffa< ;vffb]~)=ve}'ctىffmod()b(vffa)=ve}'ctىffmod(vffbf);sinalpha;ū=UPsqrt\n(18c}'osalpha) 52);alpha/=UPanglep((c}'osalpha%I;sinalpha'R));ve}'ctىffrotateC)(vffbf;vffcL;alphas);ve}'ctىffsum;ӫ(kP;o;vffb]~);fr}'ee]\ffnnvect9s(vffc);mfr}'ee]\ffnnvect+(vffbf);mfr}'ee]\ffnnvect(vffa< );enddef"O;v\rardef#_r}'otate]\ffnninadffrvplanee-(exprckP;o;i;j)UP=r}'otate]\ffnninadffrvplane]\ffZ+(pnt (kP);o;pnt#(i);pnt(j))enddef"O;%UUBuildapGointonaadjacentface. TheUUmiddlemofpGointsiandjissuchthat8%1u cmex10d1ȍ(ȍ!N8om ;ȍ!N8mc⪫).%=UP ^ϫThisisusefultode neregularpGolyhedraAV}5PSfile=vect-fig.7 llx=-8 lly=-9 urx=78 ury=53 rwi=860v\rardef#_newfffac}'e]\ffnnpointىffh(exprcc;o;i;jR;alphas)UP=sa9ve,./vffa;j9;vffb]~;vffcL;vffdGH;vffe|A;vffa&\:=UPnewffve}'ct*;mvffb#:=UPnewffve}'ct;mvffcA:=UPnewffve}'ct;mvffd:=UPnewffve}'ct;mvffe&:=UPnewffve}'ct;ve}'ctىffdi 9(vffa< ;i;o);mve}'ctىffdi +(vffbf;jR;o);ve}'ctىffsum;ӫ(vffc;vffa";vffb]~);ve}'ctىffmult=;(vffd0;vffcL;:5);ve}'ctىffdi 9(vffe);i;j);ve}'ctىffsum;ӫ(c;vffdGH;o);ve}'ctىffrotateC)(vffd0;vffe|A;alphas);ve}'ctىffsum;ӫ(c;vffdGH;c);fr}'ee]\ffnnvect9s(vffe));mfr}'ee]\ffnnvect+(vffd0);mfr}'ee]\ffnnvect(vffc);mfr}'ee]\ffnnvect(vffbf);mfr}'ee]\ffnnvect(vffa< );enddef"O;v\rardef#_newfffac}'e]\ffnnpointd(exprcc;o;i;jR;alphas)UP=newfffac}'e]\ffnnpointىffYE(pnt (c);pnt#(o);pnt(i);pnt(j);alphas)enddef"O;v\rardef#_newffabso"ff4fac}'e]\ffnnpointwC(exprcc;o;i;jR;alphas)UP=newfffac}'e]\ffnnpointىffYE(c;o;pnt#(i);pnt(j);alphas)enddef"O;`6NSx>ffG *ComputationUUofthepro8jectionofapGointonthe\screen"0ffG%UUpisthepro8jectionofm %UUm=pGointinspace(3coordinates)%UUp=pGointoftheintersectionplaneBD@:PSfile=vect-fig.8 llx=-25 lly=-25 urx=306 ury=150 rwi=3310v\rardef#_pr}'ojectىffpoint[(exprcp;m)UP=sa9ve,./tmp}'alphaT ;vffa";vffb]~;vffa&\:=UPnewffve}'ct*;mvffb#:=UPnewffve}'ct;ve}'ctىffdi 9(vffbf;m;Obs8);UU%vectorObsu-m(%UUve}'ct䔫[vffa< ]UUisve}'ct[vffbf]expressedin(ObsIʢ,ObsJ,ObsK?)(%UUcoGordinates.ve}'ct%A[vffa< ]xUP:=ve}'ct䏫[IObsI1ffS]x8ve}'ct[vffbf]x8+8ve}'ct[IObsJff0]x8ve}'ct[vffbf]y+ve}'ct[IObsKff!V]xve}'ct[vffbf]zp;ve}'ct%A[vffa< ]y):=UPve}'ct䏫[IObsI1ffS]y8ve}'ct[vffbf]x8+8ve}'ct[IObsJff0]y8ve}'ct[vffbf]y+8ve}'ct[IObsKff!V]y8ve}'ct[vffbf]zp;ve}'ct%A[vffa< ]z:=UPve}'ct䏫[IObsI1ffS]zw8ve}'ct[vffbf]x8+8ve}'ct[IObsJff0]zw8ve}'ct[vffbf]y+8ve}'ct[IObsKff!V]z8ve}'ct[vffbf]zp;if&ve}'ct0[vffa< ]xUPnotdrawn"x;(x[p]UP:=to}'o>ffObig~ff%K;my[٫[p]=to}'o>ffObig~ff;else&:(if0_(angle (ve}'ct?[vffa< ]x;ve}'ctVW[vffa]zp)UP>hadffrv eldF=2)>8orI\r(angle (ve}'ct?[vffa< ]x;ve}'ctVW[vffa]y[٫)UP>vff eld=2):<messageg"Point?"&8decimal&URm8&"?outofscreen->notdrawn"x;<x[p]UP:=to}'o>ffObig~ff%K;my[٫[p]=to}'o>ffObig~ff;(else::<tmp}'alphag3C:=UPObso"ff4dist(=ve}'ct?[vffa< ]x;<y[٫[p]UP:=dr}'awing~ffscaleA-;8tmp}'alpha,O8ve}'ct[vffa< ]y;<x[p]UP:=dr}'awing~ffscaleA-;8tmp}'alpha,O8ve}'ct[vffa< ]zp;( .ū; ë;fr}'ee]\ffnnvect9s(vffbf);mfr}'ee]\ffnnvect+(vffa< );enddef"O;%UUOb8jectprojection%UUThisisamereiterationonpr}'ojectىffpointdefpr}'ojectىffobjCy(exprcname2)UP=de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);for%ZKiUP:=18uptoqobj^ff pp}'ointso"ffK (nameC*):mpr}'ojectىffpoint>jf(ipntىff.(i);pnt#(i));0endfor%;enddef"O;`7cx>ffG *DrawUUoneface,hidingitifitishidden0ffG%UUTheorderoftheverticesdetermineswhatisthevisibleside %UUoftheface.qTheordermustbGeclockwisewhenthefaceisseen.%UUdr}'awhidden8isUUabGoolean;UUiftrueݫonlyhiddenfacesaredrawn;iffalsepQ,%UUonlyvisiblefacesaredrawn.qTherefore,dr}'awffface1iscalledtwice%UUbydr}'awfffaces2p.v\rardef#_dr}'awfffaceNQګ(text*vertic}'es9 )(exprcc}'ol&R;dr}'awhidden4.)UP=sa9ve,./p;num;normalffve}'ct7H;vffa";vffb]~;vffcL;over ow(ӫ;path.1bp;mbQoolean0oover owUJ;over ow< =UPfalsepL;forsuxesI$UP=vertic}'es$:(if3&zp[ipntىff.($)]UP=(to}'o>ffObig~ff",;to}'o>ffObig~ff$):mover ow.x:=true3;m .;(exitifF(over owke;;endfor4 j;if&over owDcx:Jmessagevc"Face?cannotbedrawn,duetooverflow"HcC;else&:(pUP=forsuxes9$=vertic}'es$:*!zp[ipntىff.($)]-UI- endfor04cycleF(;(num; ٓRcmr70CΫ:=UP0;mnum t1!7:=0;mnum t2:=0;<%UUgetthethreelastsuxes:(forsuxes]$UP=vertic}'es$:*!num>(0F:=numDW1ʫ;mnum t1!7:=numDW2;mnum t2!7:=$;0endfor%;(normalffve}'ct`f:=UPnewffve}'ct*;mvffaǫ:=UPnewffve}'ct;mvffb#:=UPnewffve}'ct;(vffc9ث:=UPnewffve}'ct*;(ve}'ctىffdi M(vffa< ;pnt#(num1kz);pnt(num0));(ve}'ctىffdi M(vffbf;pnt#(num2kz);pnt(num1));(ve}'ctىffprodP(normalffve}'ct50;vffa";vffb]~);(ve}'ctىffdi M(vffc;pnt#(num1kz);Obs8);(if3& lle}'dfffacesbϫ:<ifG&ve}'ctىffdprodu(normalffve}'ct50;vffcL)UP<0:P ll`!mpwithcolor5rc}'olAa;mifC(dr}'awffcontoursPVϫ:Vs%UUV*ariablesforfacehandling.qFirst,wehaveanarrayforlistsofvertices %UUcorrespGondingtofaces.string fac}'e]\ffnnpointso"ffT3![];UU%analogoustove}'ct9arrays%UUThen,wehaveanarrayofcolors.qAcolorneedstobGeastring%UUrepresentinganhexadecimalRGBcoGdingofacolor.string fac}'e]\ffnncolorffO>[];%UUnameԫisUUthenameofanob8jectinstancev\rardef#_dr}'awfffacesRz`(exprcname2)UP=sa9ve,./tmp}'defK-l;mstring&}tmp}'defE;de ne]\ffnncurr}'entىffface]\ffo setىff:(nameC*);(%UU rstthehiddenfaces(dashesmustbGedrawn rst):for%ZKiUP:=18uptoqobj^ff pfac}'eso"ffF(nameC*):(tmp}'defJT:=UP"draw_face("D &8fac}'e]\ffnnpointso"ff5[fac}'e0(i)]>8&8")(hexcolor("H&8ditto>&8fac}'e]\ffnncolorff1\[fac}'e0(i)]8&ditto>8&8"),true)"1xū;mscan9tokens>>tmp}'def]{;endfor4 j;(%UUthen,thevisiblefaces:for%ZKiUP:=18uptoqobj^ff pfac}'eso"ffF(nameC*):(tmp}'defJT:=UP"draw_face("D &8fac}'e]\ffnnpointso"ff5[fac}'e0(i)]>8&8")(hexcolor("H&8ditto>&8fac}'e]\ffnncolorff1\[fac}'e0(i)]8&ditto>8&8"),false)"6«;mscan9tokens>>tmp}'def]{;endfor4 j;enddef"O;%UUDrawpGointnofob8jectinstancenamev\rardef#_dr}'awffpointS_\(exprcname2;n)UP=de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);pr}'ojectىffpointLM(ipntىff.(n);pnt#(n));if&zp[ipntىff.(n)]UP6=(to}'o>ffObig~ff",;to}'o>ffObig~ff$):(pic9kupL)pQencircle{mscaled+5pt aë;(dra9wdotQ*(zp[ipntىff.(n)]);(pic9kupL)pQencircle{mscaled+:4pt aë; ë;enddef"O;v\rardef#_dr}'awffaxesO(exprcr;g[;b)UP=pr}'ojectىffpointLM(1;ve}'ctىffnull)_);pr}'ojectىffpointLM(2;ve}'ctىffIt );pr}'ojectىffpointLM(3;ve}'ctىffJ);pr}'ojectىffpointLM(4;ve}'ctىffK!();if_(z1÷6=UP(to}'o>ffObig~ff",;to}'o>ffObig~ff$)):(if0_(z2÷6=UP(to}'o>ffObig~ff",;to}'o>ffObig~ff$)):<dra9warrowt]z1ë- Ѽ-_z2Cdashed-.%evenlyKwithcolor}\rG;( .ū;(if0_(z3÷6=UP(to}'o>ffObig~ff",;to}'o>ffObig~ff$)):<dra9warrowt]z1ë- Ѽ-_z3Cdashed-.%evenlyKwithcolor}\g[٫;( .ū;(if0_(z4÷6=UP(to}'o>ffObig~ff",;to}'o>ffObig~ff$)):<dra9warrowt]z1ë- Ѽ-_z4Cdashed-.%evenlyKwithcolor}\b;( .ū; ë;enddef"O;`9 x>%UUDe nitionofamacroobj^ff pname0[returninganob8jectname %UUwhengivenanabsolute%UUfacenumbGer.qThisUUde nitionisbuiltincrementallythroughastring,%UUeverytimeanewob8jectisde ned.%UUobj^ff pname0[isUUde nedbyr}'ede ne]\ffnnobj^ff pname]\ffV.%UUInitialde nitionstring indexEffWto>ffOname]\ffe3&;indexEffWto>ffOname]\ffGf=UP"def?obj_name(expri)=ifi<1:";%UUnameԫisUUthenameofanob8jectinstance%UUnistheabsoluteindexofitslastfacedefr}'ede ne]\ffnnobj^ff pname]\ffg>(exprcname2;n)UP=indexEffWto>ffOname]\ff[h:=UPindexEffWto>ffOname]\ffJ*F&8"elseif?i<="Cq&8decimal&URn8&":"1&ditto>8&8name&8ditto^;scan9tokensLbQegingroupindexEffWto>ffOname]\ffV&8"fi;enddef;"Cendgroupsū;enddef"O;%UUiisanabsolutefacenumbGer%UUvertic}'es(isUUastringrepresentingalistofvertices%UUr}'gbcolor)8sisUUastringrepresentingacolorinrgbhexadecimaldefsetىfffac}'e5«(exprci;vertic}'es$.|;r}'gbcolor%T)UP=fac}'e]\ffnnpointso"ffG[i]UP:=vertic}'es$;mfac}'e]\ffnncolorff5?[i]:=r}'gbcolor%;enddef"O;%UUiisaloGcalfacenumber%vertic}'es$isUUastringrepresentingalistofvertices%r}'gbcolor%isUUastringrepresentingacolorinrgbhexadecimaldefsetىffobj^ff pfac}'eGI(exprci;vertic}'es$.|;r}'gbcolor%T)UP=setىfffac}'e%=(fac}'e0(i);vertic}'es;r}'gbcolor%T)enddef"O;10 Ǎx>ffG *ComputeUUthevectorscorrespGondingtotheobserver'sviewpGoint0ffG%UU(vectorsObsI1ff ,ObsJffandObsKff#intheve}'ctىffIJ,ve}'ctىffJl, %UUve}'ctىffK% UP0,m<0and>0;moreover,UUjGj90^)defc}'ompute]\ffnnreferencec*T(exprcpsi'};theta;phi)UP=%UUObsI1ff #_de nesUUthedirectionofobservqation;%UUObsJff!Z֫andUUObsKff#theUUorientation%UU(butoneofthesetwoUUvectorsisenough,%UUsinceObsKff#=ObsI1ff #_^ObsJff)%UUThevectorsarefoundbyrotationsofve}'ctىffIJ,ve}'ctىffJl,ve}'ctىffKa.ve}'ctىffdefff̧vectM`Q(ObsI1ffx;ve}'ctىffIt );mve}'ctىffdefff̧vect?|(ObsJff,;ve}'ctىffJ);ve}'ctىffdefff̧vectM`Q(ObsKff-R;ve}'ctىffK!();ve}'ctىffrotateC)(ObsI1ffx;ObsKffj;psi2);ve}'ctىffrotateC)(ObsJff,;ObsKffj;psi2);UU%gives(u,v[٫,zp)ve}'ctىffrotateC)(ObsI1ffx;ObsJffwD;theta);ve}'ctىffrotateC)(ObsKff-R;ObsJffwD;theta);UU%gives(OGbs 0ercmmi7x,v[٫,wD)ve}'ctىffrotateC)(ObsJff,;ObsI1ff?ͱ;phi);ve}'ctىffrotateC)(ObsKff-R;ObsI1ff?ͱ;phi);UU%gives(OGbsx,Obsy·,Obsz)%UUThepassagematrixPfromve}'ctىffIJ,ve}'ctىffJl,ve}'ctىffK%UUtoObsI1ff ,ObsJff,,ObsKff isthematrix%UUcompGosedofthevectorsObsI1ff ,ObsJffandObsKff#expressed%UUinthebaseve}'ctىffIJ,ve}'ctىffJl,ve}'ctىffKa.%UUW*ehaveUUX2=UPPcX^0pwhereX7arethecoGordinatesofapoint%UUinve}'ctىffIJ,ve}'ctىffJl,ve}'ctىffK%UUandX^0pthecoGordinatesofthesamepointinObsI1ff ,ObsJff,,ObsKff-R.%UUInordertogetPc^1 ,itsucestobuildvectorsusing%UUthepreviousrotationsintheinverseUUorder.ve}'ctىffdefff̧vectM`Q(IObsI1ffS;ve}'ctىffIt );mve}'ctىffdefff̧vect?|(IObsJff0;ve}'ctىffJ);ve}'ctىffdefff̧vectM`Q(IObsKff!V;ve}'ctىffK!();ve}'ctىffrotateC)(IObsKff!V;IObsI1ff ѱ;phiNʫ);mve}'ctىffrotate5F#(IObsJff0;IObsI1ff;phiNʫ);ve}'ctىffrotateC)(IObsKff!V;IObsJff!RH;theta;Ы);mve}'ctىffrotate5F#(IObsI1ffS;IObsJff;theta;Ы);ve}'ctىffrotateC)(IObsJff0;IObsKff#n;psi I);mve}'ctىffrotate5F#(IObsI1ffS;IObsKff;psi I);enddef"O;11 Lx>ffG *PointUUofview>ɉffG%UUThismacrocomputesthethreeanglesnecessaryforc}'ompute]\ffnnreference %UUnameԫ=UUnameofaninstanceofanob8ject%UUtar}'get F=UUtargetpGoint(localtoob8jectname)%UUphit=UUanglev\rardef#_p}'ointىffofff̧viewffobjq̫(exprcname2;tar}'getc ;phi)UP=de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);UU%enablespntp}'ointىffofff̧viewffabsb(pnt (tar}'get);phi);enddef"O;%UUComputeabsolutepGerspective.qtar}'get!c$isUUanabsolutepGointnumbGerv\rardef#_p}'ointىffofff̧viewffabsq@(exprctar}'get3mk;phi)UP=sa9ve,./vffa;j9;psi2;theta;vffa&\:=UPnewffve}'ct*;ve}'ctىffdi 9(vffa< ;tar}'getc ;Obs8);ve}'ctىffmult=;(vffa< ;vffa";1=ve}'ctىffmod()b(vffa));psi$l=UPanglep((ve}'ct?[vffa< ]x;ve}'ctVW[vffa]y[٫));theta-"=UPangle8((ve}'ct?[vffa< ]x8++ve}'ct%;[vffa]y[;ve}'ctVW[vffa]zp));c}'ompute]\ffnnreferencec(psi I;theta;phi);fr}'ee]\ffnnvect9s(vffa< );enddef"O;%UUDistancebGetweenUUtheobserverandpointnofob8jectname%UUResultisputindistv\rardef#_obso"ff4distanc}'eYo(text*dist(,)(exprcname2;n)UP=sa9ve,./vffa;j9;vffa&\:=UPnewffve}'ct*;de ne]\ffnncurr}'entىffpointىffo setىffHx(nameC*);UU%enablespntdist':=UPve}'ctىffmod+~(vffa< ;pnt#(n);Obs8);fr}'ee]\ffnnvect9s(vffa< );enddef"O;12 x>ffG *V*ectorUUandpGointallocation0ffG%UUAlloGcationisdonethroughastackofvectors n9umeric+lastىffve}'ctىffT ;lastىffve}'ctىff,Gp=UP0;%UUvectoralloGcationdefnewffve}'ct>!۫=UPincrV(lastىffve}'ctىff( )F%UUmessage/9+"Vector?"`&8decimal&URlastىffve}'ctىffQR&8"?allocated"A8;enddef"O;letJInewffp}'oint?«=UPnewffve}'ct*;defnewffp}'ointsC(text*p)(exprcn)UP=sa9ve,./p;n9umeric?p[];for%ZKiUP:=18uptoqn:mp[i]:=newffp}'oint/y;0endfor%;enddef"O;%UUF*reeavector%UUAvectorcanonlybGefreedsafelywhenitwasthelastvectorcreated.deffr}'ee]\ffnnvect9(exprci)UP=if&iUP=lastىffve}'ctىff,Gp:2clastىffve}'ctىff^M:=lastىffve}'ctىff.P81;else&:,NerrmessagedB("Vector?"1xū&8decimal&URi8&"?can'tbefreed!"`); ë;enddef"O;letJIfr}'ee]\ffnnpoint>/=UPfr}'ee]\ffnnvect(;deffr}'ee]\ffnnpointsB#(text*p)(exprcn)UP=for%ZKiUP:=10stepc18un9til1:mfr}'ee]\ffnnpoint0(p[i]);0endfor%;enddef"O;X-ffG *Debugging0ffGdefshowffve}'ct>L(exprct;i)UP=message?"Vector?"q\&8t&"="8&8"("1&8decimal&URve}'ct7䑫[i]x8&","&decimal&URve}'ct7䑫[i]y&","*8&8decimal&URve}'ct7䑫[i]zw&8")"׫;enddef"O;letJIshowffp}'ointD=UPshowffve}'ct.ǫ;defshowffp}'air?f&(exprct;zz /C)UP=message?رt8&"=("q&decimal&URxpart=(zz h+)&","1&decimal&URypart(zz h+)&")"׫;enddef"O;13*x>ffG *AccessUUtoob8jectfeatures0ffG%UUamustbGeastringrepresentinganclassname,suchas"dodecahedron"L+. %UUbisthetailofamacroname.defobj^ff%\(exprca;b;i)UP=scan9tokensbQegingroupOsa9vegn;mstring&}n;mnUP=a8&b&i;nendgroupenddef"O;defobj^ff pp}'ointso"ffC*(exprcname2)UP=obj^ff%牫(obj^ff pclasso"ff*z(nameC*);"_points"2;name B)enddef"O;defobj^ff pfac}'eso"ff>%(exprcname2)UP=obj^ff%牫(obj^ff pclasso"ff*z(nameC*);"_faces",;name B)enddef"O;v\rardef#_obj^ff pp}'ointىffo setىffk.(exprcname2)UP=obj^ff%牫(obj^ff pclasso"ff*z(nameC*);"_point_offset"Q;name B)enddef"O;v\rardef#_obj^ff pfac}'e]\ffnno setىfffu(exprcname2)UP=obj^ff%牫(obj^ff pclasso"ff*z(nameC*);"_face_offset"LF;name B)enddef"O;defobj^ff pclasso"ff>wO(exprcname2)UP=obj^ff<׫(nameC*;"_class",;"" G)enddef% ;14ʍx>defde ne]\ffnnp}'ointىffo setىffgւ(exprcname2;o)UP= bQegingroupOsa9vegn;tmp}'def!U;(stringHn;tmp}'def!U;(nUP=obj^ff pclasso"ff..ʫ(nameC*)8&"_point_offset"S1&name| ;(expandaftergtnumericscan9tokenscan;(scan9tokens`ձnUP:=lastىffp}'ointىffo setىffMF/;(lastىffp}'ointىffo setىffuF3:=UPlastىffp}'ointىffo setىffO+8o;(tmp}'defJT=UP"def?"%&8obj^ff pclasso"ff-Z(nameC*)8&"_points"3&name| &<"="Mݫ&8decimal&URo8&"?enddef"1xū;(scan9tokens`tmp}'def;endgroupenddef"O;defde ne]\ffnnfac}'e]\ffo setىffb(exprcname2;o)UP=bQegingroupOsa9vegn;tmp}'def!U;(stringHn;tmp}'def!U;(nUP=obj^ff pclasso"ff..ʫ(nameC*)8&"_face_offset"M&name| ;(expandaftergtnumericscan9tokenscan;(scan9tokens`ձnUP:=lastىfffac}'e]\ffnno setىffH8;(lastىfffac}'e]\ffnno setىffp8:=UPlastىfffac}'e]\ffnno setىffJq+8o;(tmp}'defJT=UP"def?"%&8obj^ff pclasso"ff-Z(nameC*)8&"_faces".q&name| &<"="Mݫ&8decimal&URo8&"?enddef"1xū;(scan9tokens`tmp}'def;endgroupenddef"O;defde ne]\ffnncurr}'entىffpointىffo setىffK(exprcname2)UP=sa9ve,./curr}'entىffpointىffo setىffz ;n9umeric?curr}'entىffpointىffo setىffǫ;curr}'entىffpointىffo setىffq,:=UPobj^ff pp}'ointىffo setىffKx(nameC*);enddef"O;defde ne]\ffnncurr}'entىffface]\ffo setىffɫ(exprcname2)UP=sa9ve,./curr}'entىffface]\ffnno setىffl;n9umeric?curr}'entىffface]\ffnno setىffE;curr}'entىffface]\ffnno setىffl:=UPobj^ff pfac}'e]\ffnno setىffFkf(nameC*);enddef"O;15ƍx>ffG *DrawingUUanob8ject0ffG%UUnameԫisUUanob8jectinstance defdr}'awffobj;+](exprcname2)UP=pr}'ojectىffobj31 (nameC*);mdr}'awfffaces577(name);0enddef'$;fffGNormalizationUUofanob8jectffG%UUThismacrotranslatesanob8jectsothatalistofverticesiscentered %UUontheorigin,andthelastvertexisputonaspherewhoseradiusis1.%UUnameԫisUUthenameoftheob8jectandvertic}'es(isalist%UUofpGointswhosebarycenterwillde nethecenteroftheob8ject.%UU(vertic}'es$neednotbGethelistofallvertices)v\rardef#_normalize]\ffnnobj`4(exprcname2)(text*vertic}'es9 )UP=sa9ve,./vffa;j9;nvertic}'es)ı;lastӫ;n9umeric?vffaN;lastӫ;nvertic}'es>[=UP0;vffa&\=UPnewffve}'ct*;mve}'ctىffdef*?j(vffa< ;0;0;0)forsuxesI$UP=vertic}'es$:(ve}'ctىffsumOի(vffa< ;vffa";pnt#($));(nvertic}'esR\:=UPnvertic}'es,ܫ+81;(last;\:=UP$;endfor4 j;ve}'ctىffmult=;(vffa< ;vffa";1=nvertic}'es');tr}'anslate]\ffnnobjL-(nameC*;vffa");UU%ob8jectcenteredontheoriginsc}'ale]\ffnnobj;(nameC*;1=ve}'ctىffmod()b(pnt (last)));fr}'ee]\ffnnvect9s(vffa< );enddef"O;16ᆍx>ffG *GeneralUUde nitions>ɉffG%UUV*ectorarrays n9umeric+ve}'ct=D*[]x;ve}'ctVW[]y[;ve}'ct[]zp;%UUObservern9umeric+Obs< ;Obsp=UPnewffp}'oint/y;%UUdefaultvqalue:setىffp}'oint'Oo(Obs- ;0;0;20);%UUObserver'svectorsObsI1ff=UPnewffve}'ct*;mObsJff$!=UPnewffve}'ct;mObsKff&=UPnewffve}'ct;IObsI1ff =UPnewffve}'ct*;mIObsJff'=UPnewffve}'ct;mIObsKff*z=UPnewffve}'ct;%UUdistanceobserver/plane(mustbGe>UP0)n9umeric+Obso"ff4distQ;UU%representsObso"ff4dist,pdr}'awing~ffscale%UUdefaultvqalue:Obso"ff4dist(=UP2;UU%meansObso"ff4dist,pdr}'awing~ffscale%UUScreenSize%UUThescreensizeisde nedthroughtwoUUangles:qthehorizontal eld%UUandthevertical eldn9umeric+hadffrv eldH/;vff eld_;hadffrv eldF=UP100;UU%degreesvff eld=UP70;UU%degrees%UUReferencevectorsqr~#0UV,M~{ҫ,X~| ȫand\q~k%UUandtheirde nitionn9umeric+ve}'ctىffnullR2;ve}'ctىffIt ;ve}'ctىffJ;ve}'ctىffK!(;ve}'ctىffnull*7=UPnewffve}'ct*;mve}'ctىffI$=UPnewffve}'ct;mve}'ctىffJ%V)=UPnewffve}'ct;mve}'ctىffK'O=UPnewffve}'ct;ve}'ctىffdef$"(ve}'ctىffnull&G;0;0;0);ve}'ctىffdef$"(ve}'ctىffI;1;0;0);mve}'ctىffdef*?j(ve}'ctىffJl;0;1;0);mve}'ctىffdef(ve}'ctىffKa;0;0;1);n9umeric+p}'ointىffnullW;p}'ointىffnull/T =UPve}'ctىffnull*7;%UUObserver'sorientation,de nedbythreeanglesn9umeric+Obso"ff4psiM8;Obso"ff4theta-;Obso"ff4phi%;%UUdefaultvqalue:Obso"ff4psi%y=UP0;mObso"ff4theta4=90;mObso"ff4phi,=0;%UUPointsforthe guresn9umeric+p}'ointso"ffJ[];%UUnameԫisUUthenameofanob8jectinstance%UUnp}'oints&뭫isUUitsnumbGerUUofde ningpointsdefnewffobj^ff pp}'ointsUƎ(exprcname2;np}'oints#)UP=de ne]\ffnnp}'ointىffo setىffh8(nameC*;np}'oints#);mde ne]\ffnncurr}'entىffpointىffo setىff~d(name);for%ZKiUP:=18uptoqobj^ff pp}'ointso"ffK (nameC*):mpntx(i):=newffp}'oint/y;0endfor%;enddef"O;%UUnameԫisUUthenameofanob8jectinstance%UUnfac}'es"isUUitsnumbGerUUofde ningfacesdefnewffobj^ff pfac}'esP뉫(exprcname2;nfac}'es-)UP=de ne]\ffnnfac}'e]\ffo setىffc+-(nameC*;nfac}'es-);mde ne]\ffnncurr}'entىffface]\ffo setىffyWa(name);r}'ede ne]\ffnnobj^ff pname]\ffg(nameC*;curr}'entىffface]\ffnno setىffZ>P+8nfac}'esޫ);enddef"O;17x>%UUAbsolutepGointnumbGercorrespondingtoob8jectpointnumbGeri %UUThismacromustonlybGeusedwithinthefunctionde ninganob8ject%UU(suchasdefff̧cub}'e)Q6)orthefunctiondrawinganob8ject(suchas%UUdr}'awffcube0).defipntىff)^(exprci)UP=i8+curr}'entىffpointىffo setىff_Kenddefƫ;defpnt"(exprci)UP=p}'ointso"ff![ipntىff.(i)]enddef% ;deffac}'e%<(exprci)UP=(i8+curr}'entىffface]\ffnno setىffWw8)enddef% ;%UUAbsolutepGointnumbGercorrespondingtolocalpointn %UUinob8jectinstancenamev\rardef#_pntىffobjDH((exprcname2;n)UP=hide&(de ne]\ffnncurr}'entىffpointىffo setىffxHv(nameC*);m)pnt (n)enddef"O;%UUAbsolutefacenumbGerUUcorrespondingtolocalfacen%UUinob8jectinstancenamev\rardef#_fac}'e]\ffnnobjFM(exprcname2;n)UP=hide&(de ne]\ffnncurr}'entىffface]\ffo setىffs:(nameC*);m)fac}'e0(n)enddef"O;%UUScalen9umeric+dr}'awing~ffscalegS;dr}'awing~ffscale>[=UP2cm z;%UUColor%UUThisfunctionisusefulwhenacolorisexpressedinhexadecimal.defhexc}'olor8 A(exprcs)UP=(hexG(substring/ L(0;2)of| s)=255;hex7(substring(2;4)of| s)=255;(hex7G#(substring/ L(4;6)of| s)=255)enddef"O;%UUFillingandcontoursbQoolean*S" lle}'dfffacesYB2;dr}'awffcontoursAڿ; lle}'dfffaces2D`=UPtrue3;dr}'awffcontoursBh=UPtrue3;n9umeric+c}'ontourwidthdc;UU%thicknessofcontoursc}'ontourwidth<1ȫ=UP1pt aë;%UUOver owcontrol%UUAnover owUUcanoGccurwhenanob8jectistooclosefromtheobserver%UUorifanob8jectisoutofsight.qW*euseaspGecialvqaluetomark%UUcoGordinateswhichwouldleadtoanover ow.n9umeric+to}'o>ffObig~ffM;to}'o>ffObig~ff%K=UP4000;%UUOb8jecto set(thepGointsde ninganobjectarearranged%UUinasinglearray*,andtheob8jectsareeasiertomanipulate%UUifthepGointnumbGersaredividedintoanumbGerandano set).n9umeric+lastىffp}'ointىffo setىffuʱ;lastىfffac}'e]\ffnno setىffGu;lastىffp}'ointىffo setىffMF/=UP0;mlastىfffac}'e]\ffnno setىffNU=0;18x>ffG *ComputationUUof eldparametersofananimation0ffG+n9umeric+xminadffEƱ;yminadffi;xmaxEff:y;ymaxEffq;defc}'ompute]\ffnnbboxR5= if&known>C/xminadffX7 :(xminadffEI/:=UPmin(xminadff۱;xpartj(llcorner Y(curr}'entpicture=ګ)));(yminadffE:=UPmin(yminadff+Q;ypartj(llcorner Y(curr}'entpicture=ګ)));(xmaxEffFȵ:=UPmax(xmaxEffsa;xpartj(urcorner$(curr}'entpicture=ګ)));(ymaxEffG+:=UPmax(ymaxEffױ;ypartj(urcorner$(curr}'entpicture=ګ)));else&:(xminadffEI/=UPxpart(llcorner Y(curr}'entpicture=ګ));(yminadffE=UPypart(llcorner Y(curr}'entpicture=ګ));(xmaxEffFȵ=UPxpart(urcorner$(curr}'entpicture=ګ));(ymaxEffG+=UPypart(urcorner$(curr}'entpicture=ګ)); ë;enddef"O;bQoolean*S"showffanimationadffrvp}'arameters ];showffanimationadffrvp}'arameters~=UPfalsepL;n9umeric+p}'aperffheightbY;p}'aperffheight9 =UP29:7;UU%papGerheightincm%UUshowbGoundingboxofananimation,inPostScriptpGoints%UUandparametersforanimationscriptv\rardef#_showffanimationadffrvbb}'ox%=sa9ve,./trx9;try;h;wD;delta>;pnmx!;pnmymб;pnmwhձ;pnmh#;r}'es,;r}'es$f=UP36;UU%36dotspGerinchinbitmapw3=UPxmaxEff!8xminadff,;mhUP=ymaxEff!98yminadffd1;if&showffanimationadffrvp}'arameters:(messageS"animation?bbox:(llx="u&8decimal&URround?(xminadff۫)>8&8",lly=")1&8decimal&URround?(yminadff+Q)>8&8",w="&8decimal&URround?(wD)8&",h="&decimal&URround?(h)&")"׫; ë;if&xminadffffG *CreationUUofashellscripttoautomatetheanimation0ffG%UUThisisUNIXtargettedandmayneedtobGecustomized.v\rardef#_write]\ffnnscriptW2(exprctrx'3$;try;xmin ;yminDV;wD;h;r}'es,;outputS~; leN)UP= sa9ve,./s;string4s;def'write]\ffnnto>ffO le\+ܫ(text*ar}'g%J)UP=write @ar}'g10@to= leK)r;0enddef'$;write]\ffnnto>ffO leH("#!?/bin/sh">ܫ);write]\ffnnto>ffO leH("" );write]\ffnnto>ffO leH("/bin/rm?-f"Fx&8output &&8".log"!Ϋ);write]\ffnnto>ffO leH("for?iin`ls"P&8output &&8".*|?grep'"Cq&8output&8".[0-9]'`;do"Fx);(if3&falseIA:O^("endfor"|%( %UUindentationhackformeta-moGde.elwrite]\ffnnto>ffO leH("echo?$i"/?);write]\ffnnto>ffO leH("echo?'=============='"x);sUP:="awk?<$i'{print}/^%%Page:/{print" &8ditto^;sUP:=s8&decimal&URtrx5&"?"1&decimal&URtry5բ&"?translate\n"M&ditto>&"}'?>$i.ps"A8;write]\ffnnto>ffO leH(s);(%UUghostscriptPostScriptintoppmsUP:="gs?-sDEVICE=ppmraw-sPAPERSIZE=a4-dNOPAUSE"ƫ;sUP:=s8&"-r"q&decimal&URr}'es5F&"?-sOutputFile=$i.ppm-q--$i.ps"z;write]\ffnnto>ffO leH(s);write]\ffnnto>ffO leH("/bin/rm?-f$i.ps"^ʫ);(%UUpGossiblealternative:(%UUsUP:="mogrify?-compress-crop" &8decimal#:(wD)8&"x"1&decimal(h);(%UUsUP:=s8&"+"1&decimal#:(xminEȫ)&"+"&decimal#:(ymin}>);(%UUsUP:=s8&"?-colors32-formatgif$i.ppm"8;sUP:="ppmquant?32$i.ppm|pnmcut" ֫&8decimal#:(xminEȫ)8&"?"1&decimal(ymin}>);sUP:=s8&"?"1&decimal#:(wD)&"?"&decimal#:(h)&"?|"xѫ;sUP:=s8&"ppmtogif?>`expr$i.ppm:'\(.*\)ppm'`gif"_;write]\ffnnto>ffO leH(s);write]\ffnnto>ffO leH("/bin/rm?-f$i.ppm"cǫ);write]\ffnnto>ffO leH("done");write]\ffnnto>ffO leH("/bin/rm?-f"Fx&8output &&8".gif"!Ϋ);sUP:="gifmerge?-10-l1000"v;sUP:=s8&output &&".*.gif?>">1&output&".gif"!Ϋ;write]\ffnnto>ffO leH(s);write]\ffnnto>ffO leH("/bin/rm?-f"Fx&8output &&8".*.gif",8ȫ);write]\ffnnto>ffO leH(EOFN);UU%endof leenddef"O;20čx>ffG *StandardUUanimationde nitions>ɉffG%UUThesede nitionsproGduceoneimageofsomekind.extr}'aadffrvend g7:=UP"compute_bbox"L&;%UUInthestandardanimations,theobserverfollowsacircle,shownbGelow:c~;PSfile=vect-fig.17 llx=-93 lly=-51 urx=122 ury=121 rwi=2150%UUStandardimage1:qthisisanexampleandmaybGeadapted. %UUnameԫisUUanob8jectinstancedefone]\ffnnimageA(exprcname2;i;a;r}'d ;ang)UP=bQegin gffOobje}'ctsvt(exprcname]\ffnna;s;name]\ffnnb#;i;a;r}'d ;ang)UP=bQegin g%UUStandardimage3:qthisisanexampleandmaybGeadapted. %UUname]\ffnna%'e,UUname]\ffnnb'andUUname]\ffnnc'4areUUob8jectinstances.defone]\ffnnimage]\ffthr}'ee]\ffnnobjects|S@(exprcname]\ffnna;s;name]\ffnnb#;name]\ffnnc#⢱;i;a;r}'d ;ang)UP=bQegin gffOidentic}'alffobjectsp(exprcname]\ffnna;s;name]\ffnnb#;i;a;r}'d ;ang)UP=bQegin g%UUAnanimationisaseriesofimages,andtheseseriesareproGducedhere.%UUStandardanimation1 %UUnameԫisUUaclassnamedefanimate]\ffnnobje}'ctT̫(exprcname2;iminzc;imax;indexH)UP=n9umeric?angO칫;mang=UP360=(imaxk8imin% +81);assignadffrvobjA?˫("obj"?;name B);for%ZKiUP:=iminA{upto3zSimaxI$:Oɑone]\ffnnimage}׫("obj"?;i8+indexw;i;5;ang);0endfor%;showffanimationadffrvbb}'oxrA;enddef"O;%UUStandardanimation2%UUname]\ffnna(|andUUname]\ffnnb'areUUclassnamesdefanimate]\ffnntwo>ffOobje}'ctsl%c(exprcname]\ffnna;s;name]\ffnnb#;iminzc;imax;indexH)UP=n9umeric?angO칫;mang=UP360=(imaxk8imin% +81);assignadffrvobjA?˫("obja";name]\ffnna$();massignadffrvobj3\6("objb";name]\ffnnb#);tr}'anslate]\ffnnobjL-("objb";ve}'ctىffK!();mtr}'anslate]\ffnnobj>4("objb";ve}'ctىffK);for%ZKiUP:=iminA{upto3zSimaxI$:(one]\ffnnimage]\fftwo>ffOobje}'ctsֳ("obja";"objb""G;i8+indexw;i;5;ang);endfor4 j;showffanimationadffrvbb}'oxrA;enddef"O;%UUStandardanimation3%UUname]\ffnna%'e,UUname]\ffnnb'andUUname]\ffnnc'4areUUclassnamesv\rardef#_animate]\ffnnthr}'ee]\ffobjects(exprcname]\ffnna;s;name]\ffnnb#;name]\ffnnc#⢱;iminzc;imax;indexH)UP=n9umeric?angO칫;mang=UP360=(imaxk8imin% +81);assignadffrvobjA?˫("obja";name]\ffnna$();massignadffrvobj3\6("objb";name]\ffnnb#);assignadffrvobjA?˫("objc";name]\ffnnc#⢫);sc}'ale]\ffnnobj;("objb";:7);n9umeric?vffaN;mvffaǫ:=UPnewffve}'ct*;ve}'ctىffdefff̧vectM`Q(vffa< ;ve}'ctىffK!();mve}'ctىffmult/(vffa;vffa";4);mputىffobj&Ó("objb";vffa;1;0;0;0);fr}'ee]\ffnnvect9s(vffa< );sc}'ale]\ffnnobj;("objc";:5);tr}'anslate]\ffnnobjL-("objc";ve}'ctىffK!();mtr}'anslate]\ffnnobj>4("objc";ve}'ctىffK);for%ZKiUP:=iminA{upto3zSimaxI$:(one]\ffnnimage]\ffthr}'ee]\ffnnobjectso("obja";"objb""G;"objc";i8+indexw;i;7;ang);endfor4 j;showffanimationadffrvbb}'oxrA;enddef"O;%UUStandardanimation4%UUnameԫisUUaclassnamedefanimate]\ffnntwo>ffOidentic}'alffobjectsgO(exprcname2;iminzc;imax;indexH)UP=n9umeric?angO칫;mang=UP360=(imaxk8imin% +81);assignadffrvobjA?˫("obja";name B);massignadffrvobj3\6("objb";name);tr}'anslate]\ffnnobjL-("objb";ve}'ctىffK!();mtr}'anslate]\ffnnobj>4("objb";ve}'ctىffK);for%ZKiUP:=iminA{upto3zSimaxI$:(one]\ffnnimage]\fftwo>ffOidentic}'alffobjects("obja";"objb""G;i8+indexw;i;10;ang);endfor4 j;showffanimationadffrvbb}'oxrA;enddef"O;endinput࣫23I;xG 3 cmmi10ٓRcmr7K`y cmr10^L