IPB
ЛогинПароль:

> Реализация соударения шаров.., Дайте формулы, пожалуйста..
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Филиппс

Репутация: -  0  +


Задача такова, чтобы реализовать нецентральное соударение двух шаров (на плоскости) разных масс и скоростей и рисовать все это на канве (в Дельфи). Я так понимаю, что нужно делать в таймере: вычислять новые координаты, перебирать каждый шар (это если их много), не соприкасается ли он с другим. Когда это произошло, нужно перещитывать скорости и направления шаров. Вот это как раз таки и интересует. По каким формулам можно посчитать углы и скорости?? Перепробывал кучу формул, найденных в книгах и интернете. Не работает даже центральный удар. Может что-нибудь неправильно в самой идее реализации..

Заранее благодарен.

Сообщение отредактировано: philip-s -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Насколько я вижу, у тебя не будет обновляться положение шаров, поскольку изменение координат X и Y происходит только при касании границы, а откуда взяться этому касанию?

Вот так попробуй:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, j, dx, dy: integer;
vxOld, vyOld: integer;
begin
for i := 1 to Amount do begin
with Balls[i] do begin

if (X <= R) or (X >= PaintBox1.Width - R) then Vx := -Vx;
x := x + Vx; // Изменение координаты - в любом случае, ВНЕ If-а

if (Y <= R) or (Y >= PaintBox1.Height - R) then Vy := -Vy;
y := y + Vy; // аналогично

end;

for j := 1 to Amount do begin
if i <> j then begin
dx := Balls[i].x + Balls[i].vx - Balls[j].x - Balls[j].vx;
dy := Balls[i].y + Balls[i].vy - Balls[j].y - Balls[j].vy;
if sqrt(dx*dx + dy*dy) <= Balls[i].R + Balls[j].R then begin

VxOld:=Balls[i].Vx;
VyOld:=Balls[i].Vy;
Balls[i].Vx:=Trunc(
(
(Balls[i].Mass-Balls[j].Mass)*VxOld + 2*Balls[j].Mass*Balls[j].Vx
) /
(Balls[i].Mass+Balls[j].Mass)
);
Balls[i].Vy:=Trunc(
(
(Balls[i].Mass-Balls[j].Mass)*VyOld + 2*Balls[j].Mass*Balls[j].Vy
) /
(Balls[i].Mass+Balls[j].Mass)
);

Balls[j].Vx:=Trunc(
(
(Balls[j].Mass-Balls[i].Mass) * Balls[j].Vx + 2*Balls[i].Mass*VxOld
) /
(Balls[i].Mass+Balls[j].Mass)
);
Balls[j].Vy := Trunc(
(
(Balls[j].Mass-Balls[i].Mass) * Balls[j].Vy + 2*Balls[i].Mass*VyOld
) /
(Balls[i].Mass+Balls[j].Mass)
);

end;
end;
end;
end;
UpdatePic;
//
end;
Обрати внимание на то, КАК у тебя вычисляются Vx и Vy. Ты уверен, что ты именно этого хочешь, либо напутал со скобками?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 14:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name