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.