Ha rajzolni szeretnénk a képernyõre, akkor azt át kell kapcsolnunk grafikus üzemmódba. A grafikus képernyõn külön-külön hozzáférhetünk az egyes képpontokhoz. Ismernünk kell (illetve bizonyos határok között meghatározhatjuk) a képernyõnk felbontását (a VGA üzemmódban a legnagyobb felbontás 640x480) valamint azt, hogy hány színt használhatunk (az elõbb említett felbontásnál 16 színt). A (0, 0) képpont a képernyõ bal felsõ sarkában található.
Az egység fontosabb eljárásai, függvényei, típusai, konstansai:
A grafikus képrnyõ inicializálása (átkapcsolás karakteres képernyõrõl grafikusra), bezárása:
Eljárások: InitGraph, DetectGraph, CloseGraph, stb.
Függvények: GraphResult, stb.
Konstansok: grafikus meghajtók (Pl. Detect = 0, CGA = 1 stb.); grafikus üzemmódok (pl. VGALo, VGAMed, VGAHi stb.)
Pl.:
uses Graph;
var Meghajto, Uzemmod: integer;
begin
Meghajto := Detect; {Automatikusan beállítja grafikus üzemmódot a legnagyobb felbontással.}
InitGraph(Meghajto, Uzemmod, 'C:\TP70\BGI'); {Inicializálás}
If GraphResult <> 0 then
begin
WriteLn('Grafikus hiba!'); {Nem sikerült az inicializálás, kilépés a programból}
ReadLn;
Halt
end;
...{Grafika használata}
CloseGraph {Grafikus képernyõ bezárása}
end
Színek: Konstansok: 16 színû üzemmódban megegyeznek a Crt unit konstansaival.
Eljárások: SetColor, SetBkColor, stb.
Függvények: GetColor, GetBkColor, stb.
Rajz: Típusok: LineSettingsType (ld. GetLineSettings), stb.
Konstansok: vonalstílus (pl. SolidLn, DottedLn, stb. ld. SetLineStyle), vonalvastagság ( NormWidth. ThickWidth ld. ld. SetLineStyle), rajzolási mód (pl. CopyPut, XorPut, stb. ld. SetWritMode)
Eljárások: PutPixel, Line, LineTo, LineRel, Circle, Rectangle,SetLineStyle,GetLineSettings, SetWriteMode, stb.
Kitöltött rajz: Típusok: FillSettingsType (ld. GetFillSettings), stb.
Konstansok: kitöltési stílus (pl. SolidFill, LineFill, stb. ld. SetFillStyle)
Eljárások: Bar, Bar3D, FillEllipse, FloodFill, SetFillStyle, GetFillSettings,
Szöveg: Típusok: TextSettingsType (ld. GetTextSettings), stb.
Konstansok: betûtípus, szövegállás, szövegigazítás
Eljárások: OutText, OutTextXY, SetTextStyle, GetTextSettings stb.
Kurzor: Függvények: GetX, GetY, stb.
Eljárások: MoveTo, MoveRel, stb.
Egyéb: Kép mentése egy változóba, visszatöltése: ImageSize, GetImage, PutImage.
Példa: 1. Kérjük be grafikus képernyõn egy parabola és egy egyenes egyenletét. Ábrázoljuk a görbéket, és metszéspontjaikat határozzuk meg grafikusan valamint analitikusan. A program tegye lehetõvé, hogy a le- ill. felfele nyíllal Y irányban mozgathassuk az egyenest, a jobbra ill. balra nyíllal a meredekségét változtathassuk, a PgUp ill. PgDn billentyûkkel pedig a koordinátarendszer méretarányát (képpont/egység) változtathassuk.
Megoldás: Graph unit - példaprogram
program GraphPl;
uses Crt, Graph;
var dr, mo, h, px1, px2, py1, py2: integer;
x1, x2, y1, y2, a, b, c, d, m, n: real;
s1, s2: string[6];
k: char;
{Grafikus kepernyõn adatbevitel az x változóba.}
procedure Beolvas(var x: real);
var hiba, xx: integer;
ch: char;
s: string;
begin
s[0] := #0;
xx:= GetX;
repeat
ch := ReadKey; {Egy karakter leütése.}
SetColor(yellow);
if (ch in ['0'..'9']) or (ch in ['.','-']) then
begin
OutText(ch); {A karakter megjelenítése, ha számjegy, elõjel vagy tizedespont.}
s := s + ch; {A karakter hozzáfûzése.}
end;
{Torles}
if (ch = #8) and (s[0] > #0) then
begin
MoveTo(xx, GetY); SetColor(black); OutText(s);
s[0] := Chr( Ord(s[0]) - 1 );
MoveTo(xx, gety); SetColor(yellow); OutText(s);
end;
until ch = #13; {ENTER-re adatbevitel vége}
Val(s, x, hiba); {Az s string konvertálása valóssá, elhelyezése az x változóban.}
end;
{Koordinátarendszer kirajzolása.}
procedure Koord;
var i: integer;
begin
Line(0, 240, 640, 240); Line(320, 0, 320, 480);
Line(315, 5, 320, 0); Line(320, 0, 325, 5);
Line(635, 235, 640, 240); Line(635, 245, 640, 240);
for i := 0 to 640 div h do Line(h * i, 238, h * i, 242);
for i := 1 to 480 div h do Line(318, h * i, 322, h * i);
OutTextXY(624, 228, 'x'); OutTextXY(325, 10, 'y');
end;
{A parabola és az egyenes kirajzolása.}
procedure FvRajzolas;
var px, py: integer;
x, y: real;
begin
for px := 0 to 639 do {Az x tengely minden pixelénél a függvényértékek }
begin { kiszámítása, megjelenítése.}
x := (px - 320) / h; {A pixelértékhez x független változó érték rendelése.}
y := a*x*x + b*x + c; {Az y függõ változó kiszámítása.}
py:=Round(-h*y + 240); {Az y függõ változóhoz pixel érték rendelése.}
PutPixel(px, py, red); {Megjelenítés}
y:=m*x + n;
py:=Round(-h*y + 240);
PutPixel(px, py, green);
end;
end;
{Az egyenes és a parabola metszési egyenletének a megoldása.}
procedure Metszes;
begin
d := sqr(b-m) - 4*a*(c-n);
if d < 0.0 then OutTextXY(50, 50, 'Nincs gy”k!')
else
if d > 0.0 then
begin
x1 := ( -(b-m) + Sqrt(d) ) /2/a;
x2 := ( -(b-m) - Sqrt(d) ) /2/a;
y1 := m*x1 + n;
y2 := m*x2 + n;
px1 := Round(h*x1 + 320);
px2 := Round(h*x2 + 320);
py1 := Round(-h*y1 + 240);
py2 := Round(-h*y2 + 240);
SetLineStyle(1, 0, 1);
Line(px1, py1, px1, 240);
Line(px2, py2, px2, 240);
Str(x1:6:2, s1);
Str(x2:6:2, s2);
OutTextXY(50, 50, 'A k‚t gy”k:'+s1+' ; '+s2)
end
else
begin
x1 := -(b-m) /2/a;
y1 := m*x1 + n;
px1 := Round(h*x1 + 320);
py1 := Round(-h*y1 + 240);
SetLineStyle(1, 0, 1);
Line(px1, py1, px1, 240);
Str(x1:6:2, s1);
OutTextXY(50, 50, 'A gy”k:'+s1)
end;
end;
{A függvények és a metszéspontok törlése.}
procedure Torles;
var px, py: integer;
x, y: real;
begin
for px := 0 to 640 do
begin
x := (px-320) / h;
y := m*x + n;
py := Round(-h*y + 240);
PutPixel(px, py, black);
y := a*x*x + b*x + c;
py := Round(-h*y + 240);
PutPixel(px, py, black);
end;
SetColor(black);
SetLineStyle(0, 0, 1);
Koord;
if d < 0 then begin SetColor(0); OutTextXY(50, 50, 'Nincs gy”k!') end
else
if d > 0 then
begin
SetColor(black);
Line(px1, py1, px1, 240);
Line(px2, py2, px2, 240);
OutTextXY(50, 50, 'A k‚t gy”k:'+s1+' ; '+s2)
end
else
begin
SetColor(black);
Line(px1, py1, px1, 240);
OutTextXY(50, 50, 'A gy”k:'+s1)
end;
end;
begin
{Inicializálás}
h := 40; {A koordinátarendszer egysége 40 képpont.}
dr := 0;
InitGraph(dr, mo, 'c:\bp\bgi');
SetColor(yellow);
SetLineStyle(0, 0, 1);
Koord;
{A parabola és az egyenes egyenletének beolvasása.}
MoveTo(50, 40); OutText('A parabola egyenlete:');
MoveTo(50, 70); OutText('a: '); Beolvas(a);
MoveTo(50, 90); OutText('b: '); Beolvas(b);
MoveTo(50, 110); OutText('c: '); Beolvas(c);
MoveTo(50, 140); OutText('Az egyenes egyenlete:');
MoveTo(50, 170); OutText('m: '); Beolvas(m);
MoveTo(50, 190); OutText('n: '); Beolvas(n);
ClearDevice;
{Ismétlés az ESC bill. leütéséig.}
repeat
setcolor(yellow);
setlinestyle(0,0,1);
Koord;
FvRajzolas;
Metszes;
k := ReadKey; {Várakozás egy billentyû leütésére, kód beolvasása.}
if k = #0 then {Kettõs kódú billentyû (kurzormozgató)}
begin
k := ReadKey; {Második kód beolvasása.}
Torles;
case k of
#72: n := n + 0.2; {Felfele nyíl: az egyenes eltolása y irányban felfelé.}
#80: n := n - 0.2; {Lefele nyíl: az egyenes eltolása y irányban lefelé.}
#77: m := m + 0.1; {Jobbra nyíl: az egyenes meredekségének növelése.}
#75: m := m - 0.1; {Balra nyíl: az egyenes meredekségének csökkentése.}
#73: h := h * 2; {PgUp: lépték növelése.}
#81: h := Round(h / 2); {PgDn: lépték csökkentése.}
end; {case}
end {if}
until k = #27; {Kilépés ESC-re.}
CloseGraph;
end.