Transformer les objets

Pour étudier les transformations on va se servir de l'objet suivant :

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
\stopMPcode
\stoptext

La translation

Elle se fait à l'aide de la commande shifted. Par exemple pour re-dessiner la figure 5cm plus loin et 2cm plus haut :

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
draw p shifted (5cm,2cm);
\stopMPcode
\stoptext


la translation se fait toujours par rapport à l'origine (0,0) et non par rapport au dernier chemin dessiné.


\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
draw p shifted (5cm,0cm);
draw p shifted (10cm,0cm);
\stopMPcode
\stoptext

Tu peux inclure les transformations dans la définition du chemin :

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
p:=p shifted (5cm,0cm);
draw p;
p:=p shifted (5cm,0cm);
draw p;
\stopMPcode
\stoptext

Donne exactement le même résultat que ci-dessus.

La rotation

Elle se fait à l'aide de la commande rotated. Par exemple pour re-dessiner la figure pivotée de 30° :

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
draw p rotated 30;
\stopMPcode
\stoptext

On peut préciser la rotation dans la description du chemin mais dans ce cas il ne faut pas oublier de mettre entre () les coordonnées du chemin :

\starttext
\startMPcode
path p;
p:=((0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle) rotated 30;
draw p;
\stopMPcode
\stoptext

Comme tu peux le remarquer la rotation se fait par rapport à l'origine du graphique (0,0) et non au centre de l'objet. Pour cela il faut utiliser une macro nommée rotatedaround

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
draw p rotatedaround (center p, 15);
\stopMPcode
\stoptext

Tu peux bien évidemment opérer une translation et une rotation :

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p;
draw p rotated 30 shifted (6cm,0cm);
\stopMPcode
\stoptext

l'inclinaison

Elle se fait à l'aide de la commande slanted.

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p slanted 1.5;
\stopMPcode
\stoptext

Les coordonnées x sont augmentées (dans notre exemple x=x+1.5y) les coordonnées y reste inchangées.

Changer d'échelle

Elle se fait à l'aide de la commande scaled.

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p scaled 2;
\stopMPcode
\stoptext

Si tu utilises un coefficiant décimal inférieur à 1 tu réduis ta figure

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p scaled 0.5;
\stopMPcode
\stoptext

Tu peux également modifier l'échelle que dans une seul direction soit les x avec xslanted soit les y avec yslanted.

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p xscaled 2;
\stopMPcode
\stoptext

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p yscaled 2;
\stopMPcode
\stoptext

Il existe également zscaled qui provoque à la fois une mise à l'échelle et une rotation. Il prend comme argument un couple de valeur (u,v).

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p ;
draw p zscaled (2,0.5);
draw p zscaled (0.5,0.5);
\stopMPcode
\stoptext

xsized, ysized et xysized

Ces trois commandes sont des macros MetaFun et ne font pas partie du langage MetaPost

Elles permettent de mettre le dessin à l'échelle mais en précisant la dimension du dessin en cm ou mm ou toutes autres unités reconnues. Il ne faut donc pas préciser les unités quand tu écris ton chemin. xsized et xsized prennent un seul argument qui respectivement donne taille du dessin en fonction de sa largeur (axe des x) ou de sa hauteur (axe des y) de ton dessin.xysized prend 1 ou une paire d'arguments, si tu n'en donne qu'un, la largeur et la hauteur auront la même taille.

\starttext
\startMPcode
path p;
p:=(0,0) .. (3,2) -- (3,4) -- (0,4)..cycle;
draw p xsized 3cm;
draw p ysized 2cm shifted (4cm,0);
draw p xysized (3cm,2cm) shifted (8cm,0);
\stopMPcode
\stoptext

Miroir

Elle se fait à l'aide de la commande reflectedabout((x1,y1),(x2,y2)) qui prend comme argument deux couples de coordonnées qui représente l'axe autour duquel se fait la mise en miroir.

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p ;
draw p reflectedabout((4cm,0cm),(4cm,1cm));
\stopMPcode
\stoptext

Je vais dessiner l'axe en rouge pour une meilleur compréhension :

\starttext
\startMPcode
path p,axe;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p ;
draw p reflectedabout((4cm,0cm),(4cm,1cm));
axe:=(4cm,0cm)--(4cm,1cm);
draw axe withcolor red;
\stopMPcode
\stoptext

Dans notre exemple x1 et x2 sont égaux (=4cm), l'axe de transformation est donc parallèle aux abscisses dans ce cas la valeur des y1 et y2 n'a pas d'importance, il faut juste qu'ils soient différents pour pouvoir dessiner un axe mais la longueur de cet axe n'a aucune importance pour la mise en miroir.

\starttext
\startMPcode
path p,axe;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p ;
draw p reflectedabout((4cm,1cm),(4cm,5cm));
axe:=(4cm,1cm)--(4cm,5cm);
draw axe withcolor red;
\stopMPcode
\stoptext

De la même facon si y1 et y2 sont égaux donc ton axe de transformation est parallèle aux ordonnées la valeur des x n'a aucune importance pourvus qu'ils soient différents.

\starttext
\startMPcode
path p,axe;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p ;
draw p reflectedabout((0cm,0cm),(4cm,0cm));
axe:=(0cm,0cm)--(4cm,0cm);
draw axe withcolor red;
\stopMPcode
\stoptext

Tu n'est pas obligé d'être paralèle aux axes de la feuille.

\starttext
\startMPcode
path p,axe;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
draw p ;
draw p reflectedabout((0cm,1cm),(4cm,2cm));
axe:=(0cm,1cm)--(4cm,2cm);
draw axe withcolor red;
\stopMPcode
\stoptext


Si tu dois mettre plusieurs options pour décrire ton chemin (path) comme un choix de couleur ou une épaisseur de trait la transformation doit être placée au début sous peine d'erreur de compilation.

draw p shifted (5cm,2cm) withcolor red;

ne retourne pas d'erreur alors que :

draw p withcolor red shifted (5cm,2cm);

ne compile pas.