background image

 

1

Instrukcja 13 

Cel ćwiczenia : Napisanie aplikacji wyświetlającej widok szachownicy  
w perspektywie centralnej. 

 

 

 

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 = 1..Nmax; 
  TablWsp = Array[wym] of Real; 
 
type PointType= record x,y: Integer end; 
     Punkty = Array[1..1000] of PointType; 
 
var 
  obrz,obry,a,be,ga,x0,y0,z0,xp,yp,zp: Real; 
  i,j,k,l,Xs,Ys,ZX,ZY: Integer; 
  xx,yy,zz,x,y: TablWsp; 
  pole: Punkty; 

 

background image

 

2

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 Osie(X0,Y0,A,B: Integer; x,y: String;T: TCanvas); 
    procedure Obrazek; 
    procedure ObrazekObr; 
    procedure FillPoly(n: Integer; A: Punkty; T: Tcanvas); 
    procedure Rysuj; 
 

5.  Zapisać projekt za pomocą opcji: File->Save Project As w wybranym katalogu. 
 
6.  Skopiować do katalogu projektu moduły: Obroty, Rzuty 

 

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

 

 

 

8.  Umieścić nazwy skopiowanych modułów w sekcji uses. 
 

 

 

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

procedure TForm1.FillPoly; 
var i,xsr,ysr: Integer; 
    xs,ys:real; 
var  P:Array[1..50] of TPoint; 
begin 
  for i:=1 to n do begin 
      P[i].x:=A[i].x; 
      P[i].y:=A[i].y; 
  end; 
  T.Polygon(Slice(P,n)); 
end; 
 
procedure TForm1.Obrazek; 

background image

 

3

begin 
  for i:=0 to 8 do begin 
      xp:=40-10*i; 
      for j:=0 to 8 do begin 
          yp:=10*j-40; 
          k:=9*i+j+1; 
          xx[k]:=x0+xp; 
          yy[k]:=y0+yp; 
          zz[k]:=z0; 
      end; 
  end; 
end; 
 
procedure TForm1.ObrazekObr; 
begin 
 with Form1.Image1.Canvas do begin 
  for k:=1 to 81 do begin 
      Obrot(xx[k],yy[k],ga,xp,yp); 
      xx[k]:=xp;   yy[k]:=yp 
  end; 
  for k:=1 to 81 do begin 
      Obrot(zz[k],xx[k],be,zp,xp); 
      zz[k]:=zp;   xx[k]:=xp 
  end; 
  for k:=0 to 81 do begin 
      RzutCentr(yp,zp,xx[k],yy[k],zz[k],a); 
      yy[k]:=yp;   zz[k]:=zp 
  end; 
  xx[82]:=0;    yy[82]:=0;    zz[82]:=0; 
  ZX:=Image1.Width;         ZY:=Image1.Height; 
  Normalizacja(82,ZX,ZY,yy,zz,x,y); 
  Xs:=Round(x[82]);   Ys:=Round(y[82]); 
  Form1.Image1.Canvas.Pen.Color:=clBlue; 
  Osie(Xs,Ys,ZX,ZY,'y','z',Image1.Canvas); 
  Form1.Image1.Canvas.Pen.Color:=clBlack; 
  Form1.Image1.Canvas.Brush.Color:=clRed; 
  for j:=0 to 8 do begin 
      k:=9*j+1;   l:=9*(j+1); 
      MoveTo(Round(x[k]),Round(y[k])); 
      LineTo(Round(x[l]),Round(y[l])); 
  end; 
  for i:=0 to 8 do begin 
      k:=i+1;   l:=i+73; 
      MoveTo(Round(x[k]),Round(y[k])); 
      LineTo(Round(x[l]),Round(y[l])); 
  end; 
  for j:=1 to 8 do 
  for i:=1 to 8 do begin 
      k:=i+j; 
      pole[1].X:=Round(X[9*(j-1)+i]); 

background image

 

4

      pole[2].X:=Round(X[9*(j-1)+i+1]); 
      pole[3].X:=Round(X[9*j+i+1]); 
      pole[4].X:=Round(X[9*j+i]); 
      pole[5].X:=pole[1].X; 
      pole[1].Y:=Round(Y[9*(j-1)+i]); 
      pole[2].Y:=Round(Y[9*(j-1)+i+1]); 
      pole[3].Y:=Round(Y[9*j+i+1]); 
      pole[4].Y:=Round(Y[9*j+i]); 
      pole[5].Y:=pole[1].Y; 
      if k/2 = k div 2 then FillPoly(5,pole,Image1.Canvas); 
  end; 
 end; 
end; 
 
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 
  else begin 
     Ky:=B/Sy; 
     Kx:=Ky/G 
  end; 
  for i:=1 to N do begin 
     X[i]:=Kx*X[i]+ppX; 

background image

 

5

     Y[i]:=Ky*Y[i]+ppY; 
  end; 
end; 
 
procedure TForm1.Osie; 
begin 
  with T do begin 
    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.Rysuj; 
begin 
  Form1.Image1.Canvas.Brush.Color:=clWhite; 
  Form1.Image1.Canvas.Brush.Style:=bsSolid; 
  Form1.Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height)); 
  x0:=StrToFloat(LEx0.Text); 
  y0:=StrToFloat(LEy0.Text); 
  z0:=StrToFloat(LEz0.Text); 
  be:=strtofloat(LEbeta.Text); 
  ga:=StrToFloat(LEgamma.Text); 
  a :=StrToFloat(LEa.Text); 

              Obrazek; 

  ObrazekObr; 
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 6 komponentów LabeledEdit z palety 

Additional i ustawić parametry według następujących wskazówek: 

 

background image

 

6

Domyslna 

nazwa: 

Zmienić 

własność 
name na: 

Zmienić 

własność tekst 

na: 

Zmienić własność  

EditLabel->Caption na: 

LabeledEdit1 

LEx0 

Położenie środka - x0: 

LabeledEdit2 

LEy0 

Położenie środka - y0: 

LabeledEdit3 

LEz0 

Położenie środka - z0: 

LabeledEdit4 

LEbeta 

30 

Kąt obrotu wokół osi y - beta: 

LabeledEdit5 

LEgamma 

Kat obrotu wokół osi z - gamma: 

LabeledEdit6 

LEa 

50 

Położenie środka rzutów - a: 

 
 

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

 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Rysuj; 
end; 

 

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

 

 

 

Rys. 2 Uruchomiony program