10 strofoida, Instrukcja 10 - Strofoida


Instrukcja 10

Cel ćwiczenia : Napisanie aplikacji umożliwiającej rysowanie linii przybliżających strofoidę.

0x01 graphic

Rys. 1 Widok formularza z umieszczonymi komponentami

  1. Uruchomić Delphi.

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

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

const Nmax = 10000;

ppX=25;

ppY=25;

type

wym = 0..Nmax;

Tabl1 = Array[wym] of Real;

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

K,N,M,X1,Y1,ZX,ZY: Integer;

dx,dy,ds,fi,ro,sp: Real;

xw,yw,sw,px,py: Tabl1;

xx,yy,X,Y: Tabl1;

procedure Normalizacja(N,A,B: Integer; xx,yy: Tabl1;

var X,Y: Tabl1);

procedure Osie(X0,Y0,A,B: Integer; x,y: String;T: TCanvas);

procedure Pochodne(N: Integer; x,y: Tabl1; var p: Tabl1);

procedure FunSklej1(N,i: Integer; xp: Real; var yp: Real;

x,y,p: Tabl1);

procedure Obrazek;

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

procedure TForm1.Obrazek;

var

i, j: Integer;

begin

with Image1.Canvas do begin

ds:=2*Pi/3/N;

for i:=0 to N do begin

fi:=-Pi/3+i*ds;

ro:=-Cos(2*fi)/Cos(fi);

xw[i]:=ro*Cos(fi);

yw[i]:=ro*Sin(fi);

xx[i+1]:=xw[i]; yy[i+1]:=yw[i];

if i=0 then

sw[0]:=0

else begin

dx:=xw[i]-xw[i-1];

dy:=yw[i]-yw[i-1];

sw[i]:=sw[i-1]+Sqrt(dx*dx+dy*dy);

end;

end;

ZX:=Image1.Width; ZY:=Image1.Height;

Normalizacja(N+1,ZX,ZY,xx,yy,X,Y);

for i:=1 to N+1 do begin

X1:=Round(X[i]);

Y1:=Round(Y[i]);

Ellipse(X1-3,Y1-3,X1+3,Y1+3);

end;

Pochodne(N,sw,xw,px);

Pochodne(N,sw,yw,py);

K:=2;

xx[1]:=0; yy[1]:=0;

xx[2]:=xw[0]; yy[2]:=yw[0];

for i:=1 to N do begin

ds:=(sw[i]-sw[i-1])/M;

for j:=1 to M do begin

K:=K+1;

sp:=sw[i-1]+j*ds;

FunSklej1(N,i,sp,xx[K],sw,xw,px);

FunSklej1(N,i,sp,yy[K],sw,yw,py);

end;

end;

Normalizacja(K,ZX,ZY,xx,yy,X,Y);

X1:=Round(X[1]); Y1:=Round(Y[1]);

Osie(X1,Y1,ZX,ZY,'x','y',Image1.Canvas);

MoveTo(Round(X[2]),Round(Y[2]));

for i:=3 to K do

LineTo(Round(X[i]),Round(Y[i]));

end;

end;

procedure TForm1.Pochodne;

var

i: Integer;

h1,h2,dy1,dy2,mi,la: Real;

begin

for i:=1 to N-1 do begin

h1:=x[i]-x[i-1];

h2:=x[i+1]-x[i];

dy1:=y[i]-y[i-1];

dy2:=y[i+1]-y[i];

mi:=h1/(h1+h2);

la:=1-mi;

p[i]:=la*dy1/h1+mi*dy2/h2;

if i=1 then p[0]:=(1+mi)*dy1/h1-mi*dy2/h2;

if i=N-1 then p[N]:=-la*dy1/h1+(1+la)*dy2/h2;

end;

end;

procedure TForm1.FunSklej1;

var

A,B,h,t,dy: Real;

begin

h:=x[i]-x[i-1];

t:=(xp-x[i-1])/h;

dy:=y[i]-y[i-1];

A:=-2*dy/h+(p[i-1]+p[i]);

B:=-A+dy/h-p[i-1];

yp:=y[i-1]+(xp-x[i-1])*(p[i-1]+t*(B+t*A));

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;

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

  1. Umieścić na formatce komponent Button i ustawić własność Caption na Rysuj.

  1. Umieścić na formatce komponent GroupBox z palety Standard i zmienić własność Caption na Dane.

  1. Umieścić na komponencie GroupBox1 2 komponenty 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

LEN

10

Liczba węzłów interpolacji - N:

LabeledEdit2

LEM

5

Liczba punktów dodatkowych - M:

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

N:=StrToInt(LEN.Text);

M:=StrToInt(LEM.Text);

Obrazek;

end;

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

0x01 graphic

Rys. 2 Uruchomiony program

1



Wyszukiwarka