Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kollision (https://www.delphipraxis.net/22114-kollision.html)

Mr.M 12. Mai 2004 16:36


Kollision
 
Hi, ich habe ein kleines Problem mit einem Programm von mir. Das Programm wird auf einer Canvas Fläche ausgeführt und die Kollision zweier Bälle soll nach dem elastischen Stoß geschehen!!! Die Formel für den elastischen Stoß habe ich, aber wenn sich zwei Bälle auf der Canvas Fläche kollidieren, ist der Einfallswinkel nich der Ausfallswinkel, sondern der Ball wird einfach zurück reflecktiert.

Nun habe ich etwas mir mit Schwerpunkten überlegt, aber ich weiß nicht wie ich das in einer Formel von Delphi unterbringen kann! Hat jemand Ahnung von Kollisionen von Objekten im Eindimensionalen? Wenn ja bitte melden!!!

Alibi 12. Mai 2004 16:48

Re: Kollision
 
Im eindimensionalen Raum können die Bälle ja nur auf einer Linie sich bewegen, also nur reflektiert werdenn (Also die Bewegungsrichtung um 180° ändern).

Mr.M 12. Mai 2004 17:01

Re: Kollision
 
Ach, ich meinte Zeidimensional, sry.

Mr.M 12. Mai 2004 17:28

Re: Kollision
 
Hier ist noch die Prozdeur zur Kollisionserkennung und dem Geschwindigkeitstausch!

Delphi-Quellcode:
procedure TprogMain.BallKollision(i:integer);
var Distanz:double;
var vx1,vy1,vx2,vy2:double;
var m1,m2:double;
var j:integer;
var a:double;
begin
     for j:=i to MaxBaelle-1 do
     begin
          Distanz:=sqrt(sqr(Ball[i].x-Ball[j].x+Ball[i].vx) +sqr(Ball[i].y-Ball[j].y+Ball[i].vy));
               if ((Ball[i].r+Ball[j].r)>Distanz) and (Distanz<>0) then
               begin
//                    flag:=Snd_async;
                    if checkbox3.Checked=true then sndplaysound('SOUND111.WAV',snd_async);
                    m1:=round(pi*sqr(Ball[i].r));
                    m2:=round(pi*sqr(Ball[j].r));
                    vx1:=Ball[i].vx;
                    vy1:=Ball[i].vy;
                    vx2:=Ball[j].vx;
                    vy2:=Ball[j].vy;
{ ab hier ist das Problem, zwar ist die Formel für den elastischen Stoß richtig, aber etwas fehlt noch, das ich nicht beachtet habe}

                    Ball[i].vx:=((m1-m2)*vx1 + 2*m2*vx2)/(m1+m2);
                    Ball[i].vy:=((m1-m2)*vy1 + 2*m2*vy2)/(m1+m2);
                    Ball[j].vx:=((m2-m1)*vx2 + 2*m1*vx1)/(m1+m2);
                    Ball[j].vy:=((m2-m1)*vy2 + 2*m1*vy1)/(m1+m2);

          Distanz:=sqrt(sqr(Ball[i].x-Ball[j].x)+sqr(Ball[i].y-Ball[j].y));
               if ((Ball[i].r+Ball[j].r)>Distanz) and (Distanz<>0) then Kollisionen:=Kollisionen+1;
                    progmain.Caption:='Ballsimulation (' + floattostr(Kollisionen) + ' Kollisionen)';
               end;
     end;
end;

XeRo 12. Mai 2004 19:16

Re: Kollision
 
Nur ein tipp: es reicht wenn du einmal var schreibst und zwar vor der ersten variable; die anderen kannst du einfach dranhängen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz