Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Kollision Ball mit Ball über Winkel (https://www.delphipraxis.net/81611-kollision-ball-mit-ball-ueber-winkel.html)

Tyrael Y. 30. Nov 2006 11:01


Kollision Ball mit Ball über Winkel
 
Was ist am folgendem falsch ?

Die Kugeln kollidieren ab und zu sogar ganz richtig.
Manchmal gehen sie aber ineinander rein und kollidieren gar nicht.

Angle ist in Bogenmass angegeben.

Delphi-Quellcode:

function GetDistanceOfPoints(X1, Y1, X2, Y2: Single): Single;
begin
  result := sqrt(sqr(X1-X2) + sqr(Y1-Y2));

end;


procedure CheckCollision(const AIndex: Integer);
var i: Integer;
     LTemp: Single;
begin
  for i := 0 to FBalls.Count-1 do
  begin
    if i <> AIndex then
    begin
      if GetDistanceOfPoints(TLvBall(FBalls[i]).X, TLvBall(FBalls[i]).Y,
           TLvBall(FBalls[AIndex]).X, TLvBall(FBalls[AIndex]).Y) -
           (TLvBall(FBalls[AIndex]).Radius + TLvBall(FBalls[i]).Radius) <= 0 then
      begin
         TLvBall(FBalls[AIndex]).Angle := GradToRad(360 + (180 -                                 RadToGrad(TLvBall(FBalls[AIndex]).Angle)));

         TLvBall(FBalls[i]).Angle := GradToRad(360 + (180 - RadToGrad(TLvBall(FBalls[i]).Angle)));
      end;
  end;
end;

Khabarakh 30. Nov 2006 11:20

Re: Kollision Ball mit Ball über Winkel
 
  • Wie soll man denn bei so vielen Typecasts noch etwas erkennen :shock: ? Speicher die Bälle doch einfach in Variablen.
  • Deinen Aufruf von GetDistance verstehe ich nicht wirklich. Ich würde
    Delphi-Quellcode:
    GetDistanceOfPoints(Current.X, Current.Y, Ball.X, Ball.Y) <= Current.Radius + Ball.Radius
    vorschlagen.
  • RadToGrad? Du meinst wohl eher RadToDeg und vice versa.
  • Den Rest der Winkelberechnungen habe ich nicht überprüft, so etwas mache ich lieber mit Vektoren :mrgreen: .

Tyrael Y. 30. Nov 2006 11:41

Re: Kollision Ball mit Ball über Winkel
 
Ok den Code nochmal, damit es übersichtlicher aussieht bissel umgeschrieben.


Delphi-Quellcode:
function GetDistanceOfPoints(X1, Y1, X2, Y2: Single): Single;
begin
  result := sqrt(sqr(X1-X2) + sqr(Y1-Y2));
end;


procedure CheckCollision(const AIndex: Integer);
var i: Integer;
     LDistance: Single;
     LCurrentBall,
     LBall: TLvBall;
begin
 
  LCurrentBall := TLvBall(FBalls[AIndex]);

  for i := 0 to FBalls.Count-1 do
  begin
    if i <> AIndex then
    begin
      LBall := TLvBall(FBalls[i]);
     
      if GetDistanceOfPoints(LBall.X, LBall.Y,
           LCurrentBall.X, LCurrentBall.Y) -
           (LBall.Radius + LCurrentBall.Radius) <= 0 then
      begin
         LCurrentBall.Angle := GradToRad(360 + (180 - RadToGrad(LCurrentBall.Angle)));

         LBall.Angle := GradToRad(360 + (180 - RadToGrad(LBall.Angle)));
      end;
  end;
end;
1. Ob ich das Ergebnis aus GetDistance mit der Summe der Radien Vergleiche oder ob ich diese Beiden Werte voneinander abziehe und gucke, ob sie kleiner als Null sind ist ja im Prinzip dasselbe

2. Laut Hilfe gibt es beide RadToDeg und auch RadToGrad

3. (Den Code hab ich hier einfach im Editor umgeschrieben, könnten sich also Fehler eingeschlichen haben)

Khabarakh 30. Nov 2006 12:00

Re: Kollision Ball mit Ball über Winkel
 
Zitat:

Zitat von Tyrael Y.
1. Ob ich das Ergebnis aus GetDistance mit der Summe der Radien Vergleiche oder ob ich diese Beiden Werte voneinander abziehe und gucke, ob sie kleiner als Null sind ist ja im Prinzip dasselbe

In der übersichtlicheren Version sehe ich nun auch die Klammer, die ich vorher übersehen habe :stupid: .

Zitat:

Laut Hilfe gibt es beide RadToDeg und auch RadToGrad
Und welche von beiden die richtige Funktion ist, habe ich ja schon geschrieben.

Tyrael Y. 30. Nov 2006 12:15

Re: Kollision Ball mit Ball über Winkel
 
RadToDeg ändert am Verhalten leider nix.
Ich habe irgendwo noch einen Denkfehler.

Wird sich schon mit bissel nachdenken und ausprobieren lösen lassen. :)

Sidorion 30. Nov 2006 14:06

Re: Kollision Ball mit Ball über Winkel
 
Kugeln prallen voneinander immer senkrecht ab.
Will heissen:
sei: r1^ die Bewegungsrichtung Ball1
M1 Mitelpunkt Ball1
M2 Mittelpunkt Ball2
m1m2^ Vektor vom M1 nach M2

dann ist a der Winkel zwischen r1^und m1m2^.
dann ist r1neu^=r1^+2a.

das selbe gilt für Ball2.

Zudem Berechnest Du bei jeder Kollision die neue Richtung für beide Bälle aus, das kann so nicht klappen. Da die Funktion für jeden ball gerufen wird, werden die Richtungen jeweils zweimal geändert.

Tyrael Y. 30. Nov 2006 14:37

Re: Kollision Ball mit Ball über Winkel
 
Hallo Sidorion

danke für deine Ausführung.
Eine Frage was ist a bei r1neu^=r1^+2a.

Ich habe meinen Ball so konstruiert, daß ich

- den Mittelpunkt
- den Radius
- den Winkel der Richtung
- Geschwindigkeit

habe.

Vorher sah es so aus.

- Mittelpunkt
- Radius
- Bewegung in X/Y Richtung (die Geschwindigkeit und die Richtung waren darüber geregelt)



Vorher hatte ich es so, daß ich einen VX und einen VY hatte,
die die Änderung von X und Y angegeben haben.
Damit hatte die Kugelkollision geklappt.

Wieso ich es umgeändert habe, um einen Winkel reinzukriegen liegt daran,
daß ich zusätzliche rechteckige Objekte reingebracht habe an denen auch
eine Kollision passieren sollte.
Die einfache Kollision war auch dort kein Problem.

Ich hatte, aber das Problem, daß der Ball je nach dem wo er auf dem Rechteck auftrifft,
in einem anderen Winkel zurückprallen sollte.

Zitat:


|__a__|____b____|___c__|
|XXXXXXXXXXXXXXXXXXXxx|
|_____________________|
In b sollte es Einfallswinkel = Abprallwinkel sein
In a und c sollte es mit einem höherem/niedrigerem Winkel abprallen.


Deswegen bin ich dazu übergegangen, die Kollisionen und die Bewegungen mittels eines
Winkels zu bestimmen.

Ziel:
- Kollisionen zwischen Kugeln
- Kollisionen zwischen Kugeln und Rechtecken mit obiger Vorgabe


Hast du für dieses Vorhaben vielleicht eine bessere/elegantere Idee?

Sidorion 30. Nov 2006 14:48

Re: Kollision Ball mit Ball über Winkel
 
r1neu^ ist einfach der neue Richtungsvektor von Ball1.

Zum Abprallen von Bällen von Rechtecken gibts hier aber auch einen Tread, bin nur zu faul, Dir den jetzt rauszusuchen :twisted:
such mal nach ball prallt von ecke ab.

[edit] bin ja nicht so:guckst Du hier: [/edit]

Cöster 30. Nov 2006 15:22

Re: Kollision Ball mit Ball über Winkel
 
Zitat:

Zitat von Sidorion
Zum Abprallen von Bällen von Rechtecken gibts hier aber auch einen Tread, bin nur zu faul, Dir den jetzt rauszusuchen :twisted:
such mal nach ball prallt von ecke ab.

[edit] bin ja nicht so:guckst Du hier: [/edit]

Wenn ich Tyrael richtig verstehe, wird ihm dieser Thread nichts bringen. Er will die Bälle nicht auf die physikalisch normale Weise abprallen lassen.

Tyrael Y. 30. Nov 2006 15:36

Re: Kollision Ball mit Ball über Winkel
 
Zitat:

Zitat von Sidorion
r1neu^ ist einfach der neue Richtungsvektor von Ball1.

Mir geht es um das "a" in der Formel. Was soll das "a" darstellen?

Wie Cöster es richtig erkannt hat, wird dieser Thread mir nicht viel bringen.


Mein Problem mit der Methode über ein VX/VY war, daß damit die Geschwindigkeit gleich mitbestimmt ist.
Sprich will ich es unter einem völlig anderem Winkel abprallen lassen, dann verändert sich automatisch die Geschwindigkeit der Kugel.

Die Variante über die Winkel gefällt mir persönlich im Moment sogar ziemlich gut, nur das ich die Kollision nicht ganz hinbekomme.
Ich denke es ist im Moment eher ein mathematisches Problem, bei dem mir noch nicht ganz bewusst geworden ist, wo es hapert.

Abprallwinkel := 180 - Winkel

scheint mir richtig....wie gesagt scheint....da es nicht ganz passt


Edit:
Ich überlege gerade, ob ich die ganze Methodik nicht ändere.
Eventuell mache ich es über fiolgende Vorgehenweise.

KugelA prallt an KugelB

- ich bestimme den Aufprallpunkt auf KugelB
- lege eine Tangente an diesen Punkt
- lasse KugelA an dieser Tangente abprallen

...wie ich das genau mathematisch realisiere weiss ich noch nicht.
Muss es halt mal überdenken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Seite 1 von 2  1 2      

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