Retour

BB.tex

Télécharger le fichier
Image JPEG
Pour une image donnée, l'interpréteur postscript possède son propre
système de coordonnées (dans un repère orthonormal). Celui-ci est
entièrement déterminé par ce que 
l'on appelle la {\sl Bounding Box}, qui est une boîte
contenant complètement le dessin, ce qui permet sa manipulation par
des logiciels externes. Cette boîte est définie par la donnée de
4~nombres positifs correspondant respectivement aux co\-or\-don\-nées du
coin inférieur gauche et du coin supérieur droit.
Ces coordonnées sont exprimées en points postscript, ce qui nous donne
la taille et le format de l'image. De façon empirique, il me semble
que $722, 7$ points postscript correspondent à un pouce, qui
correspond lui-même à $254\mm $. (Moralité~: il faut $10\times 722, 7/
254 \approx 28, 452\, 7$ points postscript pour faire $10\mm $.)
 
La Bounding Box est toujours calculée par le script |jps2ps|, alors
que la plupart des autres calculs sont effectués par 
l'interpréteur postscript. Une des conséquences en est la syntaxe
particulièrement rigide des quelques commandes concernant le format de
l'image produite (|setxrange|, |setyrange|, |setwidth|, |setheight|,
|setxyrapport|, |setformat|, |setrotate|, |setborder| et |setangle_repere|). En
effet, ces commandes sont lues puis traduites par le script afin d'en
extraire les informations utiles, et mon niveau actuel concernant les
expressions régulières en Perl ne me permet pas de faire des
prouesses. En particulier, chacune de ces commandes doit se trouver
seule sur une ligne, et les arguments de ces commandes doivent être
strictement numériques (pas de résultat de calcul ou de
variable). Pour toutes ces commandes, merci de vous conformer aux
exemples donnés dans ce document ou sur le site
|http://melusine.eu.org/syracuse/bbgraf/|.
 
Le format $jps$ prévoit deux façons de définir le format de l'image
produite~: une méthode globale où l'utilisateur définit explicitement
les dimensions voulues, et une méthode locale (souvent plus pratique)
où l'utilisateur définit les échelles sur les axes et l'amplitude sur
chacun des axes. 
 
Par défaut c'est la méthode globale qui est employée, de telle façon 
que la plus grande des dimensions largeur$/$hauteur soit de 250 points
postcript. 
 
\ssparagraphe {Définir les unités}
 
Les commandes |setxunit| et |setyunit| servent à indiquer
explicitement l'échelle sur chacun des axes. Ainsi, la commande |20
setxunit| va affecter 20 points postcript par unité sur l'axe
$Ox$. 
 
Dès que l'une des échelles est fixée, l'autre est calculée en
tenant comptre du paramètre $xyrapport$ (égal à $1$ par défaut).
 
La taille de l'image est alors déterminée par les amplitudes $xrange$ et
$yrange$.
 
\ssparagraphe {Imposer les dimensions externes}
 
\epsfxsize 80mm
$$
   \epsillustrate {BB_02.ps}
$$
 
Le format de l'image est déterminé par
3~paramètres~: $width$ et $height$ qui correspondent à la fenêtre de
dessin, et $border$ qui indique la taille (en points postscript) de la
bordure blanche à insérer autour de la fenêtre de dessin. La variable
$border$ est initialisée à $7, 5$ par défaut.
 
Les commandes |setwidth|, |setheight| et |setborder| permettent à
l'utilisateur d'imposer la valeur de tel ou tel paramètre. Ainsi la séquence
|400 setwidth 400 setheight| (sur 2~lignes distinctes\dots ) va
imposer une fenêtre de dessin aussi large que haute, de côté
$400$~points postscript. Si l'utilisateur ne fixe pas les valeurs
de $width$ et $height$, et si les échelles sur $Ox$ et $Oy$ ne sont
pas imposées, alors le script calculera les valeurs des variables
$width$ et $height$ en imposant que la plus
petite des deux soit égale $250$, et en tenant compte des contraintes
sur la fenêtre de dessin (amplitudes sur $Ox$ et $Oy$ et rapport des échelles).
 
Pour aider à la gestion des variables $height$ et $width$, on dispose
également de la commande |setformat|, qui permet d'imposer un rapport
entre les dimensions horizontales et verticales (hors bordure) de
l'image produite. Ainsi, la commande |2 setformat| permettra d'obtenir
une image dont le rapport $width/height$ sera égal à $2$.
 
Enfin la commande |setrotate| permet de faire effectuer une rotation à
l'image produite. Elle prend un argument numérique indiquant l'angle
en degré de cette rotation, dont le centre est le coin inférieur
gauche de l'image produite. Si on utilise cette option, la Bounding
Box est recalculée pour contenir la totalité de l'image \og
rotationnée\fg .
 
%\rightepsillustrate{ex_16.ps}{-11}
%
 
Voyons maintenant les ordres de priorité. Une fois récupéré les
informations dans le source $jps$, l'algorithme est le
suivant~:
 
\item {$\bullet $} si $width$ et $height$ sont définis, c'est fini.
 
\item {$\bullet $} si on a $format$ et $width$, on calcule $height$ et
c'est fini.
 
\item {$\bullet $} si on a $format$ et $height$, on calcule $width$ et
c'est fini.
 
\item {$\bullet $} si on a seulement $format$, le script choisit
$height$ et $width$ en imposant qu'ils soient tous deux supérieurs ou
égaux à $250$, et c'est fini.
 
\item {$\bullet $} sinon on calcule les données manquantes en
utilisant les valeurs fournies pour le repère $jps$ et les valeurs par
défaut (voir le paragraphe sur la fenêtre de dessin). 
 
Une fois cela accompli, on limite $width$ et $height$ à $1\,
000$ pour éviter des images trop grandes lors de l'utilisation via le
web (la convertion au format jpeg alourdit sérieusement le fichier),
puis on effectue éventuellement la rotation spécifiée par 
|setrotate|. 
 
\exemple {BB}
 
En résumé~:
\syntaxe
\longref
   {$u$}
   {setxunit}
   {$-$}
   {Spécifie, en nombre de points postcripts par unité, l'échelle sur
   l'axe $Ox$. La première occurence de cette instruction dans le
   fichier $jps$ est interprétée par le script pour déterminer la
   BoundingBox.} 
 
\longref
   {$v$}
   {setyunit}
   {$-$}
   {Spécifie, en nombre de points postcripts par unité, l'échelle sur
   l'axe $Oy$. La première occurence de cette instruction dans le
   fichier $jps$ est interprétée par le script pour déterminer la
   BoundingBox.} 
 
\longref
   {$b$}
   {setborder}
   {$-$}
   {Indique, en points postripts, a taille de la bordure entourant
   l'image. Cette instruction est interprétée par le script $jps2ps$
   pour déterminer la BoundingBox.}  
 
\longref
   {$L$}
   {setwidth}
   {$-$}
   {Affecte la valeurs $L$ à la variable $width$ (taille horizontale,
   en points postscript, de la fenêtre de dessin). La première
   occurence de cette instruction dans le fichier $jps$ est
   interprétée par le script pour déterminer la BoundingBox.} 
 
\longref
   {$\ell $}
   {setheight}
   {$-$}
   {Affecte la valeurs $\ell $ à la variable $height$ (taille
   verticale, en points poscripts, de la fenêtre de dessin). La
   première occurence de cette instruction dans le fichier $jps$ est
   interprétée par le script pour déterminer la BoundingBox.} 
 
\longref
   {$k$}
   {setformat}
   {$-$}
   {Instruction destinée au script $jps2ps$. Elle indique que $k$
   est le rapport entre largeur et hauteur de l'image. Attention, $k$
   doit être lisible en clair par le script} 
 
\longref
   {$\alpha $}
   {setrotate}
   {$-$}
   {Instruction destinée au script $jps2ps$. Elle indique que l'image
   finale devra subir une rotation d'angle $\alpha $ (en
   degrés). Le calcul de la BoundingBox tient compte de cette
   rotation. Attention, $\alpha $ doit être lisible en clair par le script} 
 
\endsyntaxe