Program Fv_Rajzolas;
{ -------------------------------------------------------------------------
Függvényrajzolás (Informatikai rendszerek tárgyhoz).
Teljesebb, B-változat.
Keret.
-------------------------------------------------------------------------- }
{$IFNDEF FPC -- nem FreePascal=TurboPascal}
{$f+ azért kell, hogy függvényt paraméterként adhassak át }
{$ENDIF}
Uses
{$IFNDEF FPC -- nem FreePascal=TurboPascal}
Newdelay,
{$ENDIF}
Crt,Graph;
Const
MaxN = 1024; {Maximum ennyi pontból állhat a függvény}
Hol_a_BGI=''; {a BGI-driver a program mellett; FP-nek nem kell}
{ ------------------- A kirajzolandó függvények megadása: ------------------ }
Type
TEgyValtozosFv = Record
tol,ig:Real; {A fv. értelmezési tartománya}
fv:Function(x:Real):Real; {A fv.-t kiszámoló FUNC.}
min,max:Real {A fv. értékkészlete}
End;
Function Sinx(x:Real):Real;
Begin
Sinx:=Sin(x);
End;
Function Cosx(x:Real):Real;
Begin
Cosx:=Cos(x);
End;
Function Gyokx(x:Real):Real;
Begin
Gyokx:=Sqrt(x);
End;
Function Kons3(x:Real):Real;
Begin
Kons3:=3;
End;
Const
{$IFDEF FPC -- FreePascal}
sinFv : TEgyValtozosFv=(tol:-pi; ig:pi; fv:@Sinx; min:-1.0; max:1.0);
CosFv : TEgyValtozosFv=(tol:-pi; ig:pi; fv:@Cosx; min:-1.0; max:1.0);
GyokFv: TEgyValtozosFv=(tol:0; ig:100; fv:@Gyokx; min:0.0; max:10.0);
KonsFv: TEgyValtozosFv=(tol:-75; ig:75; fv:@Kons3; min:-1; max:10);
{$ELSE -- TurboPascal}
sinFv : TEgyValtozosFv=(tol:-pi; ig:pi; fv:Sinx; min:-1.0; max:1.0);
CosFv : TEgyValtozosFv=(tol:-pi; ig:pi; fv:Cosx; min:-1.0; max:1.0);
GyokFv: TEgyValtozosFv=(tol:0; ig:100; fv:Gyokx; min:0.0; max:10.0);
KonsFv: TEgyValtozosFv=(tol:-75; ig:75; fv:Kons3; min:-1; max:10);
{$ENDIF}
{ ---------------- A függvényértékeket tartalmazó vektorok: ---------------- }
Type
TKoordinatak = Array [1..MaxN] of Real;
TFuggvenyTabla = Record
n : Integer;
x,y: TKoordinatak;
minY,maxY: Real;
End;
Var
ft: TFuggvenyTabla;
{ -------------------------- A megjelenítô ablakok: ------------------------ }
Type
TAblak = Record
bf,ja: Record x,y: Integer; End;
cimke: String;
szin : Integer;
End;
Var
a: Array [1..4] of TAblak;
szel,
mag: Integer; {Aktuális szélességük és magasságuk}
XMax,YMax,
XMin,YMin: Integer; { A teljes grafikus képernyô helye}
{ ------------------------ Egyéb globális változók: ------------------------ }
c: Char;
Procedure Inic(Const cim:String);
Var gd,gm,
i : Integer;
Begin
{$IFDEF FPC -- FreePascal;
hogy a lássuk a vezérlő ablakban is a haladást:}
ClrScr;
Writeln(cim:40+(Length(cim) Div 2));
{$ENDIF}
gd:=Detect;
InitGraph(gd,gm,Hol_a_BGI);
SetBkColor(Black);
ClearDevice;
XMax:=GetMaxX; YMax:=GetMaxY;
XMin:=0; YMin:=0;
SetColor(White);
Rectangle(XMin,YMin, XMax,YMax);
szel:=((XMax-XMin) Div 2)-4; mag:=((YMax-YMin) Div 2)-TextHeight(' ');
SetTextJustify(CenterText,TopText);
OutTextXY(szel+1,2,'Rajzoló program');
With a[1] do
Begin
bf.x:=4; bf.y:=4+TextHeight(' ');
ja.x:=szel; ja.y:=bf.y+mag-4; cimke:='1.ábra'; szin:=Red
End;
With a[2] do
Begin
bf.x:=XMax-szel; bf.y:=4+TextHeight(' ');
ja.x:=XMax-4; ja.y:=bf.y+mag-4; cimke:='2.ábra'; szin:=Blue
End;
With a[3] do
Begin
bf.x:=4; bf.y:=a[1].ja.y+8;
ja.x:=szel; ja.y:=bf.y+mag-4; cimke:='3.ábra'; szin:=Green
End;
With a[4] do
Begin
bf.x:=XMax-szel; bf.y:=a[2].ja.y+8;
ja.x:=XMax-4; ja.y:=bf.y+mag-4; cimke:='Fejlesztési lehetöség'; szin:=Yellow
End;
For i:=1 to 4 do
Begin
With a[i] do
Begin
SetColor(szin);
SetViewPort(bf.x,bf.y, ja.x,ja.y,ClipOn);
Rectangle(0,0, szel-4,mag-4);
OutTextXY(szel Div 2,1,cimke);
End;
End;
End;
Procedure Feltolt(f:TEgyValtozosFv; lep:Real; Var ft:TFuggvenyTabla);
Var x: Real;
i: Integer;
Begin
x:=f.tol; i:=1;
While x<=f.ig do
Begin
ft.x[i]:=x; ft.y[i]:=f.fv(x);
x:=x+lep; Inc(i);
End;
ft.n:=i-1; {Ennyi pontból áll a függvénytábla}
ft.minY:=f.min; ft.maxY:=f.max
End;
Procedure KoordinataTengelyek(ox,oy,xh,yh:Integer);
Var c: Integer;
Begin
c:=GetColor; SetColor(White);
Line(0,oy, xh,oy); Line(ox,0, ox,yh);
SetColor(c);
End;
Procedure KirajzolP(a:TAblak; t:TFuggvenyTabla); {Pontokbol rajzol}
Var i: Integer;
Nx,Ny: Real;
o0,s0, szel,mag: Integer;
Procedure PontRajzolas(x,y:Real);
Begin
{..}
End;
Begin {KirajzolP}
{$IFDEF FPC -- FreePascal;
hogy a lássuk a vezérlő ablakban is a haladást:}
Writeln('Rajzolás pontokkal');
{$ENDIF}
szel:=a.ja.x-a.bf.x; mag:=a.ja.y-a.bf.y-TextHeight(' ')-1;
SetViewPort(a.bf.x+2,a.bf.y+10, a.ja.x-2,a.ja.y+1,ClipOn);
SetColor(a.szin);
Nx:=(szel-2-2+1)/(t.x[t.n]-t.x[1]); Ny:=mag/(t.maxY-t.minY);
o0:=Trunc(-t.x[1]*Nx); s0:=Trunc(mag+t.minY*Ny);
KoordinataTengelyek(o0,s0,
a.ja.x-a.bf.x-4,a.ja.y-a.bf.y-TextHeight(' ')-4);
{..}
End;{KirajzolP}
Procedure KirajzolSz(a:TAblak; t:TFuggvenyTabla); {Szakaszokbol rajzol}
Var i: Integer;
Nx,Ny: Real;
eo,es,
o0,s0, szel,mag: Integer;
Procedure PontRajzolas(x,y:Real);
Begin
{..}
End;
Procedure SzakaszRajzolas(x,y:Real);
Begin
{..}
End;
Begin {KirajzolSz}
{$IFDEF FPC -- FreePascal;
hogy a lássuk a vezérlő ablakban is a haladást:}
Writeln('Rajzolás szakaszokkal');
{$ENDIF}
szel:=a.ja.x-a.bf.x; mag:=a.ja.y-a.bf.y-TextHeight(' ')-1;
SetViewPort(a.bf.x+2,a.bf.y+10, a.ja.x-2,a.ja.y+1,ClipOn);
SetColor(a.szin);
Nx:=(szel-2-2+1)/(t.x[t.n]-t.x[1]); Ny:=mag/(t.maxY-t.minY);
o0:=Trunc(-t.x[1]*Nx); s0:=Trunc(mag+t.minY*Ny);
KoordinataTengelyek(o0,s0,
a.ja.x-a.bf.x-4,a.ja.y-a.bf.y-TextHeight(' ')-4);
{..}
End;{KirajzolSz}
Procedure KirajzolT(a: TAblak; t: TFuggvenyTabla); {Teglakbol rajzol}
Var i: Integer;
Nx,Ny: Real;
Dx, o0,s0, szel,mag: Integer;
Procedure TeglaRajzolas(x,y:Real; oszlopSzel:Integer);
Begin
{..}
End;
Begin {KirajzolT}
{$IFDEF FPC -- FreePascal;
hogy a lássuk a vezérlő ablakban is a haladást:}
Writeln('Rajzolás téglalapokkal');
{$ENDIF}
szel:=a.ja.x-a.bf.x; mag:=a.ja.y-a.bf.y-TextHeight(' ')-1;
SetViewPort(a.bf.x+2,a.bf.y+10, a.ja.x-2,a.ja.y+1,ClipOn);
SetColor(a.szin); SetFillStyle(SolidFill,a.szin);
Nx:=(szel-2-2+1)/(t.x[t.n]-t.x[1]); Ny:=mag/(t.maxY-t.minY);
o0:=Trunc(-t.x[1]*Nx); s0:=Trunc(mag+t.minY*Ny);
Dx:=Trunc(szel/t.n/2);
KoordinataTengelyek(o0,s0,
a.ja.x-a.bf.x-4,a.ja.y-a.bf.y-TextHeight(' ')-4);
{..}
End;{KirajzolT}
Begin
Inic('Sin fv');
Feltolt(SinFv, 0.1, ft);
KirajzolP(a[1],ft);
c:=ReadKey;
KirajzolSz(a[2],ft);
c:=ReadKey;
KirajzolT(a[3],ft);
c:=ReadKey;
CloseGraph;
Inic('Cos fv');
Feltolt(CosFv, 0.1, ft);
KirajzolP(a[1],ft);
c:=ReadKey;
KirajzolSz(a[2],ft);
c:=ReadKey;
KirajzolT(a[3],ft);
c:=ReadKey;
CloseGraph;
Inic('Négyzetgyök fv');
Feltolt(GyokFv, 1, ft);
KirajzolP(a[1],ft);
c:=ReadKey;
KirajzolSz(a[2],ft);
c:=ReadKey;
KirajzolT(a[3],ft);
c:=ReadKey;
CloseGraph;
Inic('Konstans fv');
Feltolt(KonsFv, 1, ft);
KirajzolP(a[1],ft);
c:=ReadKey;
KirajzolSz(a[2],ft);
c:=ReadKey;
KirajzolT(a[3],ft);
c:=ReadKey;
CloseGraph;
End.