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 smallint
Program 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.