Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2011, 00:07   #1
ryashya
Новичок
Джуниор
 
Регистрация: 16.11.2010
Сообщений: 1
По умолчанию Движение объектов используя классы

как сделать эту программу с помощью классов?

Код:
program Billiard;
{ Моделируем упругие столкновение шаров }
uses
Graph, Crt;
const
BgiPath = 'd:\pascal\bgi';
Nn = 40; { число шаров }
r = 12; { радиус шара }
d = 2*r; { диаметр шара }
d_2 = d*d; { квадрат диаметра }
doubled_2 = 4*d_2; { квадрат двойного диаметра }
Vmax = 0.2; { амплитуда скорости }
tau = r/3/Vmax; { шаг по времени }
TimeDelay = 0; { задержка по времени }
type
TData = Extended;
TBall = record
X, Y: TData;
Xold, Yold: TData;
Vx, Vy: TData;
dVx, dVy: TData;
Color : Integer;
end;
var
Balls : array [1..Nn] of TBall;
N : Integer; { реальное число шаров }
procedure GraphBegin;
var
Gd, Gm: Integer;
Begin;
Gd:= Detect;
InitGraph (Gd, Gm, BgiPath);
End; { GraphBegin }
procedure DrawBalls;
{ стираем/рисуем шары }
var
i : Integer;
Begin
Rectangle (0,0, GetMaxX, GetMaxY);
for i:= 1 to N do
with Balls[i] do begin
SetColor(Black);
Circle(Round(Xold),Round(Yold),r);
SetColor(Color); Circle(Round(X),Round(Y), r);
end;
End; { DrawBalls }
procedure Swap;
{ ротация координат для обеспечения движения }
var i : Integer;
Begin
for i:= 1 to N do
with Balls[i] do begin
Xold:= X; Yold:= Y;
end;
End; { Swap }
procedure InitBalls;
{ Определяем начальное положения и скорости шаров }
var
Nw, Nh, Num, H, k : Integer;
Begin
Randomize;
{ определяем максимальное количество шаров }
Nw:= GetMaxX div (2*d); { по горизонтали }
Nh:= GetMaxY div (2*d); { по вертикали }
{ корректируем заданное число шаров }
if Nn >= Nw*Nh then N:=Nw*Nh else N:= Nn;
Num:= 1; { количество размещенных шаров }
H:= 2*r; { начальная y-координата }
while Num <= N do begin
with Balls[Num] do begin
k:= Num mod Nw;
if k = 0 then Xold:= 2*r+4*r*(Nw-1)
else Xold:= 2*r+4*r*(k-1);
Yold:= H;
Vx:= -Vmax+Random*2*Vmax;
Vy:= -Vmax+Random*2*Vmax;
dVx:= 0;
dVy:= 0;
Color:= 1+Random (15);
end;
if k = 0 then Inc (H, 4*r);
Inc (Num);
end;
End; { InitBalls }
procedure BlowBetween;
{ отслеживаем удар }
var
i, j: Integer;
X0, Y0, Vx0, Vy0 : TData;
r0_2, V0_2, S, Discr, t : TData;
Begin
{ для каждой пары шаров }
for i:=1 to N do
for j:=i+1 to N do begin
{ Переходим в систему отсчета, связанную с i-ым
шаром }
X0:=Balls[j].X-Balls[i].X;
Y0:=Balls[j].Y-Balls[i].Y;
Vx0:=Balls[j].Vx-Balls[i].Vx;
Vy0:=Balls[j].Vy-Balls[i].Vy;
r0_2:=Sqr(X0)+Sqr(Y0);
if r0_2 <= doubled_2 then begin
{ проверяем направление движения }
S:=X0*Vx0+Y0*Vy0;
if S < 0 then begin
{ столкновение произойдет }
V0_2:=Sqr(Vx0)+Sqr(Vy0);
Discr:=Sqr(S)-(r0_2-d_2)*V0_2;
if Discr >= 0 then begin
{ две частицы находятся
недалеко друг от друга }
t:=(-S-sqrt(Discr))/V0_2;
if t < tau then begin
{ столкновение происходит }
S:=S/r0_2;
with Balls[i] do begin
dVx:=X0*S; dVy:=Y0*S;
end;
with Balls[j] do begin
dVx:=-Balls[i].dVx;
dVy:=-Balls[i].dVy;
end;
end;
end;
end;
end;
end;
End; { BlowBetween }
procedure BlowBounds;
{ соударения со стенками }
var i : Integer;
Begin
for i:= 1 to N do
with Balls [i] do begin
if X < r then begin
X:= r; Vx:=-Vx;
end
else if X > GetMaxX-r then begin
X:= GetMaxX-r; Vx:=-Vx;
end;
if Y < r then begin
Y:= r; Vy:=-Vy;
end
else if Y > GetMaxY-r then begin
Y:=GetMaxY-r; Vy:=-Vy;
end;
end;
End; { BlowBounds }
procedure Move;
{ собственно обсчет движения }
var
i : Integer;
Begin
for i:= 1 to N do
with Balls [i] do begin
Vx:= Vx+dVx; Vy:= Vy+dVy;
X:= Xold+Vx*tau; Y:= Yold+Vy*tau;
dVx:=0; dVy:=0;
end;
End; { Move }
BEGIN
GraphBegin;
InitBalls;
repeat
Move;
BlowBetween;
BlowBounds;
DrawBalls;
Swap;
Delay (TimeDelay);
until KeyPressed;
END.
ryashya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
движение графических объектов elka Общие вопросы C/C++ 9 25.04.2012 17:24
Движение графических объектов Krivo1993 Помощь студентам 4 31.01.2011 13:58
движение объектов в поле Chart weezmei Помощь студентам 0 22.05.2010 01:09
OpenGL. Независимое движение объектов. Krechet Мультимедиа в Delphi 7 24.04.2010 21:37
Движение 2-x объектов (Delphi) VadEr Помощь студентам 2 06.06.2009 17:19