summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/dvips
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-01-30 23:35:39 +0000
committerKarl Berry <karl@freefriends.org>2008-01-30 23:35:39 +0000
commitc29a198148293314302dc7d3733915ef76689553 (patch)
treebaa38886dc6ca2af7df13362de9795910c04cb8e /Master/texmf-dist/dvips
parent34581f02f7e9465cfd1e9c43d18c0dbe07aa0f94 (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')
-rw-r--r--Master/texmf-dist/dvips/pst-solide3d/solides.pro5797
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