Tp2p II B2.c : Différence entre versions
m (Bjacquot a déplacé la page Tp2p.c vers Tp2p II B2.c sans laisser de redirection) |
|||
(Une révision intermédiaire par le même utilisateur non affichée) | |||
Ligne 1 : | Ligne 1 : | ||
− | + | {{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; | ||
+ | |||
+ | void extremes(fct *f); | ||
+ | void echantillonne(char t,fct *f); // en paramètre le type de fonction | ||
+ | void tracerFenetre(int espace,fct *f); // espace : bordure autour de la courbe | ||
+ | void filtremoyenne(fct *f); | ||
+ | void filtrederivateur(fct *f); | ||
+ | void 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')); | ||
+ | echantillonne(rep,&f); | ||
+ | break; | ||
+ | case 't': | ||
+ | case 'T': | ||
+ | tracerFenetre(20,&f); | ||
+ | break; | ||
+ | case 'q': | ||
+ | case 'Q': | ||
+ | return 0; | ||
+ | case 'm': | ||
+ | case 'M': | ||
+ | filtremoyenne(&f); | ||
+ | break; | ||
+ | case 'd': | ||
+ | case 'D': | ||
+ | filtrederivateur(&f); | ||
+ | break; | ||
+ | case 'b': | ||
+ | case 'B': | ||
+ | bruitage(&f); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void filtremoyenne(fct *f) | ||
+ | { | ||
+ | int i; | ||
+ | for (i=1;i<N-1;i++) f->Y[i]=(f->Y[i-1]+f->Y[i+1])/2; | ||
+ | extremes(f); | ||
+ | } | ||
+ | |||
+ | void filtrederivateur(fct *f) | ||
+ | { | ||
+ | int i; | ||
+ | for (i=1;i<N-1;i++) f->Y[i]=f->Y[i+1]-f->Y[i-1]; | ||
+ | extremes(f); | ||
+ | } | ||
+ | |||
+ | void bruitage(fct *f) | ||
+ | { | ||
+ | int i; | ||
+ | for (i=1;i<N-1;i++) f->Y[i]+=1.0*rand()/RAND_MAX+0.5; | ||
+ | extremes(f); | ||
+ | } | ||
+ | |||
+ | void extremes(fct *f) //recherche des valeurs extrêmes | ||
+ | { | ||
+ | int i; | ||
+ | f->Ybornes.min=f->Y[0]; f->Ybornes.max=f->Y[0]; // initialisation | ||
+ | for (i=1;i<N;i++) // parcours du tableau | ||
+ | { | ||
+ | if (f->Ybornes.min>f->Y[i]) f->Ybornes.min=f->Y[i]; | ||
+ | if (f->Ybornes.max<f->Y[i]) f->Ybornes.max=f->Y[i]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void echantillonne(char t, fct *f) | ||
+ | { | ||
+ | int i; | ||
+ | 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 | ||
+ | extremes(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}} |
Version actuelle datée du 15 décembre 2012 à 22:50
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;
void extremes(fct *f);
void echantillonne(char t,fct *f); // en paramètre le type de fonction
void tracerFenetre(int espace,fct *f); // espace : bordure autour de la courbe
void filtremoyenne(fct *f);
void filtrederivateur(fct *f);
void 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'));
echantillonne(rep,&f);
break;
case 't':
case 'T':
tracerFenetre(20,&f);
break;
case 'q':
case 'Q':
return 0;
case 'm':
case 'M':
filtremoyenne(&f);
break;
case 'd':
case 'D':
filtrederivateur(&f);
break;
case 'b':
case 'B':
bruitage(&f);
break;
}
}
}
void filtremoyenne(fct *f)
{
int i;
for (i=1;i<N-1;i++) f->Y[i]=(f->Y[i-1]+f->Y[i+1])/2;
extremes(f);
}
void filtrederivateur(fct *f)
{
int i;
for (i=1;i<N-1;i++) f->Y[i]=f->Y[i+1]-f->Y[i-1];
extremes(f);
}
void bruitage(fct *f)
{
int i;
for (i=1;i<N-1;i++) f->Y[i]+=1.0*rand()/RAND_MAX+0.5;
extremes(f);
}
void extremes(fct *f) //recherche des valeurs extrêmes
{
int i;
f->Ybornes.min=f->Y[0]; f->Ybornes.max=f->Y[0]; // initialisation
for (i=1;i<N;i++) // parcours du tableau
{
if (f->Ybornes.min>f->Y[i]) f->Ybornes.min=f->Y[i];
if (f->Ybornes.max<f->Y[i]) f->Ybornes.max=f->Y[i];
}
}
void echantillonne(char t, fct *f)
{
int i;
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
extremes(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();
}