Kollision im 2Dimensionalen



  • Guten Tag,
    Ich war mir nicht ganz sicher ob ich das ganze unter Spieleprogrammierung hätte posten sollen oder doch eher hier, aber da es letztendlich die Mathematik ist an der ich scheitere hab ich mich entschlossen es hier zu versuchen.
    Die Sache ist die das ich in meinem Programm Kreise bewege und diese dann gerne ordentlich mit durch zwei Punkte definierte Strecken kollidieren lassen würde. Der Erste Punkte dem ich dabei nach gegangen bin ist das ich eine gerade durch die beiden Punkte bestimme. Das geht mit Y - Y1 = (Y2 - Y1) / (X2 - X1) * (X -X1) soweit ich das sehe recht ordentlich. Nächster Punkt ist dann die Bewegung also eigentlich eine halb gerade, bzw. wieder eine strecke weil ich mich ja nicht ewig bewegen will. Angeben ist mein Kreis mit seinem Mittelpunkt und einer Richtung in die er sich bewegt. Damit komme ich auf Y - Y0 = tan(alpha) * (X - X1). Jetzt könnte ich im Grunde das ganze miteinander gleichsetzen und könnte dann schauen ob ich in meinem Definitionsbereich liege. Ja, würde vermutlich funktionieren nur verdränge ich dabei das ich es mit einem Kreis zu tuen habe den ich bewegen will und keinen Punkt und das es unschön ist wenn der Kreis mit dem Mittelpunkt kollidiert. Jetzt ist halt die Frage wie bekomme ich den Kreis noch mit in die Berechnung? Ich hab jetzt einige Sachen mir überlegt, von Parallelverschiebungen um den Kreis Radius in Richtung des Kreismittelpunktes aber letztendlich scheitern alle diese Ideen in irgendeinem ungünstigen Fall.
    So jetzt die Frage, hätte jemand eine Idee wie ich den Kreis in dem ganzen noch berücksichtigen könnte?



  • Hi
    bin mir nicht ganz sicher ob ich genau verstanden habe was du suchst, also hier meine Vermutung:
    Du weisst das zwei Punkte kollidieren wenn sie gleich sind, und du suchst eine äquivalente bedingung für Kreise.

    Naja zwei Punkte sind gleich bedeutet ja sie haben Abstand null voneinander.
    Welchen Abstand haben denn Kreise voneinander wenn sie Kollidieren?
    Sagen wir mal Kreis 1 hat Radius r1 und Kreis 2 hat Radius r2. Dann Kollidieren sie genau dann wennder Abstand der Mittelpunkte zueinander gleich r1+r2 ist.
    Wenn m=(m1,m2) der Mittelpunkt von Kreis 1 und n=(n1,n2) der Mittelpunkt von Kreis 2 so kollidieren sie wenn gilt ||n-m||=r1+r2.

    hoffe das war gemeint.
    mfg
    dfgbn



  • nicht ganz, ich versuche immer noch meinen Kreis mit der Strecke kollidieren zu lassen. Um das ganze mal ein bisschen genauer zu beschreiben:
    http://img244.imageshack.us/img244/647/irgendwas.png
    Ich weiß das ich wenn ich nur einen Punkt hätte der sich bewegt den Schnittpunkt bekommen würde in dem ich die Funktion für die Strecke und den für die Bewegung gleich setze. Mein Problem ist das ich mit dem Kreis den ich bewege schon viel früher die Strecke schneide.



  • wenn ich Dein interpunktions-freies Geschreibsel interpretiere, willst du wissen, ob eine Strecke nicht-leeren Schnitt mit einer Kreisscheibe hat, oder was ?

    Meinst du das folgende, kannst es aber nicht klar formulieren?

    Strecke in Parameterdarstellung (a*x + (1-a)*y, 0 <= a <= 1, wobei x und y die Endpunkte der Strecke sind), das ist eine lineare Ungleichung

    Ungleichung für Kreisscheibe (||x-x_0||^2 <= r^2, wobei x_0 der Kreismittelpunkt und r der Radius), das ist eine quadratische Ungleichung,

    es entsteht ein quadratisches Ungleichungssystem von der Art

    ||a*x + (1-a)*y -x_0||^2 <= r^2
    0<= a <= 1

    wobei x_0 Kreismittelpunkt, r Radius, x und y Endpunkte der Strecke sind.

    Und du willst jetzt wissen, wie man feststellt, ob dieses System von Ungleichungen eine Lösung hat, d.h. ob sich Strecke und Kreis schneiden ?



  • O.k. ich glaub jetzt hab ich verstanden.
    Meine Überlegung:
    In dem Moment in dem der Kreis die Strecke berührt. hat der Mittelpunkt des Kreises den Abstand r (Radius vom Kreis) zur Strecke.
    Wenn man also ne Parallele Strecke im Abstand r zur Originalstrecke bildet und die mit der Geraden schneidet auf der sich der Kreis bewegt sollte man die Position des Mittelpunktes des Kreises und den Kollisionspunkt von Kreis und Strecke bekommen.
    Rechnerich:
    S sei die Origanstrecke (als Gerade in Parameterform)
    M sei die Gerade auf der sich der Kreis bewegt (und sich somit die Mittelpunkte des Kreises zu versch. Zeiten befinden)
    Sei nun S: x=v+t_1*w wobei v Stützvektor und w=(w_1,w_2) Richtungsvektor
    Dann ist ein Normalenvektor von S n=(w_2,-w_1) und daher ein Einheitsnormalenvektor n_0=n/||n||
    Die Parallele Gerade zu S, nenne ich jetzt mal S_1, lässt sich somit darstellen durch S_1: x=v+r*n_0+t_2*w.
    Durch das Gleichsetzen von S_1 und M erhält man dann den Schnittpunkt wie immer.

    Ein kleiner Haken noch:
    Die Richtung von n_0 muss man sich noch angucken so das man die richtige Paralelle berechnet. Muss ich nochmal drüber nachdenken.Wird aber nicht so schwer sein. Man muss halt diejenige Seite son S wählen auf der der Kreis liegt.

    Hoffe jetzt hab ich es richtig verstanden.
    mfg
    dfgbn



  • dfgbn schrieb:

    In dem Moment in dem der Kreis die Strecke berührt. hat der Mittelpunkt des Kreises den Abstand r (Radius vom Kreis) zur Strecke.
    Wenn man also ne Parallele Strecke im Abstand r zur Originalstrecke bildet und die mit der Geraden schneidet auf der sich der Kreis bewegt sollte man die Position des Mittelpunktes des Kreises und den Kollisionspunkt von Kreis und Strecke bekommen.

    das gilt aber nicht mehr, wenn die Strecke den Kreisrand zuerst mit einem Endpunkt berührt, z.B. wenn die Strecke geradewegs auf den Kreismittelpunkt zu wandert. Die Parallelen im Abstand r sind dann Sekanten oder Tangenten des Kreises, je nach Winkel zwischen Strecke und (infinitesimal) Kreisrand.

    Deine Rechnung mag stimmen, wenn die Strecke zuerst mit einem (und nur einem) Nicht-Endpunkt den Kreis berührt, das ist aber nur der Fall, wenn sich die Strecke genau orthogonal zum Radius (Kreismitte/voraussichtlicher Berührpunkt) bewegt und im Moment des Berührens eine Tangente des Kreises darstellt.



  • Da hat u_ser-l wohl recht.
    Das passiert wenn man vergisst das Strecken keine Geraden sind und somit Endpunkte haben.


Anmelden zum Antworten