Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Делаю хранитель экрана, где шарики (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, 02:17   #2
Arigato
СуперПрограммист
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Адрес: Россия
Сообщений: 13,998
Репутация: 3525
По умолчанию

Лучше рисовать шарики на битмапе и его выводить на форму. А причину надо в формулах искать, перепроверьте еще раз. Делал такую программу, только на C++ Builder, все отлично работало.
__________________
E-Mail: arigato.freelance@gmail.com
Arigato вне форума   Ответить с цитированием
Старый 16.05.2017, 10:27   #3
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,393
Репутация: 1965
По умолчанию

не учитываются РАЗМЕРЫ шариков.
столкновение это НИКОГДА не сближение их "верхних левых точек" (точнее верхней левой точки описанного квадрата) на заданную величину
Цитата:
Код:

    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 в 10:31.
evg_m вне форума   Ответить с цитированием
Старый 04.06.2017, 14:05   #4
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: Санкт-Петербург
Сообщений: 707
Репутация: 335
По умолчанию

Лучше регионами столкновение проверять так легче, для каждого шарика регион создавать вот к примеру эта тема
http://www.programmersforum.ru/showthread.php?t=280064
Aliens_wolfs вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




08:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru