PROGRAMMIAMO
C++ - Gerarchia di funzioni
Funzioni grafiche e gerarchia di funzioni

In C++ le funzioni possono anche chiamarsi l'una con l'altra: una funzione può al proprio interno chiamare un'altra funzione (e così via). Questa proprietà consente di costruire intere gerarchie di funzioni, a partire da funzioni semplici fino ad arrivare a funzioni sempre più complesse (che usano le funzioni più semplici per il loro funzionamento). Per fare un esempio di come si possano costruire funzioni complesse a partire da funzioni semplici, consideriamo le funzioni grafiche.

Per poter utilizzare le funzioni grafiche in Dev-C++ occorre installare, se non presente, la WinBGIm Graphics Library. Si tratta di una library di funzioni grafiche realizzata dal dipartimento di Computer Science dell'Università del Colorado.

Per verificare se WinBGIm è presente nella vostra installazione create un nuovo progetto e verificate se fra le opzioni di progetto è presente anche WinBGIm (vedi figura):

Nel caso in cui la library non sia installata, è possibile scaricarla da internet e installarla.

Per utilizzare la library grafica è sufficiente scegliere la scheda WinBGIm in Nuovo Progetto e quindi l'opzione WinBGIm (vedi figura precedente).

Il file main.cpp che viene generato automaticamente è un semplice esempio che può essere sostituito col proprio programma (vedi gli esempi nel seguito).

Disegnare un puntino (pixel) sullo schermo

Il programma mostrato nell'esempio qui sotto si limita a disegnare un puntino bianco sulla finestra nera alle coordinate x=100 e y=300:

#include <iostream>
#include "graphics.h"

using namespace std;

int main(int argc, char *argv[])
{
int gd=DETECT, gm; //variabili necessarie per inizializzare la grafica

initgraph(&gd, &gm, ""); //inizializza il modo grafico

//disegna un puntino bianco (15) alle coordinate x=100, y=300 sullo schermo
putpixel(100, 300, 15);


getch(); //attende che venga premuto un tasto
closegraph(); //chiude la finestra grafica

return EXIT_SUCCESS;
}


Le prime righe del programma (inizializzazione della scheda grafica) vanno copiate così come sono. La funzione putpixel ha come prototipo (contenuto in graphics.h, il file include delle funzioni grafiche):

void putpixel(int x, int y, int color)

In pratica per usarla bisogna passarle le due coordinate del punto e il colore (un numero intero compreso fra 0 e 15, dove 0 è il colore nero e 15 è il colore bianco).

Il risultato non è particolarmente entusiasmante, lo riconosco. Comunque è il primo passo per usare la grafica! La figura seguente mostra come vengono calcolate le coordinate, ovvero dall'angolo superiore sinistro della finestra (al contrario di quanto si fa normalmente in geometria):

Il programma qui sotto è leggermente più interessante, in quanto disegna sullo schermo un segmento orizzontale bianco, di lunghezza 50 pixel a partire dalle coordinate x=100, y=300:

#include <iostream>
#include "graphics.h"

using namespace std;

int main(int argc, char *argv[])
{
int gd=DETECT, gm;
int i;

initgraph(&gd, &gm, ""); //inizializza il modo grafico

for (i=100;i<150;i++)
putpixel(i, 300, 15); //disegna un segmento di lunghezza 50


getch(); //attende che venga premuto un tasto
closegraph();
return EXIT_SUCCESS;
}


Il risultato è mostrato in figura:

Funzioni per disegnare un segmento, un rettangolo e un cerchio

E' però interessante, ai nostri scopi, osservare che, a partire dalla putpixel, possiamo facilmente creare funzioni più complesse.

Per esempio la funzione seguente disegna sullo schermo un segmento, date le coordinate degli estremi (iniziale e finale) e il colore:

void segmento (int x1, int y1, int x2, int y2, int col)
{

double x,y;
int i;

for (x=x1,y=y1,i=0;i<1000;i++)
    {
    putpixel((int) x, (int) y, col);
    x = x + (x2-x1)/1000.0;
    y = y + (y2-y1)/1000.0;
    }

}

Analogamente possiamo usare la precedente funzione segmento per creare una funzione che disegna un rettangolo a partire dalle coordinate dei due vertici superiore-sinistro e inferiore-destro:

void rettangolo(int xsup, int ysup, int xinf, int yinf, int col)
{

segmento(xsup,ysup,xinf,ysup,col);
segmento(xsup,ysup,xsup,yinf,col);
segmento(xsup,yinf,xinf,yinf,col);
segmento(xinf,ysup,xinf,yinf,col);

}

Come ultimo esempio consideriamo infine una funzione per disegnare un cerchio sullo schermo. Questa funzione usa, oltre alla putpixel, anche le funzioni sin e cos della libreria matematica standard del C (bisogna includere in testa il file math.h):

void cerchio(int x, int y, int r, int color)
{
static const double PI = 3.1415926535;
double i, angle, x1, y1;

for(i = 0; i < 360; i += 0.1)
    {
    angle = i;
    x1 = r * cos(angle * PI / 180);
    y1 = r * sin(angle * PI / 180);
    putpixel(x + x1, y + y1, color);
    }

}

 

L'elenco completo delle funzioni grafiche della library WinBGIm si trova qui.

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it