1
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.
2
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
3
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);
4
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
nazwa:
Zmienić
własność
name na:
Zmienić
własność tekst
na:
Zmienić własność
EditLabel->Caption 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:
5
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.
6
Rys. 2 Uruchomiony program