Exemple 5 :

Utilisation de la souris


Principe

       Il existe plusieurs fonctions PgPlot permettant de manipuler la souris. Ce sont

Les deux programmes ci-dessous illutrent le comportement des fonctions cpgcurs et cpgncur. Le programme 1 dessine une courbe, attend qu'on clique sur le graphe, dessine un symbole aléatoire à la position cliquée, et affiche les valeurs (x,y) du point cliqué. Le programme 2 dessine une image, puis attend qu'on sélectionne deux points. Il effectue alors un zoom dans le rectangle défini par les deux points.
 


Programme 1 : Lecture des coordonnées d'un point sur un graphe.


/**************************************************************
 curseur.c
 On trace une courbe avec pgplot
 puis on place des objets avec la souris sur le graphe
 les objets sont de forme et couleur aleatoire
 la position de la souris est lue sur la fenetre terminal
 **************************************************************/

#include <stdio.h>
#include <math.h>
#include "/usr/include/cpgplot.h"

/* -------------------------------------------------
 generation d'un nombre aleatoire entre 0 et range
 ------------------------------------------------- */

float rnd(float range)
 
{
  float x;
  x=range*random()/(pow(2,31)-1);
  return(x);
}

/* -------------------------------------------------
 Programme principal
 ------------------------------------------------- */

main()

{
  int i,dim=512;
  float y[dim],x[dim];
  float x1,y1;
  int   jaipasfini=1;
  float ymin=-1, ymax=1;
  char  ch[10];                /* variable utilisee par cpgcurs */
 

  /* Remplissage des tableaux pour la courbe
     --------------------------------------- */
  for (i=0; i<dim; i++)
    {
      x[i]=i/50.0;
      y[i]=cos((x[i]*x[i]));
   }
 

  /* Affichage de la courbe
     ---------------------- */
  cpgopen("/xw");
  cpgenv(0,x[dim-1],ymin,ymax,0,0);
  cpglab("x","y=sin(x\\u2\\d)","Cliquez sur le graphe, lisez la position sur le terminal");
  cpgsch(0.8);
  cpgsci(3); cpgtext(7,-1.2,"Cliquez en dehors du graphe pour sortir");
  cpgsci(5);
  cpgline(dim,x,y);

  /* Affiche un symbole quand la souris est cliquee
     ---------------------------------------------- */
  srandom(getpid()); /* init du generateur aleatoire */
  cpgsch(4);         /* pour dessiner des gros symboles */
  while(jaipasfini)
    {
      cpgcurs(&x1,&y1,ch);
      printf("x= %g\ty=%g\n",x1,y1);
      jaipasfini=((fabs(y1)<1) && (x1<x[dim-1]) && (x1>x[0])); /* 1 si sur la courbe, 0 sinon */
      if (jaipasfini) {cpgsci((int)rnd(15.0)); cpgpt1(x1,y1,(int)rnd(30.0));}
 
    }
  cpgask(0);                              /* desactive la demande d'une touche pour sortir */
  cpgend();                               /* sortie pgplot */
}



 

Programme 2 : zoom sur une image.


/**************************************************************
 imzoom.c
 Plot d'une image en niveaux de gris
 on selectionne une zone a la souris et un zoom apparait
 dans la fenetre a cote.
 **************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "/usr/include/cpgplot.h"

#define MAX(a,b) ( (a)>(b) ? (a) : (b))
#define MIN(a,b) ( (a)<(b) ? (a) : (b))

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 */
  int   npt=0;                /* curseur : nombre de points selectionnes */
  float xcur[2],ycur[2];      /* curseur : coord. des points selectionnes */
  float x,y;

  /* Remplissage du tableau de valeurs
     ---------------------------------  */
  for (i=0; i<dimy; i++)
  for (j=0; j<dimx; j++)
    {
      x=j-dimx/2                               ;   /* passage pixels -> (x,y) */
      y=i-dimy/2;
      r=hypot(x,y);                               /* hypot(x,y)=sqrt(x*x+y*y) */
      z=cos(r)*cos(y);
      tab[i*dimx+j]=(float)z;
    }

  /* Bornes
     ------ */
  xmin=-dimx/2; xmax=dimx/2;
  ymin=-dimy/2; ymax=dimy/2;
  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;
 

  /* Graphe dans la 1ere fenetre
 ------------------------------- */
  cpgbeg(0,"/xw",2,1);
  cpgsch(1.5);
  cpgenv(xmin,xmax,ymin,ymax,1,0);        /* JUST=1 : repere orthonorme */
  cpglab("x","y","Fonction cos(y).cos(r)");
  cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
  cpgsch(1.1); cpgsci(3); cpgtext(-130,-240,"Cliquez sur deux points pour selectionner un rectangle, puis sur le bouton droit quand c'est fait");

  /* Selection de la partie a zoomer
     -----------------------------------    */
  cpgsci(7);  cpgsch(1.5);
  cpgncur(2,&npt,xcur,ycur,6);          /* selectionne deux points, coord dans xcur et ycur */
  xmax=MAX(xcur[0],xcur[1]);
  xmin=MIN(xcur[0],xcur[1]);
  ymin=MIN(ycur[0],ycur[1]);
  ymax=MAX(ycur[0],ycur[1]);
  cpgsfs(2);                           /* le rectangle ci-dessous est transparent */
  cpgrect(xmin,xmax,ymin,ymax);        /* dessine un rectangle sur la fenetre a zoomer */

  /* Recalcul de la fonction dans le nouveau carre
     --------------------------------------------- */

  for (i=0; i<dimy; i++)
  for (j=0; j<dimx; j++)
    {
      x=xmin+j*(xmax-xmin)/dimx;   /* passage pixels -> (x,y) */
      y=ymin+i*(ymax-ymin)/dimy;
      r=hypot(x,y);
      z=cos(r)*cos(y);
      tab[i*dimx+j]=(float)z;
    }

  tr[0]=xmin;
  tr[1]=(xmax-xmin)/dimx;
  tr[2]=0;
  tr[3]=ymin;
  tr[4]=0;
  tr[5]=(ymax-ymin)/dimy;
 
  /* Graphe dans la 2e fenetre
 ----------------------------- */
  cpgenv(xmin,xmax,ymin,ymax,1,0);        /* JUST=1 : le repere est orthonorme */
  cpglab("x","y","Zoom");
  cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
 
 

  cpgend();
}