Instrukcja 14

Cel ćwiczenia : Napisanie aplikacji umożliwiającej wizualizację powierzchni określonych funkcją dwóch zmiennych.

Rys. 1 Widok formularza z umieszczonymi komponentami 1. Uruchomić Delphi.

2. Przejść do widoku kodu źródłowego przyciskiem F12.

3. W sekcji Interface (pod uses) umieścić następujący kod: const Nmax = 10000;

type

wym = 0..Nmax;

TablWsp = Array[wym] of Real;

var

i,j,r,K,L,Nx,Ny,P,X0,Y0,ZX,ZY: Integer;

a,b,c,delta,epsilon,xmin,xmax,ymin,ymax,

dx1,dy1,dx2,dy2,xp,yp,zp: Real;

xx,yy,zz,X,Y: TablWsp;

4. W części private klasy TForm1 umieścić nagłówki funkcji: procedure Normalizacja(N,A,B: Integer; xx,yy: TablWsp; var X,Y: TablWsp);

procedure Obrazek;

5. Zapisać projekt za pomocą opcji: File->Save Project As w wybranym katalogu.

1

6. Skopiować do katalogu projektu moduł Rzuty.

7. Dodać skopiowany moduł do projektu za pomocą opcji Project->Add to Project.

8. Umieścić nazwę skopiowanego modułu w sekcji uses.

9. W części implementation napisać definicje funkcji: procedure TForm1.Normalizacja;

const

ppX=25;

ppY=25;

var

i: Integer;

dX,dY,G,Kx,Ky,xmin,xmax,ymin,ymax,Sx,Sy: Real; begin

A:=A-2*ppx; B:=B-2*ppY;

xmin:=xx[1]; xmax:=xx[1];

ymin:=yy[1]; ymax:=yy[1];

for i:=2 to N do begin

if xx[i] < xmin then xmin:=xx[i];

if xx[i] > xmax then xmax:=xx[i];

if yy[i] < ymin then ymin:=yy[i];

if yy[i] > ymax then ymax:=yy[i];

end;

Sx:=xmax-xmin;

Sy:=ymax-ymin;

for i:=1 to N do begin

X[i]:=xx[i]-xmin;

Y[i]:=Abs(yy[i]-ymin-Sy);

end;

G:=1;

dX:=A-Sx;

dY:=B-Sy;

if dX/A <= dY/B then begin

Kx:=A/Sx;

Ky:=G*Kx;

end

2

else begin

Ky:=B/Sy;

Kx:=Ky/G

end;

for i:=1 to N do begin

X[i]:=Kx*X[i]+ppX;

Y[i]:=Ky*Y[i]+ppY;

end;

end;

procedure TForm1.Obrazek;

begin

with Image1.Canvas do begin

if RBfun1.Checked then begin

xmin:=-1.5; xmax:=1.5;

ymin:=-1.5; ymax:=1.5;

end;

if RBfun2.Checked then begin

xmin:=-Pi; xmax:=Pi;

ymin:=-Pi; ymax:=Pi;

end;

dx1:=(xmax-xmin)/K;

dy1:=(ymax-ymin)/L;

dx2:=(xmax-xmin)/Nx;

dy2:=(ymax-ymin)/Ny;

P:=0;

for i:=0 to K do begin

xp:=xmin+i*dx1;

for j:=0 to Ny do begin

yp:=ymin+j*dy2;

P:=P+1; xx[P]:=xp; yy[P]:=yp;

if RBfun1.Checked then

zz[P]:=a*Exp(-b*(xp*xp+yp*yp))

else

zz[P]:=Sin(c*Sqrt(xp*xp+yp*yp));

end;

end;

for j:=0 to L do begin

yp:=ymin+j*dy1;

for i:=0 to Nx do begin

xp:=xmin+i*dx2;

P:=P+1; xx[P]:=xp; yy[P]:=yp;

if RBfun1.Checked then

zz[P]:=a*Exp(-b*(xp*xp+yp*yp))

else

zz[P]:=Sin(c*Sqrt(xp*xp+yp*yp));

end;

end;

for r:=1 to P do begin

RzutAkson(yp,zp,xx[r],yy[r],zz[r],delta,epsilon); 3

yy[r]:=yp; zz[r]:=zp

end;

xx[P+1]:=0; yy[P+1]:=0; zz[P+1]:=0;

ZX:=Image1.Width; ZY:=Image1.Height;

Normalizacja(P+1,ZX,ZY,yy,zz,X,Y);

X0:=Round(X[P+1]); Y0:=Round(Y[P+1]);

r:=0;

for i:=0 to K do begin

r:=r+1;

MoveTo(Round(X[r]),Round(Y[r]));

for j:=1 to Ny do begin

r:=r+1;

LineTo(Round(X[r]),Round(Y[r]));

end;

end;

for j:=0 to L do begin

r:=r+1;

MoveTo(Round(X[r]),Round(Y[r]));

for i:=1 to Nx do begin

r:=r+1;

LineTo(Round(X[r]),Round(Y[r]));

end;

end;

end;

end;

10. Umieścić na formularzu komponent Image i ustawić następujące parametry:

• Width : 400

• Height : 400

11. Umieścić na formatce komponent Button i ustawić własność Caption na Rysuj.

12. Umieścić na formatce komponent GroupBox z palety Standard i zmienić własność Caption na Dane.

13. Umieścić na komponencie GroupBox1 9 komponentów LabeledEdit z palety Additional i ustawić parametry według następujących wskazówek: Domyslna

Zmienić

Zmienić

Zmienić własność

nazwa:

własność

własność tekst

EditLabel->Caption na:

name na:

na:

LabeledEdit1

LEa

1

Parametr a:

LabeledEdit2

LEb

1

Parametr b:

LabeledEdit3

LEc

1

Parametr c:

LabeledEdit4

LEK

15

Liczba linii K:

LabeledEdit5

LEL

15

Liczba linii L:

LabeledEdit6

LENx

50

L. punktów Nx:

LabeledEdit7

LENy

50

L. punktów Ny:

LabeledEdit8

LEdelta

30

Kąt rzutowania ukośnego - delta:

4

LabeledEdit9

LEepsilon

-30

Kąt rzutowania ukośnego - epsilon:

14. Umieścić na komponencie GroupBox1 2 komponenty RadioButton i ustawić parametry według następujących wskazówek:

Domyslna nazwa:

Zmienić własność name na:

Zmienić własność Caption na:

RadioButton1

RBfun1

Funkcja 1

RadioButton2

RBfun2

Funkcja 2

15. Dla komponentu RBfun1 własność Checked ustawic na True.

15. Wygenerować zdarzenie OnClick dla komponentu Buton i wpisać następujący kod: procedure TForm1.Button1Click(Sender: TObject); begin

Form1.Image1.Canvas.Brush.Color:=clWhite;

Form1.Image1.Canvas.Brush.Style:=bsSolid;

Form1.Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height)); k:=StrToInt(LEK.Text);

l:=StrToInt(LEL.Text);

Nx:=StrToInt(LENx.Text);

Ny:=StrToInt(LENy.Text);

delta:=StrToFloat(LEdelta.Text);

epsilon:=StrToFloat(LEepsilon.Text);

if RBfun1.Checked then begin

a:=StrToFloat(LEa.Text);

b:=StrToFloat(LEb.Text);

end;

if RBfun2.Checked then

c:=StrToFloat(LEc.Text);

Obrazek;

end;

15. Skompilować i uruchomić program przyciskiem F9 na klawiaturze komputera.

5

Rys. 2 Uruchomiony program

6