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