Tp2p II B2.c

De troyesGEII
Révision datée du 15 décembre 2012 à 21:50 par Bjacquot (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

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