diff options
author | Karl Berry <karl@freefriends.org> | 2008-01-30 23:35:39 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-01-30 23:35:39 +0000 |
commit | c29a198148293314302dc7d3733915ef76689553 (patch) | |
tree | baa38886dc6ca2af7df13362de9795910c04cb8e /Master/texmf-dist/dvips/pst-solide3d | |
parent | 34581f02f7e9465cfd1e9c43d18c0dbe07aa0f94 (diff) |
new pstricks package pst-solide3d (30jan08)
git-svn-id: svn://tug.org/texlive/trunk@6457 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/dvips/pst-solide3d')
-rw-r--r-- | Master/texmf-dist/dvips/pst-solide3d/solides.pro | 5797 |
1 files changed, 5797 insertions, 0 deletions
diff --git a/Master/texmf-dist/dvips/pst-solide3d/solides.pro b/Master/texmf-dist/dvips/pst-solide3d/solides.pro new file mode 100644 index 00000000000..e0e28e19792 --- /dev/null +++ b/Master/texmf-dist/dvips/pst-solide3d/solides.pro @@ -0,0 +1,5797 @@ +%! +% 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 |