Doteraz sme ako výstup používali len vypisovanie textu procedúrami write a writeln. Pascal však dokáže pracovať aj s grafikou - kresliť úsečky, obdĺžniky, elipsy a pod.
Aby sme mohli pracovať s grafikou, je potrebné prepnúť z textového do grafického režimu. Uvediem tu kód, ktorý je nutné vkladať do každého pascalovského grafického programu. Nemusíte mu rozumieť, keďže ide o systémové záležitosti, ale napíšem niečo aj o tom.
Najskôr pridáme do sekcie uses jednotku graph, ktorá obsahuje všetko potrebné na „kreslenie“.
Premenná ovladac, veľmi zjednodušene povedané, obsahuje číslo ovládača grafickej karty. Ovládač je súbor sprostredkujúci spoluprácu medzi hardvérom a softvérom. Grafmod je grafický mód, v akom budeme pracovať - väčšina ovládačov totiž obsahuje viac režimov, napr. mód 1 = rozlíšenie monitora 640x480, 256 farieb; mód 2 = rozlíšenie 720x400, 16 farieb a pod.
Nebojte sa, všetko ponecháme na autodetekciu a premennej ovladac priradíme hodnotu funkcie Detect.
Nakoniec prepneme do grafického režimu procedúrou InitGraph. Prvým parametrom je ovládač, druhým grafický mód a tretí určuje priečinok, kde sa nachádza súbor s ovládačom. Ovládače sú v tomto prípade súbory s príponou BGI a môžeme ich nájsť priamo v adresároch Free Pascalu, resp. TurboPascalu. Priečinok, v ktorom sme ich našli, uvedieme ako tretí parameter procedúry InitGraph.
program grafika; uses crt, graph; var ovladac, grafmod: integer; begin ovladac := Detect; InitGraph(ovladac, grafmod, 'C:\OVLADACE'); ... repeat until keypressed; end.
Ak používate FreePascal a nedarí sa vám tento kód skompilovať, je nutné:
integer za smallintProgram spustite a ak nepozorujete chybové hlášky, všetko by malo byť v poriadku.
Grafickú plochu predstavuje v prípade TurboPascalu celá obrazovka, pri Free Pascale je to špeciálne windowsovské okno.
Pracuje sa v súradnicovej sústave. Jej začiatok je v ľavom hornom rohu a má súradnice X = 0, Y = 0; ináč povedané [0, 0]. Jednotkou sú pixle.
Na nakreslenie úsečky používame funkciu Line(X1, Y1, X2, Y2). Parametre sú celočíselné a zohrávajú nasledujúcu úlohu:
X1 je X-ová súradnica začiatočného bodu úsečkyY1 je jeho Y-ová súradnicaX2 je X-ová súradnica koncového bodu úsečkyY2 je jeho Y-ová súradnicaSkúsime nakresliť vodorovnú čiaru začínajúcu na súradniciach [100, 50] a končiacu na [300, 50].
Line(100, 50, 300, 50);
Podobný efekt môžeme dosiahnuť tým, že procedúrou MoveTo(X, Y) posunieme akýsi „ukazovateľ“ na pozíciu [100, 50]. Potom pomocou LineTo(X, Y) urobíme čiaru z aktuálnej súradnice do pozície [300, 50].
MoveTo(100, 50); LineTo(300, 50);
Obdĺžnik sa dá nakresliť viacerými čiarami, ale zvyčajne ho kreslíme jednoduchšie - procedúrou Rectange(X1, Y1, X2, Y2). Parametre majú tentoraz takýto význam:
Nakreslíme obdĺžnik široký 200 a vysoký 80 px. Jeho ľavý horný roh bude na pozícii [100, 100].
Rectangle(100, 100, 300, 180);
Procedúra Bar má rovnaké parametre ako Rectangle, ale jej úlohou je nakresliť vyplnený obdĺžnik. Predtým, ako ju zavoláme, je vhodné nastaviť štýl a farbu výplne pomocou SetFillStyle(Typ_výplne, Farba).
SetFillStyle(SolidFill, red); Bar(100, 100, 300, 180);
Vytvoriť kruh je jednoduchšie, ako by sa mohlo zdať. Máme na to procedúru Circle(X, Y, Polomer). Celočíselné parametre X a Y označujú súradnice stredu kruhu, význam slova polomer asi netreba vysvetľovať.
Circle(250, 200, 40);
Procedúra Ellipse, kresliaca elipsu alebo jej časť, má, samozrejme, trochu viac parametrov. Takto znie definícia:
Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius: Word);
X a Y sú súradnice stredu. XRadius je x-ový polomer, YRadius zas y-ový.
StAngle je uhol, od ktorého sa začína časť elipsy kresliť. EndAngle je uhol, kde sa má prestať kresliť. Predstavte si uhlomer, kde 0 alebo 360 stupňov je vpravo, 90 hore, 180 vľavo a 270 dole. Viac možno pochopíte skúšaním rôznych hodnôt.
Ellipse(50, 150, 90, 360, 30, 50);
Vznikne časť elipsy:
Hoci sme v grafickom prostredí, nikto nepovedal, že na grafickú nemôžme písať text. Slúži na to procedúra OutText s parametrom typu string. Daný text sa vypíše na aktuálnu pozíciu (určenú cez MoveTo, atď.).
OutText('Nejaky text');
Funkcia OutTextXY(X, Y, Text) vypíše parameter Text na súradniciach X, Y.
OutTextXY(10, 10, 'Iny text');
Farbu kresliaceho nástroja nastavíme procedúrou SetColor(Farba). Parametrom je číslo, avšak existujú preddefinované konštanty, ktoré môžeme použiť - napr. Blue je modrá, Yellow žltá a pod.
SetColor(LightBlue); Line(0, 0, 100, 200);
Uvediem praktický príklad - vykreslenie grafu kvadratickej funkcie x2-10x+30. Hodnoty sa budú počítať a kresliť od x = -10 po x = 20.
program grafkvad; uses crt, graph; const zaciatok = -10; koniec = 20; var ovladac, grafmod: integer; x, stredX, stredY: integer;
Samotná funkcia bude uložená vo funkcii f s celočíselným parametrom X. Vráti sa stred výšky plochy mínus hodnota Y pre dané X. Dôvod je jasný - hodnoty pascalovských súradnic sa zhora nadol zvyšujú, v matematike je to naopak.
{kvadraticka funkcia
s prepoctom na pascalovske suradnice}
function f(x: integer): integer;
begin
f := stredY-(x*x-10*x+30);
end;
begin
{prechod do grafickeho rezimu}
ovladac := Detect;
InitGraph(ovladac, grafmod, 'C:\OVLADACE');
Pascalovská funkcia GetMaxX vráti šírku grafickej plochy v pixloch, GetMaxY zas jej výšku. Vydelením týchto čísel dvojkou dostaneme stred nášho vlastného súradnicového systému.
{urcenie stredu plochy}
stredX := GetMaxX div 2;
stredY := GetMaxY div 2;
Teraz nakreslíme osi x a y. Dáme k nim aj textový popis.
{vykreslenie osi x a y}
Line(0, stredY, GetMaxX, stredY);
Line(stredX, 0, stredX, GetMaxY);
{napiseme k nim textovy popis}
OutTextXY(0,stredY+2,'X');
OutTextXY(stredX+2,0,'Y');
Presunieme ukazovateľ na začiatok. V cykle postupne vykresľujeme hodnoty Y pre X, zväčšujúce sa od začiatočnej po koncovú hodnotu.
{presun na zaciatok grafu}
MoveTo(stredX+zaciatok, f(zaciatok));
{vykreslovanie v cykle}
for x := zaciatok to koniec do
LineTo(stredX+x, f(x));
repeat until keypressed;
end.