background image

 

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. 

background image

 

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 

background image

 

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); 

background image

 

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 

Parametr a: 

LabeledEdit2 

LEb 

Parametr b: 

LabeledEdit3 

LEc 

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: 

background image

 

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. 

 

background image

 

6

 

 

Rys. 2 Uruchomiony program