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:
|
|