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