середа, 6 грудня 2017 р.

Вправа 4.2.

1.      У розіл Uses головної форми проекту додайте посилання на модуль Unit2 для доступу до класів предметної області проекта.

2.      У роздл public опису классу TForm1 додайте змінні для збереження об'єктів:
part:Particle;
 m:array[1..1000] of Molecule;
3.      Додати на головну форму проекту  Form1 панель, розмістивши її у нижній частині екрану. Для цього встановіть їй властивість Align = alBottom.
4.      У верхній частині форми встановіть компонент для відображення графіки PaintBox1. Встановіть властивість Align = alClient.
5.      На форму встановіть дві кнопки. Зробіть на них підписи «Пуст» та «Пауза».
6.      Також на форму встановіть не візуальний компонент Timer1. Встановіть йому властивості: Enabled = false, Interval = 50.
7.      Створіть обробник для події onClick кнопки «Пуск»:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin     //Кнопка "Пуск"
       part := Particle.Create(PaintBox1.Width div 2,
 PaintBox1.Height div 2,0,0,10,clRed,10);
       part.id:=1;
       Form1.PaintBox1.Canvas.Pen.Color:=Form1.PaintBox1.Color;
       part.show;
       Randomize; 
       for i := 1 to 100 do begin
          m[i]:= Molecule.Create(random(PaintBox1.Width),
random(PaintBox1.Height),
random(20)-10,random(20)-10,1);
          m[i].show;
       end;
       Timer1.Enabled:=true;
       Button1.Enabled:=false;
end;

8.      Створіть обробник для події onClick кнопки «Пауза»:
procedure TForm1.Button2Click(Sender: TObject);
begin        //Кнопка "Пауза"
       Timer1.Enabled:=not Timer1.Enabled;
end;

9.      Додайте обробник події Timer1Timer:
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
      PaintBox1.Canvas.Brush.Color:=PaintBox1.Color;
      PaintBox1.Canvas.Rectangle(0,0,
                           PaintBox1.Width,PaintBox1.Height);
      part.kick;
      part.move;
      for i := 1 to 100 do begin
          m[i].kick;
          m[i].move;
       end;
end;

10.  У файл Unit2 додайте реалізацію описів методів класів:

uses Unit1;

constructor  Body.Create(x0,y0,vx0,vy0:integer; m0:real);
begin
    x:=x0;
    y:=y0;
    m:=m0;
    vx:=vx0;
    vy:=vy0;
end;

function Body.getX:integer;
begin
    getX:=x;
end;

function Body.getY:integer;
begin
    getY:=y;
end;

Function Body.getVx:   integer;
begin
     getVx:=vx;
end;

Function Body.getVy:   integer;
begin
    getVy:=vx;
end;

Function Body.getM:    real;
begin
    getM:=m;
end;

Procedure Body.setX(x0:integer);
begin
    x:=x0;
end;

Procedure Body.setY(y0:integer);
begin

end;

Procedure Body.setVx(vx0:integer);
begin

end;

Procedure Body.setVy(vy0:integer);
begin

end;

Procedure Body.move;
begin
     hide;
     x:=x+vx;
     y:=y+vy;
     show;
end;

Procedure Particle.kick;
var i,xt,yt,vxt,vyt:integer;
    vx1,vy1,vx2,vy2,mt:real;
begin
     if (x<2) or  (x>Form1.PaintBox1.Width-1) then vx:=-1*vx;
     if (y<0) or (y>Form1.PaintBox1.Height) then vy:=-1*vy;
     for i := 1 to 100 do begin
         xt:=Form1.m[i].getX;
         yt:=Form1.m[i].getY;
         vxt:=Form1.m[i].getVx;
         vyt:=Form1.m[i].getVy;
         mt:=Form1.m[i].getM;
         if (xt=x) and (yt=y) then continue;
         if sqrt(sqr(xt-x)+sqr(yt-y))<=r then begin
                x:=x-Vx;
                y:=y-Vy;
                vx1 := Vx  * (m - mt) / (m + mt) + Vxt * (2 * mt) / (m + mt) ;
                vy1 := Vy  * (m - mt) / (m + mt) + Vyt * (2 * mt) / (m + mt) ;
                vx2 := Vxt * (mt - m) / (mt + m) + Vx  * (2 * m)  / (m + mt) ;
                vy2 := Vyt * (mt - m) / (mt + m) + Vy  * (2 * m)  / (m + mt) ;
                Vx := round(vx1);
                Vy := round(vy1);
                Form1.m[i].setVx(round(vx2));
                Form1.m[i].setVy(round(vy2));
         end;
     end;

end;


Procedure Body.kick;
begin
     if (x<2) or  (x>Form1.PaintBox1.Width-1) then vx:=-1*vx;
     if (y<0) or (y>Form1.PaintBox1.Height) then vy:=-1*vy;
end;


procedure Body.show;
begin
        Form1.PaintBox1.Canvas.Brush.Color:=clBlack;
        Form1.PaintBox1.Canvas.Ellipse(x-2,y-2,x+2,y+2);
end;

procedure Body.hide;
begin
      Form1.PaintBox1.Canvas.Brush.Color:=Form1.PaintBox1.Color;
      Form1.PaintBox1.Canvas.Ellipse(x-2,y-2,x+2,y+2);
end;

Function Particle.getR:    integer;
begin
      getR:=r;
end;

Function Particle.getColor: integer;
begin
      getColor:=color;
end;

Procedure Particle.setR(r0:integer);
begin
           r:=r0;
end;

Procedure Particle.setColor(c0:integer);
begin
     color:=c0;
end;

constructor  Particle.Create(x0,y0,vx0,vy0,r0,c0:integer; m0:real);
begin
    x:=x0;
    y:=y0;
    vx:=vx0;
    vy:=vy0;
    r:=r0;
    color:=c0;
    m:=m0;
end;

procedure Particle.show;
begin
     Form1.PaintBox1.Canvas.Brush.Color:=color;
     Form1.PaintBox1.Canvas.Ellipse(x-r,y-r,x+r,y+r);

end;

procedure Particle.hide;
begin
     Form1.PaintBox1.Canvas.Brush.Color:=Form1.PaintBox1.Color;
     Form1.PaintBox1.Canvas.Ellipse(x-r,y-r,x+r,y+r);

end;

Procedure Particle.move;
begin
     hide;
     x:=x+vx;
     y:=y+vy;
     show;
end;




Немає коментарів:

Дописати коментар