Instrukcja 13
Cel ćwiczenia : Napisanie aplikacji wyświetlającej widok szachownicy
w perspektywie centralnej.
Rys. 1 Widok formularza z umieszczonymi komponentami
Uruchomić Delphi.
Przejść do widoku kodu źródłowego przyciskiem F12.
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;
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;
Zapisać projekt za pomocą opcji: File->Save Project As w wybranym katalogu.
Skopiować do katalogu projektu moduły: Obroty, Rzuty
Dodać skopiowane moduły do projektu za pomocą opcji Project->Add to Project.
Umieścić nazwy skopiowanych modułów w sekcji uses.
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;
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]);
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;
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;
Umieścić na formularzu komponent Image i ustawić następujące parametry:
Width : 400
Height : 400
Umieścić na formatce komponent Button i ustawić własność Caption na Rysuj.
Umieścić na formatce komponent GroupBox z palety Standard i zmienić własność Caption na Dane.
Umieścić na komponencie GroupBox1 6 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 |
LEx0 |
0 |
Położenie środka - x0: |
LabeledEdit2 |
LEy0 |
0 |
Położenie środka - y0: |
LabeledEdit3 |
LEz0 |
0 |
Położenie środka - z0: |
LabeledEdit4 |
LEbeta |
30 |
Kąt obrotu wokół osi y - beta: |
LabeledEdit5 |
LEgamma |
0 |
Kat obrotu wokół osi z - gamma: |
LabeledEdit6 |
LEa |
50 |
Położenie środka rzutów - a: |
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
6