background image

 

1

Instrukcja 10 

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

 

 

 

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 = 0..Nmax; 
  Tabl1 = Array[wym] of Real; 

 
4.  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; 

background image

 

2

 
   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; 

 

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

background image

 

3

      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; 

background image

 

4

  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; 
 
 

background image

 

5

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 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 

Liczba punktów dodatkowych - M: 

 
 

10. 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. 

 

background image

 

6

 

 

Rys. 2 Uruchomiony program