Kreis-Kreis-Kollision
Werde ich die Entwicklung eines 2-d-ball-Spiel, wo zwei Kugeln (Kreise) kollidieren. Nun habe ich das problem mit der Bestimmung der Kollision Punkt (in der Tat, bestimmen, ob Sie der Kollision in x-Achse/y-Achse). Ich habe eine Idee, wenn die Differenz zwischen der y-Koordinate von 2 Kugeln größer ist als die x-Koordinate Unterschied dann stoßen Sie zusammen in Ihre y-Achse, andernfalls stoßen Sie zusammen in der x-Achse. Ist meine Idee richtig? Implementiert habe ich das Ding in meine Spiele. Normalerweise funktioniert das gut, aber manchmal scheitert es. Kann mir jemand sagen, ob meine Idee richtig ist? Wenn nicht, dann warum, und ist eine bessere Möglichkeit?
Durch Kollision in der x-Achse, ich meine den Kreis s 1., 4., 5., oder 8. oktanten, y-Achse bedeutet, dass der Kreis die 2., 3., 6., oder 7. oktanten.
Vielen Dank im Voraus!
InformationsquelleAutor der Frage russell | 2009-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kollision zwischen Kreisen ist easy. Stelle mir vor es sind zwei Kreise:
Vorstellen, gibt es eine Linie zwischen den beiden Mittelpunkten. Der Abstand von der Mitte Punkte auf dem Rand, der entweder der Kreis ist per definition gleich der jeweiligen Radien. Also:
Sodass Sie erkennen kann, Kollision, wenn:
Bedeutung der Abstand der Mittelpunkte kleiner als die Summe der Radien.
Das gleiche Prinzip kann angewendet werden, um die Erkennung von Kollisionen zwischen Kugeln in drei Dimensionen.
Edit: wenn Sie berechnen wollen, den Punkt der Kollision, werden einige grundlegende Trigonometrie kann das tun. Sie haben ein Dreieck:
Ausdrücke
|x2-x1|
und|y2-y1|
sind absolute Werte. Also für den Winkel X:Sobald Sie die Winkel berechnen Sie den Schnittpunkt, indem Sie auf ein neues Dreieck:
wo:
so
Aus der früheren Formeln:
Sobald Sie haben, a und b berechnen Sie die Kollision Punkt in Bezug auf (x2,y2) offset von (a,b) als angemessen. Sie nicht sogar brauchen, um berechnen Sie eine Sinus -, Cosinus-oder inverse Sinus-oder Cosinus. Oder irgendwelche Wurzeln für diese Angelegenheit. So ist es schnell.
Aber wenn Sie nicht brauchen eine genaue Winkel oder Punkt der Kollision und wollen einfach nur den oktanten kann man diese optimieren, weiter durch das Verständnis etwas über Tangenten, die:
Diese vier-Grad-Bereiche entsprechen vier oktanten des Kreises. Die anderen vier sind im 180 Grad-Versatz. Wie oben dargelegt, wird die Tangente berechnet werden kann, einfach als:
Verlieren die absoluten Werte und dieses Verhältnis wird Ihnen sagen, welche der vier oktanten der Kollision (durch die oben genannten Tangente reicht). Um die genaue oktanten vergleichen Sie x1 und x2 zu bestimmen, welche ist Links.
Den oktanten der Kollision auf die andere versetzt wird (oktanten 1 auf C1 bedeutet oktanten 5 auf C2, 2 und 6, 3 und 7, 4 und 8, etc).
InformationsquelleAutor der Antwort cletus
Als cletus sagt, Sie wollen die Summe der Radien der beiden Kugeln. Sie möchten berechnen Sie die Gesamt-Distanz zwischen den Zentren der Kugeln, wie folgt:
Einer Kollision passieren wird, wenn (r12 < R ist). Als Artelius sagt, sollte Sie eigentlich nicht kollidieren auf der x/y-Achsen, kollidieren in einem bestimmten Winkel. Außer, Sie nicht wirklich wollen, dass die Winkel, die Sie wollen, dass die Kollision Vektor. Das ist der Unterschied zwischen den Zentren der zwei Kreise, wenn Sie kollidieren:
Beachten Sie, dass bereits berechnete dx und dy oben, wenn das berechnen der tatsächlichen Entfernung, so könnten Sie auch verfolgen, Sie für Zwecke wie diese. Sie können diese Kollision Vektor für die Bestimmung der neuen Geschwindigkeit der Bälle-Sie sind bis zu Ende gehen Skalierung der Kollision Vektor durch einige Faktoren, und hinzufügen, dass zu den alten Geschwindigkeiten... aber, um wieder auf das eigentliche kollisionspunkt:
Herauszufinden, wie finden Sie die neue Geschwindigkeit der Kugeln (und in der Regel mehr Sinn machen, aus der ganzen situation), sollten Sie wahrscheinlich feststellen, eine high-school-Physik-Buch, oder das äquivalent. Leider, ich kenne keine gute tutorial -- Vorschläge, anyone?
Oh, und wenn Sie immer noch wollen, zu halten mit den x - /y-Achse, denke ich, hast du es richtig mit:
Als dafür, warum es fehlschlagen könnte, es ist schwer zu sagen, ohne weitere Informationen, aber haben Sie vielleicht ein problem mit Ihrer Bälle bewegen sich zu schnell, und vorbei an rechts von einander in einem einzigen Zeitschritt. Es gibt Möglichkeiten, um dieses problem zu beheben, aber der einfachste Weg ist, um sicherzustellen, dass Sie nicht zu schnell...
InformationsquelleAutor der Antwort comingstorm
Dieser Website erklärt die Physikleitet der Algorithmusund bietet code für Kollisionen von 2D-Bälle.
Berechnung der oktanten nach dieser Funktion berechnet der folgende: - position der Kollision Punkt relativ zum Zentrum der Masse des Körpers a; position der Kollision Punkt relativ zum Zentrum der Masse des Körpers eine
InformationsquelleAutor der Antwort Leftium
Den Punkt, an dem Sie aneinander stoßen, ist auf die Linie zwischen den Mittelpunkten der beiden Kreise, und seine Entfernung entweder vom Mittelpunkt ist der radius des jeweiligen Kreises.
InformationsquelleAutor der Antwort Carl Smotricz
Ich Stimme mit den bereitgestellten Antworten, Sie sind sehr gut.
Ich will nur zeigen Sie einen kleinen Fallstrick: wenn die Geschwindigkeit der Bälle ist hoch, können Sie nur verpassen die Kollision, weil die Kreise nie kreuzen für die angegebenen Schritte.
Die Lösung besteht darin, die Gleichung auf die Bewegung und den richtigen moment der Kollision.
Sowieso, wenn Sie die Implementierung Ihrer Lösung (Vergleiche auf der X-und Y-Achsen), die Sie bekommen würde, die gute alte ping-pong! http://en.wikipedia.org/wiki/Pong
🙂
InformationsquelleAutor der Antwort avp
Mehr direkt Ihre Frage zu beantworten: ja, nach den Regeln und Anforderungen, die Sie auslegen, die Kugeln kollidieren in der Y-Achse ist die Differenz in der Y-Achse ist größer als die Differenz in X ist, wenn sich die Kugeln berühren.
Wenn dies ist, was Sie implementieren, dann sind Sie immer eine richtige Antwort auf die Frage "X-oder Y-Achse Kollision?". Aber ich denke, der Grund, warum man immer so viele Antworten hier, dass Sie kann nicht scheinen zu verwenden, ist, dass entweder
da Fragen Sie die falsche Frage (nicht hier - in Ihrem Programm); oder
Sie sind nicht mit der Antwort richtig.
Ich bin mir sicher, dass viele von uns programmiert haben bouncing balls-Programmen, und ich vermute, keiner von uns hat versucht, die Modell-Kollisionen, basierend auf oktanten und Achsen. Also ich vermute, dass entweder Sie haben eine sehr originelle neue Ansatz, oder du bist einfach etwas falsch. Daher empfehle ich, gehen Sie zurück und überprüfen Sie Ihre Methode und Annahmen.
InformationsquelleAutor der Antwort Carl Smotricz