Instrukcja 9
Cel ćwiczenia : Napisanie aplikacji umożliwiającej tworzenie obrazu asteroidy (z efektem transformacji).
Rys. 1 Widok formularza z umieszczonymi komponentami
Uruchomić Delphi.
Przejść do widoku kodu źródłowego przyciskiem F12.
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;
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);
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
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;
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 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 |
2 |
Współczynnik skalowania - kx: |
LabeledEdit5 |
LEky |
3 |
Współczynnik skalowania - ky: |
LabeledEdit6 |
LEalfa |
60 |
Kąt obrotu - alfa: |
LabeledEdit7 |
LEkpx |
1,5 |
Współczynnik odkształcenia - kpx: |
LabeledEdit8 |
LEkpy |
1 |
Współczynnik odkształcenia - kpy: |
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.
Rys. 2 Uruchomiony program
1