Autor |
Nachricht |
Peter23 Gast
|
Peter23 Verfasst am: 22. Jun 2012 11:31 Titel: Vektoren Kollision programmieren Problem |
|
|
Hallo,
ich schreibe ein kleines Programm, das erkennen soll, wann und ob zwei Objekte mit unterschiedlichen Geschwindigkeiten v1 und v2 kollidieren. Das ganze in R^2, also 2D. Habe aber ein kleines Problem mit der Vektorrechnung in VB. Also wenn ich die beiden Körper mit
s1 = v1*t + a1
s2 = v2*t + a2
habe, muss ich sie um den Zeitpunkt der Kollision zu bestimmen, doch eigentlich nur gleichsetzen und nach t auflösen, oder?
s1 = s2
<-> t = (a2-a1) / (v1 - v2)
Das sollte der Zeitpunkt der Kollision sein. Aber wie soll ich das in Programmcode übersetzen? a2, a1, v1 und v2 sind ja Vektoren mit x und y-Koordinaten. Ich habe jetzt
Code: |
tx = (dX - (sphSphere.dX)) / (sphSphere.dVelocityX - dVelocityX)
ty = (dY - (sphSphere.dY)) / (sphSphere.dVelocityY - dVelocityY) |
sphSphere.dX / dY: Koordinaten des ersten Körpers; sphSphere.dVelocityX / Y: Geschwindigkeiten
dX, dY: Koordinaten des zweiten Körpers; dVelocityX / Y: Geschwindigkeiten
Leider weiß ich nicht, wie ich mit dem Ergebnis umgehen soll. Manchmal kommt als Meldung nicht definiert, manchmal +unendlich, manchmal -unendlich. Wie soll ich unterscheiden, ob die Körper kollidieren und wenn ja, zu welchem Zeitpunkt? Ich glaube da habe ich irgendwo einen mächtigen mathematischen Fehler drin ;D
Kann mir jemand helfen?
Danke |
|
|
Steffen Bühler Moderator
Anmeldungsdatum: 13.01.2012 Beiträge: 7249
|
Steffen Bühler Verfasst am: 22. Jun 2012 12:01 Titel: |
|
|
Der Fehler ist, daß sowohl a als auch v Vektoren sind, die man zwar subtrahieren und addieren darf, aber leider nicht dividieren. Und schon gar nicht, so wie Du's anscheinend erhofft hast, indem die einzelnen Elemente dividiert werden. Sobald zwei Geschwindigkeitskomponenten gleich sind, teilst Du ja durch Null.
Ich kann mir allerdings gut vorstellen, daß Du hier mit komplexen Zahlen weiterkommst.
Viele Grüße
Steffen |
|
|
Peter12 Gast
|
Peter12 Verfasst am: 22. Jun 2012 14:27 Titel: |
|
|
Achso. Hatte ich mir leichter vorgestellt. Mit komplexen Zahlen kenne ich mich nicht allzu sehr aus, das lasse ich lieber Habe schon eine andere Möglichkeit gefunden, zwar nicht elegant, aber funktioniert einigermaßen. Trotzdem Danke |
|
|
DrStupid
Anmeldungsdatum: 07.10.2009 Beiträge: 5044
|
DrStupid Verfasst am: 22. Jun 2012 15:20 Titel: Re: Vektoren Kollision programmieren Problem |
|
|
Peter23 hat Folgendes geschrieben: |
s1 = s2 <-> t = (a2-a1) / (v1 - v2)
|
Das funktioniert nur, wenn wirklich irgendwann s1=s2 gilt und dann muss die Gleichung für alle Vektorkomponenten erfüllt sein. Üblicherweise wird der Abstand aber nicht verschwinden, sondern nur ein Minimum durchlaufen. Dieses Minimum kannst Du durch Lösung des Extremwertproblems
bestimmen. Die Ableitung nach t liefert
und somit
Dann musst Du nur noch prüfen, ob der zugehörige Abstand so klein ist, dass sich die Objekte berühren.
Edit: Vorzeichenfehler korrigiert.
Zuletzt bearbeitet von DrStupid am 22. Jun 2012 18:22, insgesamt einmal bearbeitet |
|
|
Steffen Bühler Moderator
Anmeldungsdatum: 13.01.2012 Beiträge: 7249
|
Steffen Bühler Verfasst am: 22. Jun 2012 15:42 Titel: |
|
|
Aber was passiert, wenn v1=v2?
EDIT: zum Beispiel, wenn sich die Körper auf zwei Ecken eines gleichseitigen Dreiecks befinden und mit selber Geschwindigkeit auf die dritte Ecke zusteuern?
Viele Grüße
Steffen |
|
|
Peter12 Gast
|
Peter12 Verfasst am: 22. Jun 2012 16:32 Titel: |
|
|
Könnte man das vielleicht irgendwie mit der Abstandsgleichung der beiden Punkte, also machen? Wenn man sie von der Zeit abhängig macht und nach t auflöst? |
|
|
Peter12 Gast
|
Peter12 Verfasst am: 22. Jun 2012 16:47 Titel: |
|
|
Ich meinte natürlich s_x2^2, s_y2^2 .. |
|
|
DrStupid
Anmeldungsdatum: 07.10.2009 Beiträge: 5044
|
DrStupid Verfasst am: 22. Jun 2012 18:09 Titel: |
|
|
Steffen Bühler hat Folgendes geschrieben: | Aber was passiert, wenn v1=v2? |
Dann beibt der Abstand konstant.
Steffen Bühler hat Folgendes geschrieben: | zum Beispiel, wenn sich die Körper auf zwei Ecken eines gleichseitigen Dreiecks befinden und mit selber Geschwindigkeit auf die dritte Ecke zusteuern? |
Dann gilt nicht v1=v2 sondern nur |v1|=|v2|. |
|
|
DrStupid
Anmeldungsdatum: 07.10.2009 Beiträge: 5044
|
DrStupid Verfasst am: 22. Jun 2012 18:14 Titel: |
|
|
Peter12 hat Folgendes geschrieben: | Könnte man das vielleicht irgendwie mit der Abstandsgleichung der beiden Punkte, also machen? Wenn man sie von der Zeit abhängig macht und nach t auflöst? |
Da gibt es in fast allen Fällen keine Lösung. |
|
|
ClickBox
Anmeldungsdatum: 19.02.2012 Beiträge: 124
|
ClickBox Verfasst am: 22. Jun 2012 19:22 Titel: |
|
|
DrStupid hat Folgendes geschrieben: | Steffen Bühler hat Folgendes geschrieben: | Aber was passiert, wenn v1=v2? |
Dann beibt der Abstand konstant.
Steffen Bühler hat Folgendes geschrieben: | zum Beispiel, wenn sich die Körper auf zwei Ecken eines gleichseitigen Dreiecks befinden und mit selber Geschwindigkeit auf die dritte Ecke zusteuern? |
Dann gilt nicht v1=v2 sondern nur |v1|=|v2|. |
Man kann jegliche Probleme durch if-else bedingungen herausfiltern. Zb. muss man bei v1 = v2 (vektoriell gesehen) nicht einmal ein Rechenblock durchlaufen, denn wenn die Anfangspunkte nicht identisch sind, treffen sie sich nie. |
|
|
DrStupid
Anmeldungsdatum: 07.10.2009 Beiträge: 5044
|
DrStupid Verfasst am: 22. Jun 2012 20:10 Titel: |
|
|
ClickBox hat Folgendes geschrieben: | Man kann jegliche Probleme durch if-else bedingungen herausfiltern. Zb. muss man bei v1 = v2 (vektoriell gesehen) nicht einmal ein Rechenblock durchlaufen, denn wenn die Anfangspunkte nicht identisch sind, treffen sie sich nie. |
In JavaScript würde ich das für kugelförmige Körper so probieren:
Code: |
// Quadrat der Geschwindigkeitsdifferenz berechnen
var dv2=0 ;
for (var i=0;i<v1.length;i++) dv2+=(v1[i]-v2[i])*(v1[i]-v2[i]) ;
// Zeitpunkt des minimalen Abstandes berechnen
var t=0 ;
if (dv2>0) {
for (var i=0;i<v1.length;i++) t+=(v1[i]-v2[i])*(a2[i]-a1[i]) ;
t/=dv2 ;
}
// minimalen Abstand berechnen
var ds=0 ;
for (var i=0;i<v1.length;i++)
ds+=(t*(v1[i]-v2[i])+a1[i]-a2[i])*(t*(v1[i]-v2[i])+a1[i]-a2[i]) ;
ds=Math.sqrt(ds2) ;
// Kollisionsabfrage
var collision=(ds<r1+r2) ;
|
PS: Den genauen Zeitpunkt der Kollision erhält man damit übrigens nicht. Dazu müsste man [t·(v1-v2)+a1-a2]²=(r1+r2)² lösen. |
|
|
kingcools
Anmeldungsdatum: 16.01.2011 Beiträge: 700
|
kingcools Verfasst am: 23. Jun 2012 00:06 Titel: |
|
|
Ich würde mir, sofern möglich, einfach ne Vektorklasse bauen oder runterladen. |
|
|
|