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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2008, 22:21   #1
ExoByte
 
Регистрация: 04.05.2008
Сообщений: 4
По умолчанию Броуновское движение (Delphi)

Здравствуйте. У меня есть задача написать программу моделирующую броуновское движение. В принципе все готово, но есть несколько вопросов:

1) Мне не очень нравится как происходит столкновения о границы области вывода частиц (т.е. некоторые частицы вылезают за границу). Есть-ли у кого-нибудь идеи как этого избежать?

2) В моей задаче нужно сделать посередине области вывода перегородку с щелью (через нее частицы могут пролетать из левой половины в правую). Так вот если скорость частицы слишком большая, то она пролетает сквозь эту перегородку. Происходит это потому, движение сделано у меня по таймеру, я проверяю положение частицы каждую тысячную секунды, НО! если скорость частицы велика, то может так получиться, что в один момент она еще не долетела до перегородки, а в другой уже перелетела ее и столкновение не регестрируется. Тоже не могу придумать как бы от этого избавиться.

3) еще думаю как бы по-аккуратнее сделать чтобы за частицей оставался пунктирный след от ее траектории

4)также мне надо было сделать, чтобы частицы сталкивались друг с другом. Это я замутил, но наблюдается такой же эфект как при столкновении с границами области, только тут некоторые частицы как бы слипаются. Происходит это потому что при столкновении частицы обмениваются скоростями, но в следующий момент не успевают разлететься и получается что опять происходит обмен скоростями и сближение и так до бесконечности.

Жду интересных идей и предложений!

P.S. Исходник прекреплять не буду пока (он достаточно большой и сложноват будет для понимания), думаю что и так все подробно описал, но если кому-то понадобится позже выложу.
ExoByte вне форума Ответить с цитированием
Старый 04.05.2008, 22:39   #2
-=<[Evklidd]>=-
Форумчанин Подтвердите свой е-майл
 
Аватар для -=<[Evklidd]>=-
 
Регистрация: 22.01.2008
Сообщений: 161
По умолчанию

1) а как вы делаете? Просто проверки на совпадении координаты частицы с границей не хватает?
2)А уменьшить интервал Timer'a?
3) создавайте массив, лучше динамический, с координатами центра частиц и прорисовывайте его в событии таймера
-=<[Evklidd]>=- вне форума Ответить с цитированием
Старый 04.05.2008, 22:49   #3
ExoByte
 
Регистрация: 04.05.2008
Сообщений: 4
По умолчанию

-=<[Evklidd]>=- так и делаю, проверяю координаты на совпадение. уменьшать интервал таймера некуда и так =1. По третьему пункту тоже думал про массив
ExoByte вне форума Ответить с цитированием
Старый 05.05.2008, 09:44   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2ExoByte рассуждения по теме
Вложения
Тип файла: doc Столкновения.doc (69.5 Кб, 110 просмотров)
alexBlack вне форума Ответить с цитированием
Старый 05.05.2008, 10:17   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Жду интересных идей и предложений!
В пакете GL Sene к Open GL есть красивый пример моделирования движения молекул и прочего мелкого мусора. Посмотри его он красиво сделан.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.05.2008, 21:59   #6
ExoByte
 
Регистрация: 04.05.2008
Сообщений: 4
По умолчанию

спасибо alexBalck, я собственно примерно так и делал. Stilet c Open GL не работал, посмотрим.

Короче исправил все косяки, кроме пункта (2). Молекулы пролетают "сквозь" перегородку, если скорость очень большая.
ExoByte вне форума Ответить с цитированием
Старый 06.05.2008, 01:04   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Мне недавно попалась оченб неплохая книжка на эту тему, называется "Real-Time Collision Detection", автор Christer Ericson, там, собственно, на вполне приемлимом математическом уровне, разбираются все эти проблемы, включая "туннельный эффект" - "пролет через стену". Собственно таких книг достаточно много. Целиком пока не читал, только пробежался глазами, но вроде бы там эта проблема решается вполне логичным образом - на основе предсказания будущих положений объекта. Тем более, если уравнение движения линейно, задача решается с помощью простенького матаппарата...
B_N вне форума Ответить с цитированием
Старый 06.05.2008, 10:14   #8
ExoByte
 
Регистрация: 04.05.2008
Сообщений: 4
По умолчанию

B_N спасибо большое за книжку, сейчас поищу! Кстати уже и сам думал брать что-ли "экстраполировать" положение частицы. Почитаем как они это делают...
ExoByte вне форума Ответить с цитированием
Старый 03.06.2008, 15:01   #9
georgiy
Новичок
Джуниор
 
Регистрация: 03.06.2008
Сообщений: 1
По умолчанию плизз!!!

ExoByte можешь выложить исходники! У меня не броуновское движение, но нужен пример следа от частиц!!!
georgiy вне форума Ответить с цитированием
Старый 01.06.2009, 11:25   #10
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 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение картинки &RiU Помощь студентам 2 28.05.2008 23:46
движение по эллипсу Оля Помощь студентам 2 08.05.2007 00:50
Движение Mickle Общие вопросы Delphi 5 19.04.2007 23:24
Движение по окружности Mickle Общие вопросы Delphi 3 13.04.2007 16:24
Движение камеры LepihinMS Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 16.03.2007 20:46