AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Kollision Ball mit Ball über Winkel
Thema durchsuchen
Ansicht
Themen-Optionen

Kollision Ball mit Ball über Winkel

Ein Thema von Tyrael Y. · begonnen am 30. Nov 2006 · letzter Beitrag vom 1. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#1

Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 12:01
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;
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 12:20
  • Wie soll man denn bei so vielen Typecasts noch etwas erkennen ? Speicher die Bälle doch einfach in Variablen.
  • Deinen Aufruf von GetDistance verstehe ich nicht wirklich. Ich würde
    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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 12:41
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)
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 13:00
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 .

Zitat:
Laut Hilfe gibt es beide RadToDeg und auch RadToGrad
Und welche von beiden die richtige Funktion ist, habe ich ja schon geschrieben.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 13:15
RadToDeg ändert am Verhalten leider nix.
Ich habe irgendwo noch einen Denkfehler.

Wird sich schon mit bissel nachdenken und ausprobieren lösen lassen.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#6

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 15:06
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 15:37
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?
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#8

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 15:48
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
such mal nach ball prallt von ecke ab.

[edit] bin ja nicht so:guckst Du hier: [/edit]
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 16:22
Zitat von Sidorion:
Zum Abprallen von Bällen von Rechtecken gibts hier aber auch einen Tread, bin nur zu faul, Dir den jetzt rauszusuchen
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.
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Kollision Ball mit Ball über Winkel

  Alt 30. Nov 2006, 16:36
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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.
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