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