Pascal II.
01. Eljárások, függv...
01. Gyakorló feladatok
02. Felsorolt típus, ...
02. Gyakorló feladatok
03. Állományok kezelése
03. Gyakorló feladatok
04. Unitok, CRT unit
04. Gyakorló feladatok
05. DOS unit, rendezé...
05. Gyakorló feladatok
06. Rekurzió, quicksort
06. Gyakorló feladatok
07. Backtracking
07. Gyakorló feladatok
08. GRAPH unit
08. Gyakorló feladatok
09. Kép mozgatása
09. Gyakorló feladatok
10. Winmouse unit
10. Gyakorló feladatok
11. Dinamikus adatsze...
11. Gyakorló feladatok
12. Dinamikus adatsze...
12. Gyakorló feladatok
13. Dinamikus adatsze...
13. Gyakorló feladatok
|
Programozás 2 (Pascal)
8 Graph unit
-
grafikus
ablak, wincrt unit
-
a graph unit eljárásai
és függvényei
-
sin(x) függvény
kirajzolása
8.1 Grafikus
ablak, wincrt unit
Eddig mindig csak szöveges módban dolgoztunk,
melynek felbontása 80x25 karakter. Ahhoz,
hogy tudjunk rajzolni is, mindenekelőtt inicializálnunk kell a grafikus
képernyőt (módot). Windows alatt futó FreePascal-ban a grafika inicializálása
után megjelnik egy új ablak, melybe rajzolhatunk. A grafika inicializálására
szolgáló programunk a következőképpen néz ki:
program Pelda27;
uses graph, wincrt;
var gd,gm: integer;
begin
{grafika inicializalasa}
gd := d4bit;
gm := m640x480;
initgraph(gd,gm,'');
{ha hiba tortent, akkor a program leallitasa}
if graphresult<>grok then
begin
writeln('Hiba a grafika
inicializalasanal.');
halt; end;
{rajzolas}
{ ... }
{grafikus mod bezarasa}
readkey;
closegraph;
end.
Használnunk
kell tehát a graph
unitot (uses graph), melyben
az összes grafikával kapcsolatos parancs
megtalálható. A grafika
inicializálásához
szükségünk lesz két
egész szám típusú
változóra: gd
és gm.
Az egyikkel színmélységet
(d4bit) a másikkal a grafikus felbontást
(m640x480) adjuk meg.
A
grafikát az initgraph(gd,gm,'');
paranccsal inicializáljuk. Ez után a parancs
után, ha sikerült,
megjelenik egy grafikus ablak. Az
initgraph harmadik paramétereként megadhatjuk,
hol található a grafikus driver
(kiretjesztése bgi), ezt azonban csak akkor
szükséges megadnunk ha a Borland
Pascal-ét vagy egy sajátot használunk.
Azt, hogy
sikerült-e inicializálni a grafikát, a graphresult
változó
segítségével tudjuk leellenőrizni.
A
rajzolás után ne feledkezzünk meg a
grafikus mód bezárásával (grafikus ablak
bezárásával)
visszatérni a szöveges módba. Erre
szolgál a closegraph
parancs.
A programban használtuk még a wincrt unitot is. Ez a
unit ugyanolyan nevű parancsokat tartalmaz, mint a crt unit parancsai, a
különbség az, hogy a wincrt unitban található parancsok a grafikus ablakra
vonatkoznak. A fenti példában a readkey utasítás végett volt rá
szükségünk. Ez a parancs vár egy billentyű megnyomására a grafikus ablakban (ha
a crt unitot használtuk volna, akkor a grafikus ablak mögött levő
szöveges ablakban várna a billentyű megnyomására).
A wincrt és a crt unitokat használhatjuk egy programon
belül is. Ekkor ha pl. azt szeretnénk, hogy a programunk a szöveges módban levő
ablakban várjon a billentyű megnyomására, akkor crt.readkey formában, ha
a grafikus ablakban várja a billentyűleütést, akkor pedig wincrt.readkey
forbában kellene használnunk.
8.2
A graph
unit eljárásai és függvényei
A graph unitban található
néhány fontosabb parancs:
initgraph(gd,gm,path)
- grafika inicializálására
szolgál
closegraph -
grafikus mód bezárása
setcolor(szin)
- segítségével
beállíthatju a toll (vonal)
színét. Színként
megadhatunk 0 és 15 közötti
számot vagy a szín angol nevét (pl.
red, blue, green, yellow, white, black).
setbkcolor(szin) -
a háttérszín
beállítására
szolgál értékei hasonlóak
lehetnek, mint a setcolor parancsnál.
setfillstyle(stilus,szin) -
segítségével a
kitöltés színét és
stílusát adhatjuk meg. A színt
hasonlóan adhatjuk meg, mint a setcolor
parancsnál, stílusként pedig
megadhatjuk a következő konstansok egyikét:
EmptyFill
SolidFill
LineFill
ltSlashFill
SlashFill
BkSlashFill
LtBkSlashFill
HatchFill Fills
XHatchFill Fills
InterLeaveFill
WideDotFill
CloseDotFill
SetLineStyle (VonalStilus,Minta,Vastagsag)
- ezzel a paranccsal beállíthatjuk, hogy milyen
vonaltípussal szeretnénk rajzolni. A vonalstilus
lehetséges értékei:
Solidln = 0
Dottedln = 1
Centerln = 2
Dashedln = 3
UserBitln = 4
A
mintának csak a UserBitln esetében van értelme,
ekkor megadhatjuk a vonal mintáját bitek
segítségével. A többi esetben ez a
paraméter nincs figyelembe véve.
A vonalvastagság az alábbi értékek egyike lehet:
NormWidth = 1
ThickWidth = 3
settextjustify(horizontalis,vertikalis)
- segítségével megadhatjuk, hogy a szöveg
kiírásánál a koordináták a
szöveg melyik részére vonatkozzanak.
Alapbeállításként ez a szöveg bal
felső sarka. Az első paraméter lehetséges
értékei:
LeftText = 0
CenterText = 1
RightText = 2
a második paraméter értékei lehetnek:
BottomText = 0
CenterText = 1
TopText = 2
getcolor - segítségével megállapíthatjuk, milyen az éppen beállított szín.
getbkcolor - megadja, milyen az éppen beállított háttérszín.
getpixel(x,y) - megadja, milyen az X, Y koordinátájú pont színe.
A grafikus módban alakzatok rajzolására szolgáló parancsok:
line(x1,y1,x2,y2) - vonal
[x1,y1] ponttól [x2,y2] pontig.
lineto(x,y) -
vonalat húz az előző ponttól (a toll helyétől) az
[x,y] koordinátájú pontig.
linerel(x,y)
- vonalat húz az előző ponttól (a
toll helyétől) egy olyan pontig, amely x-el jobbra és y-nal lejjebb van.
moveto(x,y) - a tollat átteszi
(vonal húzása nélkül) az [x,y] koordinátájú
pontra.
moverel(x,y)
- a tollat átteszi (vonal húzása nélkül) egy olyan pontra, amely az
előzőtől x-el jobbra és y-nal lejjebb van.
circle(x,y,r)
- [x,y] középpontú r sugarú kör rajzolása.
rectangle(x1,y1,x2,y2)
- téglalap rajzolása [x1,y1] ponttól
[x2,y2] pontig.
arc(x,y,szogkezd,szogvege,sugar)
- körív rajzolására szolgáló
parancs.
ellipse(x,y,szogkezd,szogvege,xfeltengely,yfeltengely)
- ellipszis vagy ellipszis ívének rajzolására szolgáló parancs.
outtext(szoveg) - szöveg kiírása a toll
koordinátáira.
outtextxy(x,y,szoveg) - szöveg kiírása a megadott koordinátákra.
putpixel(x,y,szin) - az
[x,y] koordinátákra egy pont kirajzolása a megadott színnel.
Kitöltött alakzatok rajzolására szolgáló parancsok:
bar(x1,y1,x2,y2) -
kitöltött téglalap.
fillellipse(x,y,xfeltengely,yfeltengely)
- kitöltött ellipszis.
floodfill(x,y,keretszin) - festték öntése az [x,y]
koordinátájú pontra. A festék addig fog folyni minden irányba ettől a
ponttól, amíg nem ér el keretszín színű pontig.
cleardevice - grafikus képernyő letörlése.
imagesize(x1,y1,x2,y2) -
segítségével megállapíthatjuk a
megadott koordinátájú kép
méretét. Erre például akkor lehet
szükségünk, ha a memóriában le
szeretnénk foglalni egy ekkora területet és oda
kimásolni a képet.
getimage(x1,y1,x2,y2,bitmap) - kép másolása a grafikus képernyőről a memóriába.
putimage(x1,y1,bitmap,hogyan)
- kép kirajzolása az X, Y koordinátákra a
memóriából. A hogyan paraméter megadja,
miként szeretnénk a képet kirajzolni. Ennek
lehetséges értékei:
CopyPut XORPut
ORPut AndPut NotPut
8.3 Sin(x)
függvény kirajzolása
Az alábbi példa szemlélteti, hogyan rajzolhatjunk
ki a képernyőre a sin függvény grafikonját:
program
Pelda28;
uses graph,
wincrt;
var gd,gm: integer;
i:integer;
function IntToStr(szam:integer):string;
var szoveg:string;
begin
str(szam,szoveg);
IntToStr:=szoveg;
end;
begin
{grafika inicializalasa}
gd := d4bit;
gm := m640x480;
initgraph(gd,gm,'');
{ha hiba tortent, akkor a program leallitasa}
if graphresult<>grok then
begin
writeln('Hiba a grafika inicializalasanal.');
halt;
end;
{tengelyek kirajzolasa}
setcolor(blue);
line(100,50,100,350);
line(100,200,500,200);
settextjustify(centertext,toptext);
for i:=1 to 4 do
begin
line(90*i+100,198,90*i+100,202);
outtextxy(90*i+100,205,IntToStr(i*90));
end;
settextjustify(righttext,centertext);
for i:=-1 to 1 do
begin
line(98,90*i+200,102,90*i+200);
outtextxy(95,90*i+200,IntToStr(-i))
end;
{sin(x) kirajzolasa}
setcolor(yellow);
moveto(100,200);
for i:=0 to 360 do
lineto(i+100,trunc(sin(i*PI/180)*90+200));
{grafikus mod bezarasa}
readkey;
closegraph;
end.
Végezetül
gyakorlásképpen érdemes még
letöltenünk és átnéznünk egy analóg óra kirajzolását és animálását
megvalósító programot. Az óra
mutatóit úgy mozgatjuk a programban, hogy azt mindig
fekete színnel átrajzoljuk, majd kirajzoljuk az új
helyre:
ora.pas
|