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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2017, 01:06   #1
qwee13
Новичок
Джуниор
 
Регистрация: 16.05.2017
Сообщений: 1
Восклицание Отталкивание шариков

Делаю хранитель экрана, где шарики (Shape) отталкиваются от стен и друг от друга. С отталкивание от стен проблем нет, но вот отталкивание друг от друга выглядит неестественно. Шарики отталкиваются от воздуха, иногда телепортируются и могут начать хаотично летать по всей форме. (http://i.imgur.com/0UsvWbs.gifv)

Код HTML:
for i := 0 to 7 do
  begin
    masPosX[i] := Random(500);
    masPosY[i] := Random(500);
    masVelX[i] := 2;
    masVelY[i] := 2;
  end;
Отталкивание от стен:
Код HTML:
procedure TForm1.shar;
var
  i, h0, h1, k, count, fl, j: Cardinal;
  a, b: extended;
  p1, p2, p3, d1, d2, dist, bet, x1, x2, y1, y2: extended;
  g, h, kk: integer;
begin
 
  for i := 0 to 7 do
  begin
    masPosX[i] := masPosX[i] + masVelX[i];
    masPosY[i] := masPosY[i] + masVelY[i];
 
    if masPosX[i] > ClientWidth - Shp1.Width then
    begin
      masPosX[i] := ClientWidth - Shp1.Width;
      masVelX[i] := -masVelX[i];
    end
    else if masPosX[i] < 0 then
    begin
      masPosX[i] := 0;
      masVelX[i] := -masVelX[i];
    end;
    if masPosY[i] > ClientHeight - Shp1.Width then
    begin
      masPosY[i] := ClientHeight - Shp1.Width;
      masVelY[i] := -masVelY[i];
    end
    else if masPosY[i] < 0 then
    begin
      masPosY[i] := 0;
      masVelY[i] := -masVelY[i];
    end;
 
  end;
 
  Shp1.Left := Round(masPosX[0]);
  Shp1.Top := Round(masPosY[0]);
  Shp2.Left := Round(masPosX[1]);
  Shp2.Top := Round(masPosY[1]);
  Shp3.Left := Round(masPosX[2]);
  Shp3.Top := Round(masPosY[2]);
  Shp4.Left := Round(masPosX[3]);
  Shp4.Top := Round(masPosY[3]);
  Shp5.Left := Round(masPosX[4]);
  Shp5.Top := Round(masPosY[4]);
  Shp6.Left := Round(masPosX[5]);
  Shp6.Top := Round(masPosY[5]);
  Shp7.Left := Round(masPosX[6]);
  Shp7.Top := Round(masPosY[6]);
  Shp8.Left := Round(masPosX[7]);
  Shp8.Top := Round(masPosY[7]);
Отталкивание друг от друга:
Код HTML:
for i := 0 to 7 do
    for j := 0 to 7 do
      if i <> j then
      begin
            a := MasPosX[i] - MasPosX[j];
            b := MasPosY[i] - MasPosY[j];
            dist := sqrt(sqr(a) + sqr(b));
 
            if dist <= 65 then
            begin
              bet := arctan2(MasPosY[j] - MasPosY[i], MasPosX[j] - MasPosX[i]);
              x1 := masvelx[i] * cos(-bet) - MasVelY[i] * sin(-bet);
              y1 := MasVelX[i] * sin(-bet) + MasVelY[i] * cos(-bet);
              x2 := MasVelX[j] * cos(-bet) - MasVelY[j] * sin(-bet);
              y2 := MasVelX[j] * sin(-bet) + MasVelY[j] * cos(-bet);
              MasVelX[i] := x2 * cos(bet) - y1 * sin(bet);
              MasVelY[i] := x2 * sin(bet) + y1 * cos(bet);
              masVelX[j] := x1 * cos(bet) - y2 * sin(bet);
              MasVelY[j] := x1 * sin(bet) + y2 * cos(bet);
 
 
              kk := 1;
              while (dist <= 65) and (kk < 100) do
              begin
                inc(kk);
                a := MasPosX[i] - MasPosX[j];
                b := MasPosY[i] - MasPosY[j];
                dist := sqrt(sqr(a) + sqr(b));
 
                MasPosX[i] := MasPosX[i] + MasVelX[i] * 0.1;
                MasPosY[i] := MasPosY[i] + MasVelY[i] * 0.1;
 
                MasPosX[j] := MasPosX[j] + MasVelY[j] * 0.1;
                MasPosY[j] := MasPosY[j] + MasVelY[j] * 0.1;
              end;
            end;
        end;
Буду благодарен за любую помощь.
qwee13 вне форума Ответить с цитированием
Старый 16.05.2017, 01:17   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,219
По умолчанию

Лучше рисовать шарики на битмапе и его выводить на форму. А причину надо в формулах искать, перепроверьте еще раз. Делал такую программу, только на C++ Builder, все отлично работало.
Arigato вне форума Ответить с цитированием
Старый 16.05.2017, 09:27   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

не учитываются РАЗМЕРЫ шариков.
столкновение это НИКОГДА не сближение их "верхних левых точек" (точнее верхней левой точки описанного квадрата) на заданную величину
Цитата:
Код:
    else if masPosX[i] < 0 then
    begin
      masPosX[i] := 0;
....
    else if masPosY[i] < 0 then
    begin
      masPosY[i] := 0;
Цитата:
Код:
            a := MasPosX[i] - MasPosX[j];
            b := MasPosY[i] - MasPosY[j];
            dist := sqrt(sqr(a) + sqr(b));
 
            if dist <= 65 then
а СБЛИЖЕНИЕ ЦЕНТРОВ на расстояние <= сумма их радиусов (полусумма диаметров)
Код:
ax :=aLEFT + awidth div 2;
ay :=aTOP  + awidth div 2;
...
if sqr(ax-bx) +sqr(ay-by) <=sqr( (awidth + bwidth) div 2) then;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.05.2017 в 09:31.
evg_m вне форума Ответить с цитированием
Старый 04.06.2017, 13:05   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Лучше регионами столкновение проверять так легче, для каждого шарика регион создавать вот к примеру эта тема
http://www.programmersforum.ru/showthread.php?t=280064
Aliens_wolfs вне форума Ответить с цитированием
Старый 08.10.2017, 12:47   #5
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Автор, поищите уроки от Мерлина за 2006 год по флешу, там был пример физического взаимодействия шариков.
dummy_user вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отталкивание кнопок в лазарусе(Pascal) Firefox25 Помощь студентам 11 21.01.2016 13:19
Зарисовка шариков HeLLiSH Общие вопросы Delphi 6 22.06.2012 10:10
массивы шариков nexzis Помощь студентам 4 02.11.2010 17:34
Столкновение шариков в delphi vladlen1993 Помощь студентам 4 08.10.2010 15:11
Расчет столкновения шариков. belomorinka Общие вопросы Delphi 3 02.06.2009 18:54