Exemple 5 :
Utilisation de la souris
Principe
Il existe plusieurs fonctions PgPlot permettant de manipuler la souris. Ce sont
/**************************************************************
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 */
}
/**************************************************************
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();
}