background image

 

1

Instrukcja 9 

Cel ćwiczenia : Napisanie aplikacji umożliwiającej tworzenie obrazu asteroidy 
(z efektem transformacji). 

 

 

 

Rys. 1 Widok formularza z umieszczonymi komponentami 

 

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

 

3.  W części Interface (pod uses) umieścić następujący kod: 
 

const Nmax = 10000; 
      ppX=25; 
      ppY=25; 
 
type 
  wym = 1..Nmax; 
  TablWsp = Array[wym] of Real; 
 
var 
  alfa,xp,yp,xn,yn,kx,ky,dx,dy,kpx,kpy,c,s,r,th: Real; 
  i,X0,Y0,ZX,ZY: Integer; 
  xx,yy,X,Y: TablWsp; 

 

background image

 

2

4.  W części private klasy TForm1 umieścić deklaracje zmiennych i nagłówki funkcji 

Normalizacja, Osie, Obrot: 

 

procedure Obrot(x,y,alfa: Real; var x1,y1: Real); 
procedure Normalizacja(N,A,B: Integer; xx,yy: TablWsp; 
                       var X,Y: TablWsp); 
procedure Osie(X0,Y0,A,B: Integer; x,y: String;T: TCanvas); 

 

5.  W części implementation napisać definicje funkcji: 
 

procedure TForm1.Normalizacja; 
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 
  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.Osie; 
begin 
  with T do begin 

background image

 

3

    MoveTo(0,Y0); 
    LineTo(A,Y0); 
    LineTo(A-8,Y0-3); 
    LineTo(A,Y0); 
    LineTo(A-8,Y0+3); 
    TexTout(A-15,Y0+6,x); 
    MoveTo(X0,B); 
    LineTo(X0,0); 
    LineTo(X0-3,8); 
    MoveTo(X0,0); 
    LineTo(X0+3,8); 
    TextOut(X0-11,9,y); 
  end; 
end; 

 

procedure TForm1.Obrot; 
var 
  t,c,s: Real; 
begin 
  t:=Pi*alfa/180; 
  s:=Sin(t); 
  c:=Cos(t); 
  x1:=x*c-y*s; 
  y1:=x*s+y*c; 
end; 
 

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

•  Width : 400 
•  Height : 400 

 

7.  Umieścić na formatce komponent Button i ustawić własność Caption na Rysuj. 
 
8.  Umieścić na formatce komponent GroupBox z palety Standard i zmienić własność 

Caption na Dane. 

 

9.  Umieścić na komponencie GroupBox1 8 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 

LEr 

50 

Parametr - r: 

LabeledEdit2 

LEdx 

100 

Przesunięcie - dx: 

LabeledEdit3 

LEdy 

50 

Przesunięcie - dy: 

LabeledEdit4 

LEkx 

Współczynnik skalowania - kx: 

LabeledEdit5 

LEky 

Współczynnik skalowania - ky: 

LabeledEdit6 

LEalfa 

60 

Kąt obrotu - alfa: 

LabeledEdit7 

LEkpx 

1,5 

Współczynnik odkształcenia - kpx: 

LabeledEdit8 

LEkpy 

Współczynnik odkształcenia - kpy: 

 

background image

 

4

 

10. Wygenerować zdarzenie OnClick dla komponentu Buton i wpisać następujący kod: 

 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
 
  r:=StrToFloat(LEr.Text); 
  dx:=StrToFloat(LEdx.Text); 
  dy:=StrToFloat(LEdy.Text); 
  kx:=StrToFloat(LEkx.Text); 
  ky:=StrToFloat(LEky.Text); 
  alfa:=StrToFloat(LEalfa.Text); 
  kpx:=StrToFloat(LEkpx.Text); 
  kpy:=StrToFloat(LEkpy.Text); 
 
  with Image1.Canvas do begin 
    Brush.Color:=clWhite; 
    Brush.Style:=bsSolid; 
    FillRect(Rect(0,0,Image1.Width,Image1.Height)); 
 
    for i:=1 to 360 do begin 
        th:=Pi*i/180; 
        s:=Sin(th);    c:=Cos(th); 
        xp:=r*s*s*s;   yp:=r*c*c*c; 
        xp:=xp+dx;     yp:=yp+dy; 
        xp:=kx*xp;     yp:=ky*yp; 
        Obrot(xp,yp,alfa,xn,yn); 
        xp:=xn+yn*kpx; 
        yp:=yn+xn*kpy; 
        xx[i+1]:=xp; 
        yy[i+1]:=yp 
    end; 
    xx[1]:=0;       yy[1]:=0; 
    ZX:=Image1.Width;    ZY:=Image1.Height; 
    Normalizacja(360,ZX,ZY,xx,yy,X,Y); 
    X0:=Round(X[1]);   Y0:=Round(Y[1]); 
    Osie(X0,Y0,ZX,ZY,'x','y',Image1.Canvas); 
    MoveTo(Round(X[2]),Round(Y[2])); 
    for i:=2 to 360 do 
      LineTo(Round(X[i]),Round(Y[i])); 
  end; 
end; 

 

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

 

background image

 

5

 

 

Rys. 2 Uruchomiony program