diff options
author | Karl Berry <karl@freefriends.org> | 2008-08-02 23:12:56 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-08-02 23:12:56 +0000 |
commit | 0e6b09416ade3c53b6f6d8d772b4bd180f6cf5b0 (patch) | |
tree | 032fcab01b77e9ef174e51a209a5dc717d8932d1 /Master/texmf-dist/dvips | |
parent | e64ffb6f004c76b6552fa48978e1ab5a97cdf4db (diff) |
rm pst-solide3d, now solides
git-svn-id: svn://tug.org/texlive/trunk@10018 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/dvips')
-rw-r--r-- | Master/texmf-dist/dvips/pst-solide3d/solides.pro | 5797 |
1 files changed, 0 insertions, 5797 deletions
diff --git a/Master/texmf-dist/dvips/pst-solide3d/solides.pro b/Master/texmf-dist/dvips/pst-solide3d/solides.pro deleted file mode 100644 index e0e28e19792..00000000000 --- a/Master/texmf-dist/dvips/pst-solide3d/solides.pro +++ /dev/null @@ -1,5797 +0,0 @@ -%! -% PostScript prologue for pst-solides3d.tex. -% Version 3.02, 2008/01/17 -% -%% 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 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% 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 %%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%% ### 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 - -%%%%% ### 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 - 0 false %% la reponse a priori - liste length { - liste i get elt eq { - pop 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 - -%%%%% ### 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] -/solidgetpointstable { - 0 get -} 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 - -/solidputpointstable { - 0 exch put -} 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 solidgetpointstable 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 - -%%%%% ### 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 solidgetpointstable 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 solidgetpointstable 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 solidgetpointstable 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 solidgetpointstable def - table_sommets i getp3d -end -} def - -%%%%% ### solidcentreface ### -%% syntaxe : solid i solidcentreface --> M -/solidcentreface { - solidgetsommetsface isobarycentre3d -} def - -%%%%% ### solidnombre ### -/solidnombresommets { - solidgetpointstable 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 exch pop { - %% le sommet i est dans la face j - 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 solidgetpointstable def - /S2 solid2 solidgetpointstable 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 solidgetpointstable {f} papply3d - def - solid les_sommets solidputpointstable - 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 - -%%%%% ### 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 - %% 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 IO solidputinouttable - } 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 - -%%%%% ### 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 solidgetpointstable 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 { -7 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 solidgetpointstable 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 - 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 -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 drawsolid -/drawsolid { -7 dict begin - /solid exch def - solid issolid not { - (Error : mauvais type d argument dans drawsolid) == - quit - } if - solid nullsolid not { - solid solidgetfaces - /F exch def - solid solidgetpointstable - /S exch def - /n S length 3 idiv def - %% tableau des aretes - /A [ - n { - [n {false} repeat] - } repeat - ] def - - 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 - - 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 %%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%% ### tronquecube ### -%% syntaxe : solid n tronque_cube --> solid (tronque) -/tronque_cube { -6 dict begin - /d exch def - /solid exch def - solid issolid not { - (Error : mauvais type d argument dans tronque_cube) == - quit - } if - solid solidgetpointstable - /S exch def - /co [ - 3 4 1 % 1 3 4 % voisins du sommet 0 - 0 5 2 % 0 2 5 % de 1 - 1 6 3 % 1 3 6 % de 2 - 2 7 0 % 0 2 7 % de 3 - 7 0 5 % 0 5 7 % de 4 - 4 1 6 % 1 4 6 % de 5 - 5 2 7 % 2 5 7 % de 6 - 6 3 4 % 3 4 6 % de 7 - ] def - - /dd {d 1 sub} bind def - /i 0 def - /les_sommets [ % les coordonnees des sommets du cube tronque - 0 3 21 { - /j exch def - %% sommet d indice i = A1 - solid i solidgetsommet /A1 defpoint3d - - %% k = indice du sommet voisin no 1 - co j get /k exch def - %% sommet d indice k = A2 - solid k solidgetsommet /A2 defpoint3d - %% barycentre {(A1, d) (A2, 1)} - A1 d A2 1 barycentre3d - - %% k = indice du sommet voisin no 2 - co j 1 add get /k exch def - %% sommet d indice k = A2 - solid k solidgetsommet /A2 defpoint3d - %% barycentre {(A1, d) (A2, 1)} - A1 d A2 1 barycentre3d - - %% k = indice du sommet voisin no 2 - co j 2 add get /k exch def - %% sommet d indice k = A2 - solid k solidgetsommet /A2 defpoint3d - %% barycentre {(A1, d) (A2, 1)} - A1 d A2 1 barycentre3d - - /i i 1 add store - } for - ] def - - /les_faces [ - [11 10 22 23 12 13 1 0] - [2 1 13 14 15 16 4 3] - [8 7 19 20 21 22 10 9] - [14 12 23 21 20 18 17 15] - [3 5 6 8 9 11 0 2] - [5 4 16 17 18 19 7 6] - [0 1 2] - [3 4 5] - [6 7 8] - [9 10 11] - [12 14 13] - [15 17 16] - [18 20 19] - [21 23 22] - ] def - - solid les_sommets solidputpointstable - solid les_faces solidputfaces - solid dup solidgetfcolors [8 {()} repeat] append solidputfcolors - solid -end -} 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 - -/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 - -%%%%% ### newobjfile ### -/newobjfile { -3 dict begin - /objfilename exch 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 - -%%%%% ### 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 -/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 - range aload pop {function} CourbeR3 -} 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 } 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 } CourbeR2_ - gere_pstricks_proj_opt -} def - -/proj-pst-courbe { - solidlinewidth setlinewidth - newpath - linecolor - range aload pop {} { function } 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 |