Kollisionserkennung zwischen zwei Rechtecke in java
Ich habe zwei Rechtecke, die das rote Rechteck (bewegen kann) und das Blaue Rechteck.
Beide haben: x, y, Breite, Höhe.
Wie kann ich sagen, in einer Programmiersprache wie Java, wenn es eine Kollision zwischen dem blauen und dem roten Rechteck?
InformationsquelleAutor mikelplhts | 2015-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sagen, Sie haben ein Rechteck Ein, und Rect B. Beweis durch Widerspruch. Einer von vier Bedingungen gewährleistet werden, dass keine überschneidungen vorliegen können:
Daher eine hinreichende Bedingung für die Überlappung ist das Gegenteil (De Morgan)
Nicht Cond1 Und Nicht Cond2 Und Nicht Cond3 Und Nicht Cond4
Dies ist äquivalent zu:
Hinweis 1: Es ist ziemlich offensichtlich, dass dieses gleiche Prinzip kann erweitert werden, um eine beliebige Anzahl von Dimensionen.
Hinweis 2: Es sollte auch klar sein, zu zählen, zu überschneidungen von nur einem pixel, ändern Sie die < und/oder > auf die Grenze zu a <= oder ein >=.
Wenn Sie eine harte Zeit visualisieren, warum es funktioniert, habe ich eine Beispiel-Seite silentmatt.com/intersection.html, wo Sie ziehen können, Rechtecke, um und sehen die Vergleiche.
Rect1
nicht einen einzigenX1
Eigenschaft. Diese Eigenschaft gehört zu einem Punkt. Diese Antwort ist nicht berechtigt, dieX1
Eigenschaft um einen Punkt, so ist dieser Vergleich nicht sinnvoll ist.BufBills' wenn-Bedingung ist nur ein pseudo-code zur Veranschaulichung eine Lösung.
RectA.X1
steht für den linken Rand des Rechtecks Ein, undRectA.X1 < RectB.X2
bedeutet "der linke Rand ist auf der linken Seite der B - rechten Rand". Wie Sie die Implementierung in Java ist Ihre Entscheidung.OP explizit gefragt, für die eine Implementierung in Java. Zumindest die akzeptierte Antwort sein sollte ausführbarer code.
Wenn Sie sich entscheiden, zu Modell Rechtecke mit einer Klasse, die X1 -, X2 -, Y1 -, Y2-Attribute für die Koordinaten des Rechtecks Kanten und wenn Sie Variablen verwenden, RectA und RectB verweisen zwei Rechteck-Objekte, dann Sie können verwenden Sie die if-Bedingung durch BufBills so wie es da steht. Es ist Gültiger Java-code und es ist genau das, was der OP fragte. Ansonsten, die OP würde nicht akzeptiert die Antwort.
Dies scheint nicht zu funktionieren für gedrehte Rechtecke. Auf dem Papier habe ich ein großes Rechteck gedreht um 45 Grad und eine sehr kleine Rechteck in der Nähe des großen Rechtecks edge-Linie, so scheint es, erfüllen alle Voraussetzungen, aber nicht in der geschlossenen Rechteck oder verschneiden.
InformationsquelleAutor BufBills
In java , zu erkennen, wenn sich zwei-wenn zwei Rechtecke kollidieren, können Sie
intersects()
MethodeBeispielcode:
Ich erkenne diese Antwort, einfach, weil es nicht in der Frage, dass er auf der Suche nach einem Algorithmus um dieses problem zu lösen, einfach eine Lösung zu finden.
Oh sorry, habe ich nie bemerkt, dass der Algorithmus tag bis u erwähnt, soll ich diese Antwort unten?
Ich von Ihnen positiv bewertet werden Ihre Antwort. es ist ein guter. 🙂
InformationsquelleAutor Pruthvi Raj
InformationsquelleAutor Denis Petrov
Müssen Sie überprüfen sowohl die Kreuzung entlang der x-Achse und entlang der y-Achse. Wenn einer von Ihnen fehlt, gibt es keine Kollision zwischen den Rechtecken.
Code für 1-D:
Haben Sie es zu nennen für x und y:
InformationsquelleAutor Miljen Mikic
berechnen 4 Punkte, der zweite Rechteck. Beachten Sie als pointE, F, G, H.
Durchlaufen, Punkt, E,F,G,H
(1) wenn jede von diesen ist innerhalb der Fläche, A,B,C,D eingeschlossen. Rückkehr Kollision.
(2) ansonsten keine Kollision.
3.(1) - Algorithmus. man braucht so etwas wie dieses.
Xe >= Xa && Xc <= Xb. && Yc >= Yc && Ihr <=Yc
InformationsquelleAutor BufBills