RegistrierenRegistrieren   LoginLogin   FAQFAQ    SuchenSuchen   
Vektoren Kollision programmieren Problem
 
Neue Frage »
Antworten »
    Foren-Übersicht -> Mechanik
Autor Nachricht
Peter23
Gast





Beitrag Peter23 Verfasst am: 22. Jun 2012 11:31    Titel: Vektoren Kollision programmieren Problem Antworten mit Zitat

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: 7094

Beitrag Steffen Bühler Verfasst am: 22. Jun 2012 12:01    Titel: Antworten mit Zitat

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





Beitrag Peter12 Verfasst am: 22. Jun 2012 14:27    Titel: Antworten mit Zitat

Achso. Hatte ich mir leichter vorgestellt. Mit komplexen Zahlen kenne ich mich nicht allzu sehr aus, das lasse ich lieber Augenzwinkern Habe schon eine andere Möglichkeit gefunden, zwar nicht elegant, aber funktioniert einigermaßen. Trotzdem Danke
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 4938

Beitrag DrStupid Verfasst am: 22. Jun 2012 15:20    Titel: Re: Vektoren Kollision programmieren Problem Antworten mit Zitat

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: 7094

Beitrag Steffen Bühler Verfasst am: 22. Jun 2012 15:42    Titel: Antworten mit Zitat

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





Beitrag Peter12 Verfasst am: 22. Jun 2012 16:32    Titel: Antworten mit Zitat

Könnte man das vielleicht irgendwie mit der Abstandsgleichung der beiden Punkte, also machen? Big Laugh Wenn man sie von der Zeit abhängig macht und nach t auflöst?
Peter12
Gast





Beitrag Peter12 Verfasst am: 22. Jun 2012 16:47    Titel: Antworten mit Zitat

Ich meinte natürlich s_x2^2, s_y2^2 ..
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 4938

Beitrag DrStupid Verfasst am: 22. Jun 2012 18:09    Titel: Antworten mit Zitat

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: 4938

Beitrag DrStupid Verfasst am: 22. Jun 2012 18:14    Titel: Antworten mit Zitat

Peter12 hat Folgendes geschrieben:
Könnte man das vielleicht irgendwie mit der Abstandsgleichung der beiden Punkte, also machen? Big Laugh 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

Beitrag ClickBox Verfasst am: 22. Jun 2012 19:22    Titel: Antworten mit Zitat

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: 4938

Beitrag DrStupid Verfasst am: 22. Jun 2012 20:10    Titel: Antworten mit Zitat

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

Beitrag kingcools Verfasst am: 23. Jun 2012 00:06    Titel: Antworten mit Zitat

Ich würde mir, sofern möglich, einfach ne Vektorklasse bauen oder runterladen.
Neue Frage »
Antworten »
    Foren-Übersicht -> Mechanik