Tp2 II B2.c
Révision datée du 7 décembre 2012 à 23:16 par Bjacquot (discussion | contributions) (Bjacquot a déplacé la page Tp2.c vers Tp2 II B2.c sans laisser de redirection)
#include <stdio.h> #include <stdlib.h> #include <math.h> #include "SVGlib.h"
#define N 512 // nombre de points de la courbe #define largeur 640 // taille de l'image #define hauteur 480 #define cCadre 0x000000 // les différentes couleurs utilisées. #define cTour 0x303030 #define cFond 0xFFFFFF #define cCourbe 0xFF0000
typedef struct { float min; float max; } bornes;
typedef struct { float Y[N]; // pas besoin d'axe des abscisses bornes Ybornes; } fct;
bornes extremes(fct f); fct echantillonne(char t); // en paramètre le type de fonction void tracerFenetre(int espace,fct f); // espace : bordure autour de la courbe fct filtremoyenne(fct f); fct filtrederivateur(fct f); fct bruitage(fct f);
int main() { fct f; char rep; for(;;) { printf(" Filtrage Numérique \n"); printf(" ========================== \n"); printf(" \n"); printf("E...Echantillonnage B...Bruitage \n"); printf("M...filtre Moyenneur D...filtre Dérivée \n"); printf("T...Tracé de la courbe Q...Quitter \n"); printf(" \n"); scanf("%c",&rep); // la fonction scanf possède certaines limitations if (rep!=10) getchar(); // comme ne pas supprimer la touche entrée ('\n' ou 10) switch (rep) { case 'e': case 'E': do { printf("Choix de la courbe : 's' pour sin, 'r' pour rectangulaire.\n"); scanf("%c",&rep); // la fonction scanf possède certaines limitations if (rep!=10) getchar(); // comme ne pas supprimer la touche entrée ('\n' ou 0x10) if (rep=='S') rep='s'; if (rep=='R') rep='r'; } while ((rep!='s')&&(rep!='r')); f=echantillonne(rep); break; case 't': case 'T': tracerFenetre(20,f); break; case 'q': case 'Q': return 0; case 'm': case 'M': f=filtremoyenne(f); break; case 'd': case 'D': f=filtrederivateur(f); break; case 'b': case 'B': f=bruitage(f); break; } } }
fct filtremoyenne(fct f) { int i; for (i=1;i<N-1;i++) f.Y[i]=(f.Y[i-1]+f.Y[i+1])/2; f.Ybornes=extremes(f); return f; }
fct filtrederivateur(fct f) { int i; for (i=1;i<N-1;i++) f.Y[i]=f.Y[i+1]-f.Y[i-1]; f.Ybornes=extremes(f); return f; }
fct bruitage(fct f) { int i; for (i=1;i<N-1;i++) f.Y[i]+=1.0*rand()/RAND_MAX+0.5; f.Ybornes=extremes(f); return f; }
bornes extremes(fct f) //recherche des valeurs extrêmes { int i; bornes M; M.min=f.Y[0]; M.max=f.Y[0]; // initialisation for (i=1;i<N;i++) // parcours du tableau { if (M.min>f.Y[i]) M.min=f.Y[i]; if (M.max<f.Y[i]) M.max=f.Y[i]; } return M; }
fct echantillonne(char t) { int i; fct f; if (t=='s') for (i=0;i<N;i++) f.Y[i]=sin(2*M_PI*i/256); // fonction sinus else for (i=0;i<N;i++) f.Y[i]=((i/128)%2)*2-1; // fonction rectangulaire f.Ybornes=extremes(f); return f; }
void tracerFenetre(int espace,fct f) { SVGopen(largeur,hauteur); //Préparation de l'image SVGrectanglePlein(0, 0, largeur, hauteur,cTour,cTour); SVGrectanglePlein(espace, espace, largeur-2*espace, hauteur-2*espace,cCadre,cFond); int cX[N],cY[N],i; for (i=0;i<N;i++) // Coordonnees dans l'image { cX[i] = (largeur-2.0*espace) / N * i + espace; cY[i] = (hauteur-2.0*espace)*(1.0 - (f.Y[i]-f.Ybornes.min)/(f.Ybornes.max-f.Ybornes.min)) + espace; } for (i=1;i<N;i++) SVGline(cX[i-1],cY[i-1],cX[i],cY[i],cCourbe); //tracé de la fonction SVGClose(); }