Tp2p II B2.c : Différence entre versions

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

retour vers la page des Tps II