« Tp2p II B2.c » : différence entre les versions
Aller à la navigation
Aller à la recherche
Des restrictions d’accès ont été mises en place pour cette page. Si vous voyez ce message, vous n’avez pas accès à cette page.
m Bjacquot a déplacé la page Tp2p.c vers Tp2p II B2.c sans laisser de redirection |
Aucun résumé des modifications |
||
| (Une version 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}} | |||
Dernière version du 15 décembre 2012 à 20: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();
}