AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kollisionen von Kreisen

Ein Thema von 3_of_8 · begonnen am 3. Aug 2008 · letzter Beitrag vom 4. Aug 2008
Antwort Antwort
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

Kollisionen von Kreisen

  Alt 3. Aug 2008, 10:01
Morgen.

Ich hab hier gerade in Problem damit, Stöße von Kreisen (Billardkugeln) zu implementieren.

Ich habe Positions- und Geschwindigkeitsvektoren beider Kreise. Radius und Masse sind gleich. Damit findete eine Kollision statt, wenn deltaX²+deltaY²<=4r².

Was ich will, sind die Geschwindigkeitsvektoren der beiden Kreise nach der Kollision.

Irgendwo habe ich die Idee aufgeschnappt, die Situation so zu drehen, dass die Verbindungsgerade der Kreismittelpunkte die x-Achse ist. Das ist nicht weiter schwer, da wendet man einfach eine Drehmatrix auf die Geschwindigkeitsvektoren an. Dann erhält man die neuen Vektoren, indem man die y-Komponenten der alten nimmt und die x-Komponenten vertauscht. (Zentraler Stoß im 1-dimensionalen auf der x-Achse, da die Masse gleich ist kürzt es sich auf vx1'=vx2 und vx2'=vx1) Anschließend wieder zurückdrehen und fertig.

Jetzt stellen sich da mehrere Fragen:
1. Das ist ein vollkommen elastischer Stoß. Kann man den plastischen Faktor bei einem Billardspiel vernachlässigen? Wie viel Aufwand ist es, ihn (z.B. durch eine Stoßzahl) noch da reinzubringen?
2. Geht das nur für zentrale Stöße oder auch für exzentrische?
3. Was ist mit dem Eigendrehimpuls der Kreise/Kugeln?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
new32

Registriert seit: 10. Mai 2005
160 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Kollisionen von Kreisen

  Alt 3. Aug 2008, 10:32
Zu elastischen Stößen:

Der Energieerhaltungssatz sowie der Impulzerhaltungssatz sind anwendbar.
E1 + E2 = E1' + E2'
1/2 * m1 * v1² + 1/2 * m2 * v2² = 1/2 m1 * u1² + 1/2 m2 * u2²

P1 + P2 = P1' + P2'
m1 v1 + m2 v2 = m1 u1 + m2 u2


Das gilt auch für nicht-zentrale Stöße. Allerdings musst du die Bewegung vorher zerlegen.

ich denke, dass du den Stoß als (voll) elastisch betrachten kannst. In der Realität sollte das auch zu 95% elastisch sein.


zu 3: weiß ich nicht genau
~?&/%§$§%\&?~
8)
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Kollisionen von Kreisen

  Alt 3. Aug 2008, 10:54
Ich weiss nicht, wie du den Treffpunkt berechnest, aber ich habe mal einen Ansatz gehabt, der sehr gute Ergebnisse liefert:

Zuerst transformierst du dich in ein Bezugssystem, in dem eine Kugel ruht (in dem du deren Geschwindigkeit von der anderen abziehst und berechnest dann die Kollision, danach Trafo zurück. Wenn deine Kugeln bei x und x' liegen und die eine Kugel sich mit v bewegt, musst du nur noch die Gleichung |x+v*t-x'|=2r lösen. Das wird dann kurzzeitig etwas größer, ist aber eigentlich nur eine Gleichung, die quadratisch in t ist, so dass du zwischen 0 und 2 Gleichungen für t bekommst. (wenn sich die Kugel komplett durch die andere bewegt hat, ist die Abstandsgleichung wieder erfüllt. ) Du brauchst also nur eine pq-Formel anzusetzen und die "-" Lösung zu benutzen.
Damit kannst du dann sehr schnell alle Kollisionen berechnen. Hast du die, kannst du die beiden stoßenden Kugeln zum Treffpunkt bewegen, die Kollision ausrechnen und auch alle anderen Kugeln um dieses Zeitstück weiterbewegen, da sie in dieser Zeit auch nicht kollidieren. Das kannst du dann einfach so lange machen, bis alle Kugeln durch Reibung stark genug abgebremst wurde, bis ihre Geschwindigkeit unter einem epilon liegen. Da jede der Berechnungen sehr schnell ist, und du recht wenige Objekt hast, sollte das alles recht flüssig ablaufen. (Du kannst die Berechnung auch schon Beginnen, wenn der Spieler noch zielt und dann nur noch ein paar Zwischenergebnisse anzeigen).

Größter Aufwand bei dieser Berechnung ist dabei die Berechnung der trigonometrischen Funktionen bei der Rotationsmatrix, um die du kaum rumkommen wirst. Für den eher unwahrscheinlichen Fall, dass du in Zeitprobleme kommst, könntest du dir hier vielleicht eine Tabelle von 0°,0.5°,...,90° anlegen und dann einfach nachschlagen.


Wegen der Drehimpulsübertragung müsstest du mal einen Experimentalphysiker fragen, das dürfte nicht trivial werden, wenn es genau sein soll, vielleicht reichen da auch Heuristiken.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Kollisionen von Kreisen

  Alt 3. Aug 2008, 12:15
Das ist eigentlich genau der Ansatz, den ich mir auch überlegt hatte, nur ich hätte in die zu lösende Gleichung statt x+vt noch einen Term eingebaut, der gleich die Reibung miteinbezieht. Kann aber sein, dass man die bei genügend kleinen Zeitscheiben vernachlässigen kann, muss ich mal schauen. Wann die Kollision stattfindet ist ja nicht so sehr das Problem, das Problem ist, wie ich die Geschwindigkeitsvektoren berechne. Aber mal schauen, mit dem, was ich bisher habe, müsste man schon einiges machen können.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Kollisionen von Kreisen

  Alt 3. Aug 2008, 12:31
Die Geschwindigkeitsvektoren sind einfach:
Über Drehung und Verschiebung kannst du eine Situation einrichten, in der die Kugeln bei 0/1 bzw. 0/-1 liegen und sich im Ursprung berühren. Damit hast du jetzt Geschwindigkeitskomponenten in y- und in x-Richtung, also in Richtung der anderen Kugel und senkrecht dazu.

Die x-Koordinate wird einfach beibehalten, die y-Koordinate veränderst du gemäß den Gesetzen von Impuls und Energieerhaltung. (vgl new32). Ich bin mir nur nicht so ganz sicher, ob die weiße Kugel die so viel wiegt wie die anderen.

Diese Gleichungen kannst du sogar noch vereinfachen, in dem du noch in das Ruhesystem einer Kugel transformierst, wie ich oben beschrieben habe.

Danach transformierst du wieder zurück und fertig.

Bei den Stößen kannst du eigentlich auch einfach jeder Kugel vor dem Stoß noch ein paar Prozent Geschwindigkeit abziehen, um die Deformationsenergie zu berücksichtigen, wobei die eigentlich klein gegen die Reibung sein dürfte.

Deswegen wäre es erstmal sinnvoll diesen Effekt zu ignorieren und dir anzuschauen, ob das ganze glaubwürdig aussieht.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Kollisionen von Kreisen

  Alt 3. Aug 2008, 23:19
Das war auch so ziemlich genau mein Plan. Ich hab das mal in Delphi als Simulation realisiert und das sieht auch recht gut aus, ich hab noch bestimmte Reibungseffekte vernachlässigen müssen, weil ich ansonsten irgendwelche Polynome 4. Grades hätte lösen müssen, und das war mir dann doch etwas zu viel Arbeit, aber ich glaube das geht schon so.

Wie gesagt, ich weiß jetzt nicht, wie viel Einfluss der Eigendrehimpuls der Bälle normalerweise auf Billardkugeln hat...
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Kollisionen von Kreisen

  Alt 4. Aug 2008, 05:50
Frage mich bitte keiner mehr woher ich das habe, aber vor einigen Jahren hab ich irgendwo eine rein vektorielle Lösung entweder ge- oder erfunden, die ohne Trigonometrie und ohne Verschiebungen auskommt. Das einzig seltsame bei der Sache ist, ist dass der Gesamtimpuls mehr oder minder schwankt, im Mittel aber relativ stabil bleibt.
Ich habs nie produktiv im Einsatz gehabt, das Resultat schaut erstmal recht richtig aus, aber meine Hand würde ich dafür heute nicht mehr ins Feuer legen wollen. Ich hab grad auch fix versucht nachzuvollziehen nach welchen Regeln das läuft bzw. ob und wie man sich das Geometrisch herleiten könnte, aber schaut mal auf die Uhr...

Wichtig ist, dass das nur für den perfekt elastischen Stoß gleich großen Kugeln gilt, und Reibung wie sie für den Einfluss der Drehung interessant wäre wird nicht berücksichtigt. (In welchem Maße sie das tut ist übrigends völlig beliebig je nach Beschaffenheit der Kugeln. Da wird man keine allgemeingültige Aussage zu machen können.)

Prinzip:
V1 und V2 seien die Richtungsvektoren der kollidierenden Bälle.
S1 sei (V1-V2), und S2 ein dazu orthogonaler Vektor (S1.y; -S1.x)

Man bilde die 4 Vektoren E1, E2, K1, K2:
E1 = V1*S1*S1
E2 = V2*S1*S1
K1 = V1*S2*S2
K2 = V2*S2*S2
(Beachte: Die erste Multiplikation ist das Skalarprodukt, die zweite eine Skalierung der letzten Vektoren S1 bzw. S2)

Dann sind die neuen Richtungsvektoren V1' und V2'
V1' = E2 + K1
V2' = E1 + K2


Ich hab das Projekt von damals mal angehängt. Man verzeihe mir dabei den stümperigen Timer und sehr wahrscheinlich sehr suboptimalen Code - das war nur eine Konzeptstudie

Aber wie gesagt: Ich gebe keine Gewähr auf Richtigkeit. Wenn es aber korrekt ist, ist es ausgesprochen elegant.

Edit: Wenn man bei der Bildung von E* und K* nach der ersten Multiplikation noch durch die Länge von jeweils V1 bzw. V2 dividiert bleibt der Gesamtimpuls stabiler, und der Term erinnert schon deutlich eher an die Winkelberechnung zwischen Vektoren. Jedoch bleiben die Kreise im angehängten Programm auf diese Weise öfter ineinander hängen, wodurch man sie zusätzlich dann noch etwas zurecht schieben muss um das zu verhindern. Ist ja nicht unüblich bei Kollisionsklamotten in einem diskreten System.
Angehängte Dateien
Dateityp: zip balls_109.zip (205,6 KB, 21x aufgerufen)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

Re: Kollisionen von Kreisen

  Alt 4. Aug 2008, 11:01
Also wir hatten mal in der Physikvorlesung solche Stoßberechnungen, und da wurde das Schwerpunktsystem benutzt, weil es anscheinend vieles vereinfacht (Summe aller Impulse ist null) Das heißt, der Koordinatenursprung liegt im Massenschwerpunkt und bewegt sich entsprechend mit.

Dann lassen sich die neuen Impulsvektoeren relativ leicht berechnen, und du kannst wieder zurücktransformieren

Ob das jetzt besser/schneller/einfacher oder so ist, sei dahingestellt.
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:28 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