Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

LA RAPPRESENTAZIONE GRAFICA IN PASCAL - I limiti grafici del modo Testo

matematica



LA RAPPRESENTAZIONE GRAFICA IN PASCAL





§1. I limiti grafici del modo Testo



Lo schermo di Testo di default è formato da un rettangolo di 25 righe x 80 colonne. L'uso della clausola uses Crt; permette di governare lo schermo di Testo con le seguenti procedure:


ClrScr;

Delay(X: word);



GotoXY(C, R: byte);

HighVideo;

LowVideo;

NormVideo;

KeyPressed;

Sound(H: word);

NoSound;

ReadKey;

TextColor(C: byte);

TextBackGround(C: byte);

Window(X1, Y1, X2, Y2: byte);


I seguenti programmi esemplificano la "musica" e la "grafica" possibili:


program Sonata;

uses Crt;

const

DO_ = 523;

RE_ = 587;

MI_ = 659;

FA_ = 699;

SOL = 784;

LA_ = 880;

SI_ = 988;

var

Tasto: char;

FuoriScala: boolean;

Nota: word;

begin

ClrScr;

FuoriScala:= False;

Repeat

Tasto:= ReadKey;

Case Tasto of

'1': Nota:= DO_;

'2': Nota:= RE_;

'3': Nota:= MI_;

'4': Nota:= FA_;

'5': Nota:= SOL;

'6': Nota:= LA_;

'7': Nota:= SI_

Else FuoriScala:= True

end;

If not FuoriScala Then begin

Write(Tasto:2);

Sound(Nota);

Delay(100);

NoSound

end

Until FuoriScala;

WriteLn

end.


program Finestre;

uses Crt;

var

Riga, Colonna: byte;

begin

ClrScr;

For Colonna:= 1 to 80 do

For Riga:= 1 to 23 do begin

GotoXY(Colonna, Riga);

TextColor(Random(6) + 1);

Write('*')

end;

Window(25, 8, 55, 16);

ClrScr;

GotoXY(13, 5);

TextColor(Red + Blink);

Write('BRAVO!');

ReadLn;

Window(1, 1, 80, 25)

end.


Nient'altro, o quasi. Per fare della vera musica o della vera grafica ci vuole ben altro. Ora, se per la musica occorre senz'altro rivolgersi a software appositi ed anche implementare nuovo hardware, per la grafica invece TurboPascal fornisce un modulo (GRAPH) di routine, che innescato dalla clausola uses Graph; può dar luogo a pregiati disegni, specie di carattere geometrico. Naturalmente, per chi si volesse dedicare al design artistico, pubblicitario, cinematografico, o all'animazione, è più opportuno avvalersi d'un apposito software applicativo, come CorelDraw.




§2. Il modo Grafico



Se osserviamo da vicino un qualsiasi carattere nel modo Testo, ci accorgiamo che esso è costituito di piccoli punti luminosi detti pixel (acronimo di picture element). Nel modo Testo, lo schermo viene diviso in 80x25=2000 blocchetti rettangolari, ognuno composto di 9x14=126 pixel. Ogni blocchetto può contenere uno dei 256 caratteri ASCII ed è controllato dalla scheda video dell'hardware. In modo Grafico, invece, ogni singolo pixel può essere controllato dalla scheda grafica come

posizione: acceso o spento;

colore;

luminosità.

Naturalmente è necessario utilizzare un apposito software per adattare le istruzioni del programma in Pascal alla specifica scheda grafica di ogni monitor. Per questo, la Borland fornisce un'interfaccia grafica (BGI, o Borland Graphics Interface), che è contenuta nei file ad estensione *.BGI; questi file si chiamano driver, o pilota, proprio perché tecnicamente guidano il mappaggio dei pixel, ossia convertono gli specifici comandi TurboPascal in istruzioni che possono essere comprese dalla scheda grafica.



La risoluzione dello schermo è determinata dal numero di pixel che contiene. Maggiore è il loro numero, maggiori sono la vividezza e la nitidezza delle immagini. Le fotografie dei giornali sono notoriamente "povere" rispetto alle immagini fotografiche; a metà strada si trova la risoluzione della televisione attuale. Oggi, i monitor dei computer sono quasi tutti ad alta definizione, con scheda VGA Hi, ossia (almeno) 640x480 = 307200 pixel e (almeno) 16 colori.


La posizione di ogni pixel è definita da una coppia di coordinate cartesiane (X,Y), che vanno dalla coppia (0,0) per l'angolo in alto a sinistra, alla coppia (639,479) per l'angolo in basso a destra nell'adattatore VGA. Il centro dello schermo è quindi il pixel (320,240).

§3. L'inizializzazione del modo Grafico



Il modo di default in Pascal è quello Testo, essendo questo più comunemente usato. Per entrare in modo Grafico occorre richiamare la procedura


InitGraph(Driver, Modo, Path);


dove Driver identifica il codice del driver (cioè del programma pilota di estensione .BGI), Modo è il codice del modo grafico ottimale in cui quel driver può guidare il particolare adattatore grafico e Path racchiude tra apici il cammino della sottodirectory contenente i driver grafici. Path è il più facile da determinare, e di solito è


'C:\TP' oppure

'C:\TP\BGI'.


Basta in ogni caso controllare, per es. in DOS col comando dir c:\tp, dove sono collocati i file *.BGI.

Driver e Modo hanno dei codici integer, che variano a seconda della scheda grafica. Essi si possono trovare nei manuali. TurboPascal è tuttavia dotato di una routine (DetectGraph) per riconoscere i codici dell'adattatore in nostro possesso: basta usare il programma


program GrafInfo;

uses Graph;

var Driver, Modo: integer;

begin

DetectGraph(Driver, Modo);

WriteLn('Codice driver = ', Driver);

WriteLn('Codice modo = ', Modo);

ReadLn

end.


DetectGraph è una funzione a 2 uscite che controlla l'hardware installato e determina quale driver e quale modo usare. I parametri che essa restituisce vanno dall'utente memorizzati ed usati ogniqualvolta si debba scrivere un programma grafico. Noi tuttavia, per pigrizia o perché usiamo ogni giorno computer diversi, utilizzeremo un altro metodo ancora per inizializzare la grafica, senza bisogno di memorizzare i parametri della scheda: struttureremo inizialmente i programmi così


program X;

uses Graph;

var Driver, Modo: integer;

.....................;

begin

Driver:= Detect;

InitGraph(Driver, Modo, 'C:\TP');

.......................;

.......................;

ReadLn;

CloseGraph

end.


Con la function Detect i parametri Driver e Modo sono, di volta in volta, automaticamente ricercati ed ottimizzati da TurboPascal. CloseGraph è una procedura che, all'inverso, disattiva il sistema grafico, e libera il buffer dal programma pilota e da ogni routine grafica utilizzata. Se lo schermo era in modo Testo prima della chiamata di InitGraph, dopo CloseGraph ritornerà in modo Testo. Senza la chiamata di CloseGraph, il programma terminerebbe regolarmente, ma lo schermo rimarrebbe in modo grafico: dovremmo allora ripristinare il modo Testo da noi, o con complicati comandi Dos o facendo ripartire il PC.








§4. Primi comandi grafici



Per chi usa diversi computer, TurboPascal ha due function che restituiscono le coordinate cartesiane massime dei pixel, cioè 639 e 479 per i VGA: GetMaxX e GetMaxY; il centro dello schermo è così, per es., automaticamente determinabile dalle istruzioni


X:= GetMaxX div 2;

Y:= GetMaxY div 2;


Il seguente programma fornisce un utilizzo di queste function:


program Palloncino;

uses Graph;

var

Pilota, Modo: integer;

XO, YO, Raggio: word;

begin

Driver:= Detect;

InitGraph(Pilota, Modo, 'C:\TP\BGI');

XO:= GetMaxX div 2;

YO:= GetMaxY div 2;

Raggio:= GetMaxY div 4;

Circle(XO, YO, Raggio);

ReadLn;

CloseGraph

end.


La routine Circle(X, Y, R) traccia il cerchio di centro (X,Y) e raggio R. Per tracciare il segmento di retta che congiunge il punto (X1,Y1) col punto (X2,Y2), la routine è invece Line(X1, Y1, X2, Y2). Un'applicazione si ha nel seguente programma che, tracciando una famiglia intera di rette, fa apparire di risulta una curva (detta in Matematica "inviluppo" della famiglia di rette) avente le rette come tangenti in ogni suo punto:


program Inviluppo;

uses Graph;

var

Driver, Modo,

y, YMed: integer;

begin

Driver:= Detect;

InitGraph(Driver, Modo, 'c:\tp\bgi');

YMed:= GetMaxY div 2;



For y:= 1 to YMed do begin

Line(YMed - y, 0, 0, y);

Line(YMed + y, 0, GetMaxY, y);

Line(0, YMed + y, y, GetMaxY);

Line(YMed + y, GetMaxY, GetMaxY, GetMaxY - y)

end;

ReadLn;

CloseGraph

end.


L'uso nel ciclo For... to... do d'un rallentatore, per es. Delay(100), naturalmente con l'innesco della clausola Crt, può enfatizzare l'effetto di produzione dell'inviluppo.

Se vogliamo invece tracciare singoli punti, di questo o quel colore, utilizzeremo il comando PutPixel(X, Y, C). Esso, usato con X,Y,C numeri naturali, accende il pixel di coordinate (X,Y) e di colore C (i codici dei colori sono gli stessi di TextColor). Dunque 0<=X<=GetMaxX; 0<=Y<=GetMaxY; 0<=C<=15 (per VGA). Se vogliamo sapere qual è il colore del pixel di coordinate (X,Y) basta digitare la function predefinita GetPixel(X, Y); essa restituirà il codice del colore di quel pixel. Consideriamo, per es., il seguente programma


program DnaSpirale;

uses Graph;

var

Driver, Modo,

Onda, Ampiezza, YMedia, x: integer;

begin

Driver:= Detect;

InitGraph(Driver, Modo, 'c:\tp');

Ymedia:= GetMaxY div 2;

Ampiezza:= GetMaxY div 4;

for x:= 0 to GetMaxX do begin

Onda:= Round(Ampiezza * sin(5*Pi*x/GetMaxX));

PutPixel(x, YMedia+Onda, x mod 15);

PutPixel(x, YMedia-Onda, GetPixel(x, YMedia+Onda)+8)

end;

ReadLn;

CloseGraph

end.


Il primo PutPixel produce una sinusoide di diversi colori, il secondo ne disegna una simmetrica alla prima rispetto all'asse delle ascisse e con colori diversi.

Una differenza importante tra il modo Testo e quello Grafico sta nella gestione del cursore o puntatore attivo (CP): nel modo Testo è visibile (lineetta lampeggiante), mentre nel modo Grafico esso risulta invisibile. La sua collocazione è quella coincidente con l'ultimo pixel acceso, e comunque può essere rintracciata con le functions predefinite GetX e GetY, che restituiscono le coordinate di CP. La procedure MoveTo(X, Y) sposta il CP a (X,Y) senza visualizzare alcunché. Se siamo già col CP in (X1,Y1), la procedure LineTo(X2, Y2) traccia un segmento da (X1,Y1) a (X2,Y2). Le due coppie d'istruzioni


Line(X1, Y1, X2, Y2);

Line(X2, Y2, X3, Y3);


e


Line(X1, Y1, X2, Y2);

LineTo(X3, Y3);


sono pertanto equivalenti, ma la seconda opera più velocemente.

Molto spesso, se ci troviamo già nel punto (X1,Y1), per tracciare la linea retta da (X1,Y1) ad un altro punto (X2,Y2), risulta più comodo l'uso della routine LineRel(X2-X1, Y2-Y1); ossia


LineRel(DeltaX, DeltaY);


dove DeltaX e DeltaY sono rispettivamente gli spostamenti relativi dalla posizione iniziale: questo è senz'altro il caso quando si devono tracciare spezzate, poligoni, ecc., dove si sa di quanto ci si sposta di volta in volta nelle due direzioni, mentre sarebbe scomodo andare a calcolare ogni volta le coordinate dei vertici. Un es. di queste applicazioni è dato dal programma seguente, che disegna un quadrato, un esagono ed un ottagono regolari.


program Forme;

uses Graph;

const

s2 = 1.414;

s3 = 1.732;

DeltaXQ: array[1..4] of real = (2, 0, -2, 0);

DeltaYQ: array[1..4] of real = (0, 2, 0, -2);

DeltaXE: array[1..6] of real = (2, 1, -1, -2, -1, 1);

DeltaYE: array[1..6] of real = (0, s3, s3, 0, -s3, -s3);

DeltaXO: array[1..8] of real = (2, s2, 0, -s2, -2, -s2, 0, s2);

DeltaYO: array[1..8] of real = (0, s2, 2, s2, 0, -s2, -2, -s2);

Fattore = 30;

var

Altezza, Larghezza: word;

Driver, Modo: integer;

i: byte;

begin

Driver:= Detect;

InitGraph(Driver, Modo, 'c:\tp');

Altezza:= GetMaxY div 3;

Larghezza:= GetMaxX div 7;

MoveTo(Larghezza, Altezza);

for i:= 1 to 4 do

LineRel(Round(Fattore*DeltaXQ[i]), Round(Fattore*DeltaYQ[i]));

MoveTo(Round(2.8*Larghezza), Altezza);

for i:= 1 to 6 do

LineRel(Round(Fattore*DeltaXE[i]), Round(Fattore*DeltaYE[i]));

MoveTo(5*Larghezza, Altezza);

for i:= 1 to 8 do

LineRel(Round(Fattore*DeltaXO[i]), Round(Fattore*DeltaYO[i]));

ReadLn;

CloseGraph

end.






Privacy




Articolo informazione


Hits: 3254
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024