Tp2 II B2.c : Différence entre versions
m |
|||
Ligne 1 : | Ligne 1 : | ||
{{RetourVers/TpII}} | {{RetourVers/TpII}} | ||
− | + | <source lang="c"> | |
− | + | #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(); | ||
+ | } | ||
+ | </source> | ||
{{RetourVers/TpII}} | {{RetourVers/TpII}} |
Version actuelle datée du 15 décembre 2012 à 21:48
retour vers la page des Tps II
#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();
}