Kiedyś w gwałtownym przypływie nudy spłodziłem coś takiego:(Już myśałem że nie znajdę)
type tob=record
vx,vy, //predkosc w plaszczyznie x i y (w pixelach)
x,y, //pozycja w plaszczyznie x i y
m, //masa kulki (masa > 0)
r //wielkosc kulki (w pixelach)
:real;
end;
const max=3;
const speed=50;
var
Form1: TForm1;
vx1,vx2,vy1,vy2,m1,m2,x1,x2,y1,y2,r1,r2:real;
p:array[0..max] of tob;
bool:boolean=true;
bmp:tbitmap;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var a,s,d:integer;
var t,ix,iy:real;
begin
for a:=1 to speed do begin
for s:=1 to max do begin
// przemieszczenie
p[s].x:=p[s].x+p[s].vx/100;
p[s].y:=p[s].y+p[s].vy/100;
// odbicia od scian
if p[s].x<p[s].r then p[s].vx:=-p[s].vx;
if p[s].y<p[s].r then p[s].vy:=-p[s].vy;
if p[s].x>form1.ClientWidth-p[s].r then p[s].vx:=-p[s].vx;
if p[s].y>form1.ClientHeight-p[s].r then p[s].vy:=-p[s].vy;
end;
for s:=1 to max-1 do
for d:=s+1 to max do
if ((sqr(p[s].x-p[d].x)+sqr(p[s].y-p[d].y))<sqr(p[s].r+p[d].r)) then begin
// >>>>>>>>>>>>>> oto caly kod obliczajacy predkosci po zdezeniu
p[s].x:=p[s].x-p[s].vx/100;
p[s].y:=p[s].y-p[s].vy/100;
p[d].x:=p[d].x-p[d].vx/100;
p[d].y:=p[d].y-p[d].vy/100;
ix:=0;
iy:=0;
t:=0;
ix:=p[s].x-p[d].x;
iy:=p[s].y-p[d].y;
t:=-2*(ix*p[s].vx+iy*p[s].vy-ix*p[d].vx-iy*p[d].vy);
t:=t/(ix*ix+iy*iy);
t:=t/( 1/p[s].m + 1/p[d].m );
p[s].vx:=p[s].vx+(t*ix/p[s].m);
p[s].vy:=p[s].vy+(t*iy/p[s].m);
p[d].vx:=p[d].vx-(t*ix/p[d].m);
p[d].vy:=p[d].vy-(t*iy/p[d].m);
// <<<<<<<<<<<<<<< oto caly kod obliczajacy predkosci po zdezeniu
end;
end;
form1.FormPaint(form1);
end;
procedure TForm1.FormCreate(Sender: TObject);
var a:integer;
begin
bmp:=tbitmap.Create;
bmp.Width:=600;
bmp.Height:=600;
// >>>>>>>>>>>>>> ustawiwienie poczatkowych wartosci
p[1].x:=100;
p[1].y:=100;
p[1].vx:=10;
p[1].vy:=10;
p[1].r:=30;
p[1].m:=1;
p[2].x:=150;
p[2].y:=200;
p[2].vx:=0;
p[2].vy:=0;
p[2].r:=30;
p[2].m:=1;
p[3].x:=100;
p[3].y:=400;
p[3].vx:=0;
p[3].vy:=0;
p[3].r:=90;
p[3].m:=50;
// <<<<<<<<<<<<<<< ustawiwienie poczatkowych wartosci
end;
procedure TForm1.FormPaint(Sender: TObject);
var a:integer;
begin
// >>>>>>>>>>>>>> odswierzanie obrazu
bmp.Canvas.Brush.Color:=$ffffff;
bmp.Canvas.Rectangle(0,0,600,600);
bmp.Canvas.Brush.Color:=0;
for a:=1 to max do
bmp.Canvas.Ellipse(trunc(p[a].x-p[a].r+0.5),trunc(p[a].y-p[a].r+0.5),trunc(p[a].x+p[a].r+0.5),trunc(p[a].y+p[a].r+0.5));
form1.Canvas.Draw(0,0,bmp);
// <<<<<<<<<<<<<<< odswierzanie obrazu
end;
Co prawda to nie jest dokładnie to co masz do zrobienia ale myślę że stanowi jakiś punkt zaczepienia i może się przydać.
Btw. Sugerujesz że jestem wykładowcą?