Exemple 3 :
Affichage d'une image en niveaux de gris ou en fausses souleurs
Principe
Une fonction bidimensionnelle f(x,y) peut se représenter comme une image. On discrétise les valeurs de la fonction dans un tableau bidimensionnel z[i][j] sous forme d'une grille de pixels repérés par leur ligne i et leur colonne j. Le principe de la discrétisation est illustré par la figure ci-dessous.
Correspondances entre pixels (i,j) et coordonnées (x,y) :
Dans le langage PgPlot, les valeurs (x,y) sont appelées "coordonnées utilisateur". Soient idim et jdim le nombre de lignes et de colonnes du tableau z[][]
Palettes de couleur (Look Up Table ou LUT)
On peut aussi attribuer une couleur à chaque point [i,j] en fonction de la valeur de z[i][j]. On a alors besoin d'une correspondance entre valeurs de z et couleur. Cette correspondance est faite au moyen d'une palette de couleurs.
Le principe est le suivant. Soient zmin et zmax sont les valeurs minimum et maximum du tableau z[][]. On découpe l'intervalle [zmin,zmax] en 256 intervalles. Pour chaque intervalle, on attribue un niveau de rouge R (entre 0 et 1), un niveau de vert V et un niveau de bleu B. Une palette de couleurs est donc un ensemble de trois R[256], V[256] et B[256]. La couleur blanche correspond à R=V=B=1.
Des palettes prédéfinies existent dans le répertoire /users/licence/examples/Graphique/lut/ . On peut les lire et les installer à l'aide de la fonction cpgslut. L'exemple du programme 2 montre l'utilisation d'une palette de couleurs.
**************************************************************
image.c
Representation de fonctions z=f(x,y)
sous forme d'image en couleurs ou en niveaux
de gris
exemple de la fonction : j0(r) avec r=sqrt(x^2+y^2)
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "/usr/include/cpgplot.h"
main()
{
int i,j;
/* indices de boucle */
int dimx=256,dimy=256;
/* nb de points en x et en y */
float tab[dimx*dimy];
/* tableau des valeurs de la fonction */
double r,z;
/* variables intermediaires pour le calcul */
float xmin,xmax;
/* intervalle. en x */
float ymin,ymax;
/* intervalle. en y */
float zmin,zmax;
/* min et max des valeurs de la fonction */
float tr[6];
/* matrice utilisee par pgimag */
/* Remplissage du tableau de valeurs
---------------------------------
*/
for (i=0; i<dimy; i++)
for (j=0; j<dimx; j++)
{
r=hypot((double)i-dimy/2,(double)j-dimx/2)/10.;
/* distance/10 pt courant-centre */
z=j0(r);
tab[i*dimx+j]=(float)z;
}
/* Bornes
------ */
xmin=-dimx/20; xmax=dimx/20;
ymin=-dimy/20; ymax=dimy/20;
zmin=0; zmax=1;
/* Matrice de passage pixels -> coordonnees
user
---------------------------------------------
*/
tr[0]=xmin;
tr[1]=(xmax-xmin)/dimx;
tr[2]=0;
tr[3]=ymin;
tr[4]=0;
tr[5]=(ymax-ymin)/dimy;
/* Affichage image 2d
------------------ */
cpgopen("/xw");
cpgenv(xmin,xmax,ymin,ymax,1,0);
cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
cpglab("X","Y","Fonction de bessel j0(r)");
cpgask(1);
cpgend();
}
/**************************************************************
imcolor.c
Representation de fonctions z=f(x,y)
sous forme d'image en couleurs
exemple de la fonction : j0(r) avec r=sqrt(x^2+y^2)
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "/usr/include/cpgplot.h"
#include "cpgslut.c"
/* fonction table de couleurs */
main()
{
int i,j;
/* indices de boucle */
int dimx=256,dimy=256;
/* nb de points en x et en y */
float *tab;
/* tableau des valeurs de la fonction */
double r,z;
/* variables intermediaires pour le calcul */
float xmin,xmax;
/* intervalle. en x */
float ymin,ymax;
/* intervalle. en y */
float zmin,zmax;
/* min et max des valeurs de la fonction */
float tr[6];
/* matrice utilisee par pgimag */
tab=(float *)malloc(sizeof(float)*dimx*dimy); /* alloc memoire */
/* Remplissage du tableau de valeurs
---------------------------------
*/
for (i=0; i<dimy; i++)
for (j=0; j<dimx; j++)
{
r=hypot((double)i-dimy/2,(double)j-dimx/2)/10.;
/* distance/10 pt courant-centre */
z=j0(r);
tab[i*dimx+j]=(float)z;
}
/* Bornes
------ */
xmin=-dimx/20; xmax=dimx/20;
ymin=-dimy/20; ymax=dimy/20;
zmin=0; zmax=1;
/* Matrice de passage pixels -> coordonnees
user
---------------------------------------------
*/
tr[0]=xmin;
tr[1]=(xmax-xmin)/dimx;
tr[2]=0;
tr[3]=ymin;
tr[4]=0;
tr[5]=(ymax-ymin)/dimy;
/* Affichage image 2d
------------------ */
cpgbeg(0,"?",2,1);
/* Graphe dans la 1ere fenetre en gris
----------------------------------- */
cpgenv(xmin,xmax,ymin,ymax,1,0);
cpglab("x","y","Fonction de bessel j0(r)");
cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
/* Graphe dans la 2e fenetre en couleur
---------------------------------------- */
cpgenv(xmin,xmax,ymin,ymax,1,0);
cpgsch(2);
/* taille caracteres de la legende */
cpglab("x","y","La meme en couleur");
cpgslut("lut/idl11.lutasc");
cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
cpgend();
}
Résultat :