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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 11:16   #1
belomorinka
Пользователь
 
Регистрация: 11.05.2009
Сообщений: 15
По умолчанию Расчет столкновения шариков.

В моей программе моделируется броуновское движение.
Но не все шарики сталкиваются. Вот код:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i,j: integer;
  tmp1: single;
  tmp2: single;
begin
for i:=1 to MaxBalls do
begin
  ball := balls[i];
  ball.lx:=ball.x;
  ball.ly:=ball.y; //предыдущие координаты (для отката, чтобы не сцепились)


    if ((ball.x<=ball.size) or (ball.x >= (PaintBox1.Width-ball.size))) then
    begin
      ball.nx := -ball.nx;
      if(ball.x<=ball.size) then
        ball.x := ball.x +5 else
        ball.x := ball.x -5;
      end;

    if ((ball.y<=ball.size) or (ball.y >= (PaintBox1.Height-ball.size))) then
    begin
      ball.ny := -ball.ny;
      if(ball.y<=ball.size) then
        ball.y := ball.y +5 else
        ball.y := ball.y -5;
      end;


  //столкновение шаров
    try begin
    for j:=1 to Maxballs do begin
    if i=j then continue;
    if (abs(balls[j].x-ball.x)<abs(balls[j].size+ball.size))and
            (abs(balls[j].y-ball.y)<abs(balls[j].size+ball.size))
    then
    begin
    ball.x:=ball.lx; //откат шара на шаг назад
    ball.y:=ball.ly;
    begin
         tmp1 := balls[j].size*balls[j].nx/ball.size;
         tmp2 := ball.size*ball.nx/balls[j].size;
         ball.nx := tmp1;
         balls[j].nx := tmp2;

         tmp1 := balls[j].size*balls[j].ny/ball.size;
         tmp2 := ball.size*ball.ny/balls[j].size;
         ball.ny := tmp1;
         balls[j].ny := tmp2;


       ball.x := ball.x + ball.nx;
       ball.y := ball.y + ball.ny;
       balls[j].x := balls[j].x + balls[j].nx;
       balls[j].y := balls[j].y + balls[j].ny;
    end;
    end;
    end;
   ball.x := ball.x + ball.nx;
   ball.y := ball.y + ball.ny;
   ball.ny := ball.ny + ball.ay;
   ball.nx := ball.nx + ball.ax;
   balls[i]:=ball;
end;
except
on EZeroDivide do ;
on EInvalidOp do end;
DrawBalls;
end;
end;
belomorinka вне форума Ответить с цитированием
Старый 01.06.2009, 12:24   #2
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

лучше кинь файлы исходника, легче будет разобраться.
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 01.06.2009, 22:42   #3
belomorinka
Пользователь
 
Регистрация: 11.05.2009
Сообщений: 15
По умолчанию

Вот исходник. Ума не приложу, как доделать(((shariki.rar
belomorinka вне форума Ответить с цитированием
Старый 02.06.2009, 18:54   #4
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Чтобы не сцеплялись, я в подобных задачах делаю несколько итераций(например, 1000) между кадрами. А не 1, как обычно. В течение каждой итерации частицы продвигаются незначительно. Это позволяет с большей точностью моделировать движение. Например, если моделировать систему Земля–Спутник, Спутник не будет съезжать с орбиты при хорошем количестве итераций.

Ну и здесь этот метод мог бы пригодиться.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кредит, расчет. valerij Microsoft Office Excel 6 14.04.2009 23:15
Расчет движения voodoomedved Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 25.02.2009 23:07
Соударение шариков разных размеров и объемов Стаханов_Андрей Помощь студентам 3 09.03.2008 17:17
Расчет средневзешенного zoman Microsoft Office Excel 2 05.12.2007 10:15