Grafico di una funzione

Il programma che segue realizza il grafico di una funzione in formato pbm. Il problema non presenta nessuna difficoltà: si dichiara una struttura per rappresentare l'immagine, e la si inizializza. Alla fine, va scritta su file.

Questo schema è fisso: quello che manca è la specifica di quello che si fa in mezzo, ossia il disegno vero e proprio che viene fatto sulla matrice. Nel nostro caso, per ogni valore di x determiniamo il valore di y (il risultato della funzione), e mettiamo a 1 il pixel di coordinate x,y della matrice. L'unica cosa da tenere in considerazione è il fatto che il valore di y non è necessariamente compreso negli indici ammissibili della matrice. Prima di effettuare l'operazione di mettere 1 nella matrice, occorre quindi controllare che il punto sia compreso all'intero delle coordinate dell'immagine.

Il programma grafico.c è qui sotto.

/*
  Grafico di una funzione in formato pbm
*/

#include<stdlib.h>
#include<stdio.h>


/* definizione del tipo */

struct ImmagineBW {
  int larghezza;
  int altezza;
  int mat[400][400];
};


/*
  crea un file a partire da una matrice
*/

void CreaFileImmagine(char *nomefile, struct ImmagineBW img) {
  FILE *fd;
  int x, y;

		/* apre il file */
  fd=fopen(nomefile, "w");
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* stampa la matrice */
  fprintf(fd, "P1\n");
  fprintf(fd, "%d %d\n", img.larghezza, img.altezza);

  for(y=img.altezza-1; y>=0; y--)
    for(x=0; x<=img.larghezza-1; x++)
      if( img.mat[x][y] )
        fprintf(fd, "1\n");
      else
        fprintf(fd, "0\n");


		/* chiude il file */
  fclose(fd);
}
  

/*
  main
*/

int main() {
  struct ImmagineBW q;
  int x, y;

		/* inizializza la matrice */
  q.larghezza=200;
  q.altezza=100;

  for(x=0; x<=q.larghezza-1; x++)
    for(y=0; y<=q.altezza-1; y++)
      q.mat[x][y]=0;


		/* realizza il grafico della funzione */
  for(x=0; x<=q.larghezza-1; x++) {
    y=x/4+(x/8)%20-10;
    if(y>=0 && y<=q.altezza-1)
      q.mat[x][y]=1;
  }


		/* scrive l'immagine su file */
  CreaFileImmagine("funzione.pbm", q);

  return 0;
}

L'immagine che viene generata è qui sotto: