Metapost : la couleur

C'est en gros le même principe que sous ConTeXt tu peux donc relire la fiche «ConTeXt et la couleur».

Sous MetaPost les couleurs sont définies par trois composantes (rouge,vert,bleu) dans le système RGB. Chaque composante est une valeur décimale comprise entre 0 et 1. Dans ce système rouge = (1,0,0) ; vert = (0,1,0) ; bleu=(0,0,1) ; noir=(0,0,0) et blanc=(1,1,1). Ce sont des couleurs pré-définies en MetaPost, tu peux donc les utiliser avec leur nom anglais ; red, green, blue, black et white. MetaPost connais aussi le système quadrichromie CMYK (Cyan, Magenta, Yellow et blacK) donc tu peux également utlisé les nom anglais suivants : cyan, magenta et yellow. En CMYK le noir = (0,0,0,1), le blanc = (0,0,0,0), le rouge = (0,1,1,0), le vert = (1,0,1,0) et le bleu = (1,1,0,0).

Il existe également un mode en échelle de gris qui ne prend qu'une seule composante comprise entre 0 et 1. Dans la figure ci-dessous de gauche à droite on a les valeurs : 0.8, 0.5 et 0.25

Pour la suite de la fiche je ne vais utiliser que le mode RGB, mais les mêmes principes sont applicables pour les autres modes.

Toutes les autres couleurs doivent être définies avec : color lenomdemacouleur; puis lenomdemacouleur := (r,g,b) ou tu remplaces r, g et b par un nombre décimal compris entre 0 et 1 (tu n'es pas obligé de mettre le 0 devant tu peux directement écrire .5 au lieu de 0.5 et attention la décimale est anglo-saxonne donc c'est un . et non une ,).

Pourquoi un chiffre entre 0 et 1 ?
Parce que les composantes r,g et b sont des pourcentages, lorsque tu écris (0.5,0.25,0.658) tu veux 50% de rouge , 25% de vert et 65,8% de bleu.
50% = 50/100 = 0,5 ; 25% = 25/100 = 0,25 et 65,8% = 65,8/100 = 0,658

Tu utilises ta couleur avec withcolor lenomdemacouleur par exemple pour du jaune :

\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
color jaune;
jaune:=(1,1,0);
pickup pencircle scaled 5mm ;
draw p withcolor jaune;
draw p shifted (5cm,0) withcolor (1,.5,0);
\stopMPcode
\stoptext

Comme tu peux le voir pour le orange j'ai utilisé (0,.5,0) directement sans lui donner de nom, mais il est quand même plus facile d'attribuer un nom à une couleur surtout si on doit l'utiliser plusieurs fois.

Tu peux préciser le mode choisi par les commandes withrgbcolor, withcmykcolor et withgray. Mais j'obtiens les même résultats en employant withgray .625 et withcolor .625 ou withcmykcolor (.375,0,0,0) et withcolor (.375,0,0,0).

Allez Mr/Mme Michu un petit peu de mathématique, ça peut pas faire de mal.
En mathématique un truc comme ça (0,1,1) s'appelle un vecteur.
En mathématique on peut faire des opérations avec les vecteurs : on peut les additionner, les multiplier, les diviser par un nombre …
(0,1,2)+(2,3,4) = (0+2,1+3,2+4) = (2,4,6)
5*(0,3,4) = (5*0,5*3,5*4) = (0,15,20)

Le jaune c'est du rouge plus du vert donc on peut l'écrire de trois façon différente :

jaune:=(1,1,0);
jaune:=(1,0,0)+(0,1,0);
jaune:=red+green;

Tu peux employer directement le nom des couleurs car ce sont des alias qui sont remplacés par MetaPost par leur vecteur.

Pour obtenir du gris c'est facile il faut que les 3 composantes soit identiques : (.4,.4,.4) ; (.9,.9,.9) ; (.658,.658,.658). On peut également écrire :

gris:=.4(1,1,1);
unautregris:=.9(1,1,1);
encoreunautregris:=.658(1,1,1);

Ou bien encore

gris:=.4white;
unautregris:=.9white;
encoreunautregris:=.658white;

Attention tu ne peux pas faire du gris avec du noir car le noir c'est (0,0,0) et le résultat d'une multiplication par 0 est toujours 0 donc tu obtiens toujours du noir.
pasdugris:=.4black;
maisdunoir:=.4(0,0,0);

De même il ne sert à rien de multiplier par un nombre supérieur à 1 car je te rappelle que les 3 composantes doivent être comprise entre 0 et 1

Tu peux également faire des opérations du style

macouleur:=.5[red,green];

Tu peux diviser les couleurs. Ci-dessous on a de gauche à droite red/2 ; red/5 ; green/3 ; white/2 et .5[red,green]

La couleur avec MetaFun et ConTeXt

Il serait dommage de ne pas pouvoir utiliser les couleurs définies dans ConTeXt pour notre texte dans nos graphiques. Et bien c'est possible grâce à une commande MetatFun : \MPcolor{lenomdelacouleur}

Par exemple pour utiliser la couleur middlegreen, prédéfinie dans ConTeXt, voir la fiche La couleur dans ConTeXt tu écris :

\definecolor[macouleur] [c=.4, m=.5, y=.6, k=.7]
\starttext
\startMPcode
path p;
p:=(0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
pickup pencircle scaled 5mm ;
fill p withcolor \MPcolor{middlegreen};
fill p shifted (5cm,0) withcolor \MPcolor{macouleur};
\stopMPcode
\stoptext

Comme tu peux le remarquer dans l'exemple ci-dessus, tu peux utiliser le système de couleur CMYK (à la place de RGB) qui n'est pas reconnu par MetaPost mais reconnu par MetaFun/ConTeXt.