/*----------------------------------------------------------*/ /* */ /* AUTHOR : Eric VIOLARD */ /* E-MAIL : violard@icps.u-strasbg.fr */ /* ORGANISM : Université Louis Pasteur (Strasbourg) */ /* CREATION : 23/11/02 */ /* */ /* ---------------------------------------------------------*/ /* Programme permettant de tracer la courbe d'une fonction y = f(x) où x et y sont des réels. La definition de cette fonction apparaît explicitement dans le programme. On suppose que la fonction est continue. Le programme demande 2 intervalles réels - l'intervalle des abscisses [xmin,xmax] - et celui des ordonnées [ymin,ymax] Ainsi que les dimensions de la fenêtre graphique (largeur x hauteur). Le domaine [xmin,xmax] x [ymin,ymax] est une enveloppe rectangulaire de la courbe représentative de la fonction. Le programme fait correspondre ce domaine à la fenêtre graphique. Pour tester ce programme, entrer les valeurs suivantes : xmin=-15.0, xmax=15.0, ymin=-5.0, ymin=5.0, largeur=500, hauteur=500 */ #include /* pour utiliser les fonctions printf et scanf */ #include /* pour utiliser les fonctions graphiques */ #include /* pour utiliser des fonctions mathématiques dans la définition de la fonction à tracer */ /* --- fonctions utiles */ float min(float a, float b) /* minimum de 2 réels */ { float r; r=a; if(bb) r=a; return r; } /* --- définition de la fonction à tracer */ float f(float x) /* la fonction à tracer */ { float y; y=exp(-0.1*x)*sin(x); return y; } /* --- */ /* --- Définition du type des intervalles fermés de nombres réels --- */ /* munis des opérations : - construction d'un intervalle, - borne inf - borne sup - thalès */ typedef struct { float a; float b; } intervalle; /* type des intervalles fermés définis par 2 réels a et b [a,b] si a<=b ou [b,a] si b<=a */ intervalle cons_intervalle(float a,float b) /* construction d'un intervalle à partir de 2 réels */ { intervalle I; I.a = a; I.b = b; return I; } float borne_inf(intervalle I) /* borne inférieure d'un intervalle */ { return min(I.a,I.b); } float borne_sup(intervalle I) /* borne supérieure d'un intervalle */ { return max(I.a,I.b); } float thales(float x1, intervalle I1, intervalle I2) /* détermine le réel x1 de l'intervalle I1 correspondant au réel x2 de l'intervalle I2 en utilisant le théorème de Thalès */ { float x2; x2 = (x1-I1.a) * ((I2.b-I2.a)/(I1.b-I1.a)) + I2.a; return x2; } /* --- */ main() { /* déclarations */ int largeur,hauteur; /* dimensions de la fenêtre */ float xmin,xmax,ymin,ymax; /* défini une enveloppe rectangulaire de la courbe */ int X,Y; /* les coordonnées d'un pixel de la fenêtre graphique */ float x,y; /* les coordonnées d'un point de la courbe */ int Y_prec; /* précédente coordonnée Y (pour dessiner des lignes entre les points de la courbe) */ /* --- initialisations --- */ /* -- du domaine de définition de la fonction */ printf("Entrer l'intervalle des abscisses de la courbe : "); scanf("%f %f",&xmin,&xmax); printf("Entrer l'intervalle des ordonnées de la courbe : "); scanf("%f %f",&ymin,&ymax); /* -- de la fenêtre graphique */ printf("Entrer les dimensions de la fenêtre graphique (largeur x hauteur) en nombre de pixels : "); scanf("%d %d",&largeur,&hauteur); initgraph(largeur,hauteur); cleargraph(); /* --- tracé --- */ /* -- tracé des axes */ setcolor(0.,0.,1.); /* en bleu */ /* axe des abscisses : droite d'équation y=0 */ y = 0.; Y = (int)thales(y,cons_intervalle(ymax,ymin),cons_intervalle(0.,(float)hauteur-1)); line(0,Y,largeur-1,Y); /* axe des ordonnees : droite d'équation x=0 */ x = 0.; X = (int)thales(x,cons_intervalle(xmin,xmax),cons_intervalle(0.,(float)largeur-1)); line(X,0,X,hauteur-1); /* -- tracé de la courbe */ setcolor(1.,0.,0.); /* en rouge */ for(X=0;X0) line(X,Y_prec,X,Y); Y_prec = Y; } flushgraph(); /* pour forcer l'affichage */ /* --- terminaisons --- */ waitgraph(); /* attente d'une frappe au clavier */ closegraph(); /* fermeture de la fenêtre graphique */ }