Tp2 II B2.c : Différence entre versions
m (Bjacquot a déplacé la page Tp2.c vers Tp2 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; | ||
+ | |||
+ | 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}} |
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();
}