Fichier test_texte3d_Z_04.jps — Modifié le 30 Juin 2006 à 17 h 01
%% Pour passer en pur postscript, decommenter la ligne suivante
%% 294 420 translate
%% puis commenter les 3 suivantes
-10 20 setxrange
-10 15 setyrange
20 setxunit
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Manuel Luque %%
%% juin 2006 %%
%% poour le dessin de l'icosaedre et du ballon %%
%% c'est une adaptation du fichier MatLab de Jean-Bernard ROUX :%%
%% http://hypo.ge-dip.etat-ge.ch/www/math/html/node45.html %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/cm {28.45 mul} def
%% définir le point de vue
%% par ses coordonnées sphériques
/THETA -30 def
/PHI 20 def
/Dobs 60 def % distance observateur
/Decran 30 def % distance de l'écran
%% calcul des coefficients de la matrice
%% de transformation
/Sin1 {THETA sin} bind def
/Sin2 {PHI sin} bind def
/Cos1 {THETA cos} bind def
/Cos2 {PHI cos} bind def
/Cos1Sin2 {Cos1 Sin2 mul} bind def
/Sin1Sin2 {Sin1 Sin2 mul} bind def
/Cos1Cos2 {Cos1 Cos2 mul} bind def
/Sin1Cos2 {Sin1 Cos2 mul} bind def
%%
%% pour la 3D conventionnelle
%% Dony : graphisme scientifique : page 187
/formulesTroisD{%
/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
/Xi Decran xObservateur mul zObservateur div def
/Yi Decran yObservateur mul zObservateur div def
}
def
/XpointVue {Dobs Cos1Cos2 mul} bind def
/YpointVue {Dobs Sin1Cos2 mul} bind def
/ZpointVue {Dobs Sin2 mul} bind 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 %% c'est Xi cm
Decran yObservateur mul zObservateur div cm %% c'est Yi cm
end
} def
%% dessin de l'icosaedre tronqué
1 setlinejoin
%% le quadrillage
-20 1 20 {
/x exch def
newpath
x -10 0 3dto2d moveto
x 10 0 3dto2d lineto
stroke
} for
-10 1 10 {
/y exch def
newpath
-20 y 0 3dto2d moveto
20 y 0 3dto2d lineto
stroke
} for
%% l'ancienne formulation pour le quadrillage
%% /Zcote 0 def
%% -20 1 20 { %
%% /Xabscisse exch def
%% /Yordonnee -10 def
%% formulesTroisD
%% Xi cm Yi cm moveto
%% -10 1 10 {
%% /Yordonnee exch def
%% formulesTroisD
%% Xi cm Yi cm lineto }
%% for stroke }for
%% %
%% -10 1 10 { %
%% /Xabscisse -20 def
%% /Yordonnee exch def
%% /Zcote 0 def
%% formulesTroisD
%% Xi cm Yi cm moveto
%% -20 1 20 {
%% /Xabscisse exch def
%% formulesTroisD
%% Xi cm Yi cm lineto }
%% for stroke }for
%% les axes
gsave
%% axe Ox
0 0 moveto
%% /Zcote 0 def
%% /Yordonnee 0 def
%% /Xabscisse 20 def
%% formulesTroisD
%% Xi cm Yi cm lineto
20 0 0 3dto2d lineto
2 setlinewidth
1 0 0 setrgbcolor
stroke
%% axe Oy
0 0 moveto
%% /Zcote 0 def
%% /Yordonnee 10 def
%% /Xabscisse 0 def
%% formulesTroisD
%% Xi cm Yi cm lineto
0 10 0 3dto2d lineto
2 setlinewidth
0 1 0 setrgbcolor
stroke
%% axe Oz
0 0 moveto
%%% /Zcote 15 def
%%% /Yordonnee 0 def
%%% /Xabscisse 0 def
%%% formulesTroisD
%%% Xi cm Yi cm lineto
0 0 15 3dto2d lineto
2 setlinewidth
0 0 1 setrgbcolor
stroke
grestore
/decalage_vertical 0 def %% decalage en picas du texte en
%% dessous de la ligne y=0
/Font /Times-Roman def
Font findfont 3 scalefont setfont
%% le texte a deformer (les x sont dans [-warphalf ; warphalf])
/warptxt (La perspective) def
%% Jean-Paul Vignault
%% la procedure de base pour la transformation des points du chemin
%% (x, y) --> (X, Y)
%% cette fonction peut utiliser les variables warpwidth et warphalf
%% point origine de la phrase :
/x0 -5 def
/y0 -8 def
/z0 0 def
/warp {
3 dict begin
/z exch z0 add def
/y exch y0 add def
x0 y z 3dto2d
end
} bind def
/warpwidth warptxt stringwidth pop def %% largeur horizontale du texte
/warphalf warpwidth 2 div def %% demi-largeur horizontale
%% pour remplacer 'move'
/warpmove{
%% on teste le booleen place 2 tokens plus en avant sur la pile
%% si c'est 'true', alors on en est au 1er appel => on initialise
%% le chemin
2 index {
newpath
} if
%% puis on applique warp a notre point
warp moveto
%% on enleve le 'true' pour mettre un 'false' a la place
pop false
} bind 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
%% 'warpit' declenche la transformation du chemin courant
/warpit {
true
{ warpmove } { warpline } { warpcurve } { closepath } pathforall
pop
} bind def
newpath
%% on se deplace (init chemin) de facon a
%% centrer la ligne de base du texte en (0 , - decalage_vertical)
%%warphalf neg decalage_vertical neg moveto
x0 -10 0 3dto2d moveto
x0 -10 10 3dto2d lineto
x0 10 10 3dto2d lineto
x0 10 0 3dto2d lineto
closepath
stroke
0 0 0 3dto2d moveto
warptxt true charpath %% on cree le chemin
%% maintenant on y va
warpit %% on applique le pathforall
gsave
1 setgray
fill
grestore
stroke %% puis on encre