Hi Pungex,
ich bin der Typ mit Gasteilchen3D
Zitat von
shmia:
Delphi-Quellcode:
function Kollision(A, B : TPoint; Squaredist:integer):boolean;
var
x,y : integer;
begin
x := A.x-B.x;
y := A.x-B.x;
result := ((x*x)+(y*y) <= Squaredist);
end;
Naja, bei y sollte man schon die Y-Koordinaten der Punkte voneinander subtrahieren, sonst wird das nichts
y:= A.Y-B.Y;
Ich mach das immer mit folgender Funktion:
Delphi-Quellcode:
function abstand(a,b:tpoint):real;
begin
result:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end;
//Abfrage
if abstand(punkta,punktb)<=radiusa+radiusb then kollision;
Allerdings reicht das alleine für die Abprallberechnungen von Teilchen nicht aus. Deshalb hab ich mal meine absoluten Anfänge angehängt. Ich bin mir ziemlich sicher das du das gebrauchen kannst
Meine Stossprozedur sieht so aus:
Delphi-Quellcode:
procedure tForm1.stoss(var b1,b2:tBall);
var M1,M2,delvx,delvy,dmx,dmy,dvx,dvy:single;
begin
M1:=b1.masse;
M2:=b2.masse;
dmx:=b2.x-b1.x;
dmy:=b2.y-b1.y;
delvx:=b2.vx-b1.vx;
delvy:=b2.vy-b1.vy;
dvx:=2*M2*dmx*(dmx*delvx+dmy*delvy)/((SQR(dmx)+SQR(dmy))*(M1+M2));
dvy:=2*M2*dmy*(dmx*delvx+dmy*delvy)/((SQR(dmx)+SQR(dmy))*(M1+M2));
b1.vx:=b1.vx+dvx;
b1.vy:=b1.vy+dvy;
b2.vx:=b2.vx-(M1/M2)*dvx;
b2.vy:=b2.vy-(M1/M2)*dvy;
bewegeball(b1);
bewegeball(b2);
end;
Damit werden auch sofort je nach Masse, Winkel und Radius die neuen Geschwindigkeiten und Richtungen angegeben. Allerdings treten noch ein paar Schönheitsfehler auf, die sich aber leicht beheben lassen. Im Anhang findest du eine laufende Simulation und bei Fragen kannst du diese gern an mich stellen.
mfg, mr.winkle