, . 2.1.3. Form1 Shape1 Shape2, Timer1 6 . 2.4. Shape1 Shape2 , .
Timer.Enabled True, Form1.BorderStyle, bsSingle .
Shape1 |
Shape2 |
Timer1 |
Button1 |
Button2 |
Button3 |
Button4 |
Button5 |
Button6 |
2.4
, , . 2.1.3, . (). Pascal:
type TMeh1 = record
Nx: shortint; // x
// (-1 - , 0 - ,+1 - )
Ny: shortint; // y
// (-1 , 0 - ,+1 - )
vx: real; // x
vy: real; // y
x1: real; // x
y1: real; // y
end;
type TMeh2 = record
Ny: shortint; // y
// (-1 , 0 - ,+1 - )
vy: real; // y
y2: real; // y
end;
TMeh1 TMeh2 1 2 :
var
Meh1: TMeh1;
Meh2: TMeh2;
D: real;
LeftMin, TopMin:integer;
D (2.2). LeftMin LeftMax Shape1, 1 ( 2.3).
, , :
const
L = 10; // 1,
H = 5; // 1,
d1 = 1; // 1,
d2 = 0.7; // 2,
h1 = 3; // 1,
h2 = 1; // 2,
a1max = 1.5; // 1, /2
a2max = 4; // 2, /2
v1ust = 1; // 1, /
v2ust = 0.6; // 2, /
OnCreate . D Shape1 Shape2.
procedure TForm1.FormCreate(Sender: TObject);
var
Xmax, Ymax, Dx, Dy: real;
begin
// 1
Meh1.Nx:=0;
Meh1.Ny:=0;
Meh1.vx:=0;
Meh1.vy:=0;
Meh1.x1:=0;
Meh1.y1:=0;
// 2
|
|
Meh2.Ny:=0;
Meh2.vy:=0;
Meh2.y2:=0;
//
Xmax:=L+d1+d2;
Ymax:=H+h1;
Dx:=(90-10)/100*Form1.ClientWidth/Xmax;
Dy:=(70-10)/100*Form1.ClientHeight/Ymax;
if (Dy>Dx) then
begin
D:=Dx;
end
else
begin
D:=Dy;
end;
// Shape
Shape1.Width:=round(D*d1);
Shape1.Height:=round(D*h1);
Shape2.Width:=round(D*d2);
Shape2.Height:=round(D*h2);
//
LeftMin:=round(10/100*Form1.ClientWidth);
TopMin:=round(10/100*Form1.ClientHeight);
// Shape
Risovanie();
end;
, Shape LeftMin TopMin round(), .
Shape Risovanie, (2.3) (2.4). Form1.OnCreate. (. ).
procedure Risovanie();
begin
Form1.Shape1.Left:=round(D*Meh1.x1+LeftMin);
Form1.Shape1.Top:=round(D*Meh1.y1+TopMin);
Form1.Shape2.Left:=round(D*(Meh1.x1+d1)+LeftMin);
Form1.Shape2.Top:=round(D*(Meh1.y1+Meh2.y2)+TopMin);
end;
, OnMouseDown , OnMouseUp . ( Meh1.Nx, Meh1.Ny, Meh2.Ny), . :
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Nx:=+1; // 1
end;
procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Nx:=-1; // 1
end;
procedure TForm1.Button3MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Ny:=-1; // 1
end;
procedure TForm1.Button4MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Ny:=+1; // 1
end;
procedure TForm1.Button5MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh2.Ny:=-1; // 2
end;
procedure TForm1.Button6MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh2.Ny:=+1; // 2
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Nx:=0; // 1
end;
procedure TForm1.Button2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Nx:=0; // 1
end;
procedure TForm1.Button3MouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Ny:=0; // 1
end;
procedure TForm1.Button4MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh1.Ny:=0; // 1
end;
procedure TForm1.Button5MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh2.Ny:=0; // 2
end;
procedure TForm1.Button6MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Meh2.Ny:=0; // 2
end;
OnTimer Timer1 , , .
1 x 2.5. Nx +1. a1max. . v1ust, 0 1 . Nx 0, . , . x 2.6.
Meh1.Nx = +1 |
Meh1.Nx = 0 |
a = +a1max |
a = 0 |
a = -a1max |
v = +v1ust |
t |
Meh1.Nx = 0 |
Meh1.Nx = +1 |
a:= +a1max |
a:= -a1max |
Meh1.vx >= v1ust |
a:= 0 |
Meh1.vx <= -v1ust |
a:= 0 |
a:= 0 Meh1.vx:=0 |
2 |
1 |
3 |
. . |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
((Meh1.x1>=L) and (Meh1.Nx>=0)) or ((Meh1.x1<=0) and (Meh1.Nx<=0)) |
2 |
Meh1.vx:=Meh1.vx + a∙∆t Meh1.x1:=Meh1.x1 + Meh1.vx ∙∆t |
1 y |
2 y |
Risovanie(); |
Shape |
2 |
, |
Meh1.vx > 0 |
a:= -a1max |
a:= +a1max |
Meh1.vx <= 0.01×v1ust |
a:= 0 Meh1.vx:=0 |
Meh1.vx >= -0.01×v1ust |
a:= 0 Meh1.vx:=0 |
3 |
2.6
1 y 0<Meh1.y1<H 2 y 0<Meh2.y2<h1.
, 2.6, . , , , . 1-9 ( 2.6).
1. OnTimer. Timer1 . Events. OnTimer:
|
|
procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;
2. a:
procedure TForm1.Timer1Timer(Sender: TObject);
var
a:real;
begin
end;
3. 1 ( 2.6). begin-end else. , .
procedure TForm1.Timer1Timer(Sender: TObject);
var
a:real;
begin
if Meh1.Nx=0 then
begin //
end
else
begin //
end;
end;
4. 2 , . , .
begin
if Meh1.Nx=0 then
begin //
end
else
begin //
if Meh1.Nx=+1 then
begin //
end
else
begin //
end;
end;
end;
6. 3, 4 5:
begin
if Meh1.Nx=0 then
begin //
end
else
begin //
if Meh1.Nx=+1 then
begin //
end
else
begin //
a:=-a1max;
if Meh1.vx<=-v1ust then
begin //
a:=0;
end; { // else
else
begin //
end; }
end;
end;
end;
7. 6, 7 8:
begin
if Meh1.Nx=0 then
begin //
end
else
begin //
if Meh1.Nx=+1 then
begin //
a:=+a1max;
if Meh1.vx>=v1ust then
begin //
a:=0;
end;
end
else
begin //
a:=-a1max;
if Meh1.vx<=-v1ust then
begin //
a:=0;
end; { // else
else
begin //
end; }
end;
end;
end;
. x :
begin
if Meh1.Nx=0 then
begin //
if Meh1.vx>0 then
begin //
a:=-a1max;
if Meh1.vx<=0.01*v1ust then
begin //
a:=0;
Meh1.vx:=0;
end;
end
else
begin //
a:=+a1max;
if Meh1.vx>=-0.01*v1ust then
begin //
a:=0;
Meh1.vx:=0;
end;
end;
end
else
begin //
if Meh1.Nx=+1 then
begin //
a:=+a1max;
if Meh1.vx>=v1ust then
begin //
a:=0;
end;
end
else
begin //
a:=-a1max;
if Meh1.vx<=-v1ust then
begin //
a:=0;
end; { // else
else
begin //
end; }
end;
end;
//
if ((Meh1.x1>=L) and (Meh1.Nx>=0)) or ((Meh1.x1<=0) and (Meh1.Nx<=0)) then
begin //
a:=0;
Meh1.vx:=0;
end;
// . x 1
Meh1.vx:=Meh1.vx + a*0.01;
Meh1.x1:=Meh1.x1 + Meh1.vx*0.01;
// Shape
Risovanie();
end;
1 .
OnTimer :
procedure TForm1.Timer1Timer(Sender: TObject);
var
a:real;
begin
if Meh1.Nx=0 then
begin //
if Meh1.vx>0 then
begin //
a:=-a1max;
if Meh1.vx<=0.01*v1ust then
begin //
a:=0;
Meh1.vx:=0;
end;
end
else
begin //
a:=+a1max;
if Meh1.vx>=-0.01*v1ust then
begin //
a:=0;
Meh1.vx:=0;
end;
end;
end
else
begin //
if Meh1.Nx=+1 then
|
|
begin //
a:=+a1max;
if Meh1.vx>=v1ust then
begin //
a:=0;
end;
end
else
begin //
a:=-a1max;
if Meh1.vx<=-v1ust then
begin //
a:=0;
end; { // else
else
begin //
end; }
end;
end;
//
if ((Meh1.x1>=L) and (Meh1.Nx>=0)) or ((Meh1.x1<=0) and (Meh1.Nx<=0)) then
begin //
a:=0;
Meh1.vx:=0;
end;
// e . x 1
Meh1.vx:=Meh1.vx + a*0.01;
Meh1.x1:=Meh1.x1 + Meh1.vx*0.01;
// -------------------- 1 y -----------------------------------
if Meh1.Ny=0 then
begin //
if Meh1.vy>0 then
begin //
a:=-a1max;
if Meh1.vy<=0.01*v1ust then
begin //
a:=0;
Meh1.vy:=0;
end;
end
else
begin //
a:=+a1max;
if Meh1.vy>=-0.01*v1ust then
begin //
a:=0;
Meh1.vy:=0;
end;
end;
end
else
begin //
if Meh1.Ny=+1 then
begin //
a:=+a1max;
if Meh1.vy>=v1ust then
begin //
a:=0;
end;
end
else
begin //
a:=-a1max;
if Meh1.vy<=-v1ust then
begin //
a:=0;
end;
end;
end;
//
if ((Meh1.y1>=H) and (Meh1.Ny>=0)) or ((Meh1.y1<=0) and (Meh1.Ny<=0)) then
begin //
a:=0;
Meh1.vy:=0;
end;
// e . y 1
Meh1.vy:=Meh1.vy + a*0.01;
Meh1.y1:=Meh1.y1 + Meh1.vy*0.01;
// -------------------- 2 y -----------------------------------
if Meh2.Ny=0 then
begin //
if Meh2.vy>0 then
begin //
a:=-a2max;
if Meh2.vy<=0.01*v2ust then
begin //
a:=0;
Meh2.vy:=0;
end;
end
else
begin //
a:=+a2max;
if Meh2.vy>=-0.01*v2ust then
begin //
a:=0;
Meh2.vy:=0;
end;
end;
end
else
begin //
if Meh2.Ny=+1 then
begin //
a:=+a2max;
if Meh2.vy>=v2ust then
begin //
a:=0;
end;
end
else
begin //
a:=-a2max;
if Meh2.vy<=-v2ust then
begin //
a:=0;
end;
end;
end;
//
if ((Meh2.y2>=(h1-h2)) and (Meh2.Ny>=0)) or ((Meh2.y2<=0) and (Meh2.Ny<=0)) then
begin //
a:=0;
Meh2.vy:=0;
end;
// e . y 1
Meh2.vy:=Meh2.vy + a*0.01;
Meh2.y2:=Meh2.y2 + Meh2.vy*0.01;
// Shape
Risovanie();
end;