Tp2 II B2.c

De troyesGEII
Révision datée du 15 décembre 2012 à 21:48 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;

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();
}

retour vers la page des Tps II