Autor Beitrag
Marekventur
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 72



BeitragVerfasst: Do 07.10.04 15:57 
Hallo!
Ich bracuhe für den Mathematikunterricht eine Formel, die die Kollision von Billiardkugeln berechnet, und zwar,möchte ich errechnen, wenn ich von 2 Kugeln die exakte Position + Bewegungsvektor habe, wann sich diese Kugeln [b]exakt[/b] treffen.
Mein Ansatz ist
sqr((x1 + vx1 + t) - (x2 + vx2 * t)) + sqr((y1 + vy1 + t) - (y2 + vy2 * t)) = sqr(r1 + r2)
nach c aufzulösen

je kugel : x, y: Position; vx, vy: Vektor; r: Radius
t: Zeit

ich hab das Aufeglößt, aber die Formel hat die Probe nicht bestanden...

es wäre nett, wenn jemand einen anderen ansatz wüsste oder weiß wie das geht.

Mit vielen Grüßen
Marek
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 07.10.04 16:05 
Das kann so nicht gehen, da du unterschiedliche Größe addierst (Zeiten, Wege, Positionen). Entweder du fügst dem Bewegungsvektor die Geschwindigkeit (Verbindung zwischen Weg und Zeit) hinzu, oder du berechnest zunächst die Kollisionskoordinaten, und ermittelst erst im Anschluss über Abstand die benötigte Zeit.

Empfehlen würde ich dir die erste Variante, wenn du deinen Kugeln noch einen Radius verpasst. Das zweite funktioniert so erstmal nur für Punkte. Für Kugeln würde es unentlich viele Lösungen geben.

Gruß,
Jörg

Edit: Ich seh grad, Radius hast du ja, dann also das Erste.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Marekventur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 72



BeitragVerfasst: Do 07.10.04 19:43 
[quote]Empfehlen würde ich dir die erste Variante, wenn du deinen Kugeln noch einen Radius verpasst. Das zweite funktioniert so erstmal nur für Punkte. Für Kugeln würde es unentlich viele Lösungen geben[/quote]

Ich hab mich glaub ich falsch ausgedrückt:

Es kann keine unendlichen Lösungen geben (Allerhöchstens garkeine), und der Bewegungsvektor hat eine Geschwindigkeit, er wird in jedem Frame vx nach rechts und vy nach unten bewegt. Das bestimmt gleichzeitig Winkel und Länge (=Gescwhindigkeit). Und es ist sehr viel schneller, wenn man die Kugel oft um den selben Faktor bewegen muss.

Stell dir vor, ich hab die Kugeln in meinem Spiel und bewegen die jeden Frame um vx, vy. Irgendwann merke ich , das eine Kollision stattfindet (Satz des Pytagoras (?)). Dann bewege ich alle Kugeln um einen Frame zurück, und ermittle den exakten Zeitpunkt der Kugelkollision (die vorherige Kollision war ungenau, da in endlichen Zeitschritte/Bewegungsschritten vorgegeangen wird). Dann kann ich mit einem elastischen Stoß den neune Vektor errechnen.

Mein Problem ist, das ich nicht GENAU weiß, wann die beiden Kugeln sich treffen. Also dachte ich erst an ein lineares Gleichungssystem, in dem t mit dem Faktor multipliziert wird (wodurch ich die Zeit t in "Bruchteil des Frames" erhalte). Doch fiehl mir dann auf, das die Kugeln ja schon Kollidieren, wenn die Distanz gleich die Summe der Radien ist.

Also hab ich die Formel oben nach dem Satz des Pytagoras
(Differenz x + vx * t) ^ 2 + (Differenz y + vy * t ) ^ 2 = (r1 + r2) ^ 2
aufgestellt. Nur das Auflösen bereitet mir, trotz quadratischer Gleichung probleme.
Klar ist, das 2 Lösungen rauskommen, da einmal die Wurzel gezogen werden muss.
Ein Kollision beim berühren der Kugel und eine beim Verlassen.

Ich hoffe, jetzt ist die Sache ein bischen klarer
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 07.10.04 23:54 
Ach so, das mit der Geschwindigkeit stand oben nicht. Und in der Gleichung ist oben auch ein Fehler. Der Übersicht halber benenn ich die Variablen mal wie folgt:

x = Differenz der X-Werte
y = Differenz der Y-Werte
a = Geschwindigkeit in X-Richtung
b = Geschwindigkeit in Y-Richtung
t = Zeit
r = Kugelradius (beide gleich groß)

Umgestellt in die Normalform sieht deine Gleichung dann so aus:

ausblenden Quelltext
1:
t^2 + t*(x*a+y*b)/(a^2+b^2) + (x^2+y^2-4*r^2)/(a^2+b^2) = 0					


Nach der Lösungformel musst du beide Ergebnisse überprüfen, ob sie näher beim Ausgangspunkt der bewegten Kugel liegen als die Zielkugel. Das nähere ist dann deine Lösung.

Ich hab deine Gleichung jetzt nur aufgelöst. Ob sie überhaupt richtig ist, da mach ich mir jetzt keine Gedanken drum ... zu spät ...

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!