Kollision zweier Rechtecke

Status
Nicht offen für weitere Antworten.
I

ich²

Gast
Hi Forum,

ich habe eine Klasse "Wall" die eine Wand/Rechteck repräsentiert. Dann habe ich noch eine Klasse, die mehrere Walls beinhaltet und bewegt. Jetzt möchte ich wissen wenn durch diese Bewegung zwei Walls miteinander kollidieren. Dafür hab ich mir eine Methode collision in der Klasse Wall angelegt, die überprüft ob eine Kollision mit einer anderen Wall stattfindet

Code:
		if (posX < w.getPosX() + w.getWidth()) {
			if (posX + width > w.getPosX()) {
				if (posY + height > w.getPosY()) {
					if (posY < w.getPosY() + w.getHeight()) {
					// Kollision
					}
				}
			}
		}

funktioniert soweit auch ohne Probleme. Die Frage ist jetzt nur, wie erkenne ich WO die Elemente kollidiert sind? Also sind sie horizontal oder vertical kollidiert? Weiß da jemand wie ich da vorgehen kann?

Danke!

mfg

ich²
 

Quaxli

Top Contributor
Das wird Dir nichts anderes übrig bleiben, als das über die x- und y-Werte auszukaspern.

Die Kollision selbst zu ermitteln hättest Du Dir übrigens sparen können. Schau Dir mal die Klasse Rectangle und die Methode intersects(..) an.
 
I

ich²

Gast
Danke für deine Antwort, werd ich mir mal anschauen.

Das ich das irgendwie an den Koordinaten berechnen muss ist mir schon klar. Stellt sich nur die Frage nach dem 'Wie' ... keine Idee?

mfg

ich²
 
I

ich²

Gast
Hi byto,

danke, dass du dich meiner annimmst, aber du bist nicht zufällig der Versuchung erlegen nur die Überschrift ohne den Zuständigen Thread mitsamt Posts zu lesen, oder!? ;)

mfg

ich²
 

Quaxli

Top Contributor
Eigentlich ist es doch ganz einfach. Zuerst prüfst Du auf Intersection. Wenn das der Fall ist, prüfst Du die Ecken.
Ein Vorschlag nimm Dir ein Blatt Papier und mal es Dir auf, dann ist kommst Du relativ schnell drauf.

Eine Pauschllösung kann Dir keiner so einfach anbieten, weil Du z. B. nicht geschrieben hast, wie groß in etwa die beiden Rechtecke sind oder was geschehen soll, wenn sie genau im 45° Winkel aufeinandertreffen, usw..

Versuch Dich erst mal selbst an der Lösung (inkl. Aufmalen!) , dann lernst Du am meisten dabei. Wenn Du dann nicht weiter kommst, erzähl mal ein bißchen von den Rahmenbedingungen, dann können wir auch konkrete Tipps geben.

:cool:
 
I

ich²

Gast
Guten Morgen zusammen,

Quaxli hat gesagt.:
Eigentlich ist es doch ganz einfach. Zuerst prüfst Du auf Intersection. Wenn das der Fall ist, prüfst Du die Ecken.

Ja, aber das ist ja genau mein Problem

Quaxli hat gesagt.:
Ein Vorschlag nimm Dir ein Blatt Papier und mal es Dir auf, dann ist kommst Du relativ schnell drauf.

Ich hab hier schon seit Gestern ca. nen halben Block Papier verbraucht, bin aber leider auch nicht weitergekommen. Das Einzige, was es mir gebracht hat, ist, dass ich rausgefunden habe, wie ich überhaupt eine Kollision feststellen kann. Weiter bin ich nicht gekommen, deswegen wende ich mich ja an euch.

Quaxli hat gesagt.:
Eine Pauschllösung kann Dir keiner so einfach anbieten, weil Du z. B. nicht geschrieben hast, wie groß in etwa die beiden Rechtecke sind oder was geschehen soll, wenn sie genau im 45° Winkel aufeinandertreffen, usw.

Die Rechtecke sind unterschiedlich groß, können aber auch gleich groß sein. Sollte genau Ecke auf Ecke treffen möchte ich das natürlich auch irgendwie mitbekommen. Generell gesagt, sollen Sie voneinander abprallen. Dabei ist es nicht unbedingt notwendisch realistisch zu sein, wäre aber schön.

Quaxli hat gesagt.:
Versuch Dich erst mal selbst an der Lösung (inkl. Aufmalen!) , dann lernst Du am meisten dabei. Wenn Du dann nicht weiter kommst, erzähl mal ein bißchen von den Rahmenbedingungen, dann können wir auch konkrete Tipps geben.

Ich hoffe das waren genug Rahmenbedingungen ;) .

@byto Hört sich interesant an, werd ich mal ein bisschen mit rumprobieren! Aber dennoch würde ich gerne wissen, wie soetwas manuell Funktioniert, aus dem Code von Rectangle werd ich nicht wirklich schlau :oops:

Danke und mfg

ich²
 

Quaxli

Top Contributor
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class Test extends JFrame{

	private static final long	serialVersionUID	= 1L;
	Rectangle2D rec1;
	Rectangle2D rec2;


	
	public static void main(String[] args) {
		new Test();
	}
	
	public Test(){
		setLocation(100,100);
		setSize(400,400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBackground(Color.black);
		
		createRectangles();
		
		setVisible(true);
	}
	
	public void paint(Graphics g){
		g.setColor(Color.red);
		g.drawRect((int)rec1.getX(), (int)rec1.getY(), (int)rec1.getWidth(), (int)rec1.getHeight());
		g.setColor(Color.blue);
		g.drawRect((int)rec2.getX(),(int) rec2.getY(), (int)rec2.getWidth(), (int)rec2.getHeight());
	}
	
	private void createRectangles(){
		
		rec1 = new Rectangle2D.Double(50,50,50,50);
		rec2 = new Rectangle2D.Double(20,80,70,30);
		
		//Kollision???
		if(rec1.intersects(rec2)){
      checkCollision();
		}
		
	}
	
	//Kollisionsermittlung - Rec1 = eines der Rechtecke, Rec2 = intersection
	private void checkCollision(){
		
		System.out.println("Kollison für Rec2:");
		
		Line2D oben = new Line2D.Double(rec1.getX(),rec1.getY(),rec1.getX()+rec1.getWidth(),rec1.getY());
		Line2D unten = new Line2D.Double(rec1.getX(),rec1.getY()+rec1.getHeight(),rec1.getX()+rec1.getWidth(),rec1.getY()+rec1.getHeight());
		Line2D links = new Line2D.Double(rec1.getX(),rec1.getY(),rec1.getX(),rec1.getY()+getHeight());
		Line2D rechts = new Line2D.Double(rec1.getX()+rec1.getWidth(),rec1.getY(),rec1.getX()+rec1.getWidth(),rec1.getY()+rec1.getHeight());
    
    if(rec2.intersectsLine(oben)){
    	System.out.println("Rec2 kommt von oben");
    }
    
    if(rec2.intersectsLine(unten)){
    	System.out.println("Rec2 kommt von unten");
    }

    if(rec2.intersectsLine(links)){
    	System.out.println("Rec2 kommt von links");
    }

    if(rec2.intersectsLine(rechts)){
    	System.out.println("Rec2 kommt von rechts");
    }

    
		
	}

}


Oben ein sehr einfaches Beispiel. Da es nur Anzeigefunktionalität besitzt, habe ich die Kollisionsermittlung gleich nach der Erzeugung der Rechteck eingebaut. Die Ausgabe in die Konsolen ersetzt Du am Besten durch booleans, die Du entsprechend auf true setzt und machst hinterher Deine Logik dran fest.
 
I

ich²

Gast
Danke erstmal für dein Beispiel. Nachdem ich gerne selbst verstehe, was da vor sich geht, hab ich noch ein bisschen rumprobiert. Und das ist dabei herausgekommen (danke an Hobbit, der hat mir dabei geholfen):

Wenn eine Kollision zutrifft, dann

Code:
			if (pixelV > 0) {
				if (pixelH > 0) {
					if (posX + width - w.getPosX() > posY + height - w.getPosY()) {
						changeVertical();
					}
					else if (posX + width - w.getPosX() < posY + height - w.getPosY()) {
						changeHorizontal();
					}
					else {
						changeHorizontal();
						changeVertical();
					}
				}
				else {
					if (w.getPosX() + w.getWidth() - getPosX() > posY + height - w.getPosY()) {
						changeVertical();
					}
					else if (w.getPosX() + w.getWidth() - getPosX() < posY + height - w.getPosY()) {
						changeHorizontal();
					}
					else {
						changeHorizontal();
						changeVertical();
					}
				}
			}
			else {
				if (pixelH > 0) {
					if (posX + width - w.getPosX() > w.getPosY() + w.getHeight() - getPosY()) {
						changeVertical();
					}
					else if (posX + width - w.getPosX() < w.getPosY() + w.getHeight() - getPosY()) {
						changeHorizontal();
					}
					else {
						changeHorizontal();
						changeVertical();
					}
				}
				else {
					if (w.getPosX() + w.getWidth() - getPosX() > w.getPosY() + w.getHeight() - getPosY()) {
						changeVertical();
					}
					else if (w.getPosX() + w.getWidth() - getPosX() < w.getPosY() + w.getHeight() - getPosY()) {
						changeHorizontal();
					}
					else {
						changeHorizontal();
						changeVertical();
					}
				}
			}

pixelH/pixelV ist die momentane Horizontale bzw. Vertikale Bewegung. Nach einem Kurztest, scheint es zu funktionieren, oder sieht noch wer eine Schwachstelle?

mfg

ich²
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Kollision zweier Rechtecke, Schnittpunkte bestimmen Java Basics - Anfänger-Themen 25
T Kollision von 2 Objekten Java Basics - Anfänger-Themen 2
dome385 Ball Ball Kollision physikalisch korrekt Java Basics - Anfänger-Themen 5
L Grafik Kollision Detektierung Java Basics - Anfänger-Themen 4
J Kollision eines Kreises mit einem 270° Winkel im 2D-Raum Java Basics - Anfänger-Themen 29
S Problem bei Kollision zwischen Array-objekten! Java Basics - Anfänger-Themen 2
B Kollision tritt nie ein ? Java Basics - Anfänger-Themen 15
D Frage zu Kollision Java Basics - Anfänger-Themen 3
T Kleines Game mit Kollision Java Basics - Anfänger-Themen 2
J Ball->Wand Kollision - Ball bleibt an Decke und Boden hängen Java Basics - Anfänger-Themen 2
J Tilemap Kollision Java Basics - Anfänger-Themen 25
T Kollision bei Wänden Java Basics - Anfänger-Themen 2
M OOP Kollision entdecken Java Basics - Anfänger-Themen 4
TheKing Tile Map - Kollision Java Basics - Anfänger-Themen 2
V Rennspiel, Kollision Java Basics - Anfänger-Themen 19
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
J Transformation zweier Integer in ein Double Java Basics - Anfänger-Themen 26
H Gemeinsame Schnittmenge zweier Arrays ausgeben Java Basics - Anfänger-Themen 12
F Erstellen zweier Objekte mit dem selben Inhalt Java Basics - Anfänger-Themen 1
K Datentypen Einträge zweier Matrizen vergleichen Java Basics - Anfänger-Themen 4
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
S Implementieren zweier Klassen Java Basics - Anfänger-Themen 5
P Ungerade Zahlen ausgeben lassen zwischen Spannweite zweier eingegeben zahlen Java Basics - Anfänger-Themen 6
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
K Multiplikation zweier Matrizen Java Basics - Anfänger-Themen 23
D Zusammenfassen zweier Programme Java Basics - Anfänger-Themen 3
B Kreuzprodukt zweier Vektoren (Erste Java Aufgabe - Hilfestellungen und Tips erwünscht) Java Basics - Anfänger-Themen 4
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
C Proportionale Abnahme zweier Werte Java Basics - Anfänger-Themen 4
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
C Inhalte zweier Vektoren vergleichen Java Basics - Anfänger-Themen 3
T Programm, das die Differenz zweier Daten ausgibt Java Basics - Anfänger-Themen 4
S Ermittlung des GGTs zweier Werte Java Basics - Anfänger-Themen 5
Y Erste Schritte Verknüpfung zweier JAVA-Codes Java Basics - Anfänger-Themen 8
A Methoden Gedanken Anstöße zur Realisierung zweier Ideen (Grafisch Sekunden zählen und Frameaufteilung) Java Basics - Anfänger-Themen 18
I Einlese Abfrage zweier Variablen in einem Fenster Java Basics - Anfänger-Themen 6
A Durchschnitt zweier Mengen berechnen Java Basics - Anfänger-Themen 3
G Kombination zweier Befehle (Preis festlegen & Rabatt berechnen) Java Basics - Anfänger-Themen 3
W Methoden größe zweier tiere vergleichen Java Basics - Anfänger-Themen 15
K Schnitt zweier Ebenen ergibt Gerade Java Basics - Anfänger-Themen 10
L vergleich zweier texte Java Basics - Anfänger-Themen 18
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
J Addition zweier Zahlen Java Basics - Anfänger-Themen 9
J Dimensionen zweier Arrays vergleichen Java Basics - Anfänger-Themen 4
U Größenvergleich / Dimensionsvergleich zweier Matrizen Java Basics - Anfänger-Themen 2
N Datenaustausch zweier rechner Java Basics - Anfänger-Themen 4
turmaline Gleicheit zweier Listen Java Basics - Anfänger-Themen 12
S Print Methode zweier "Classes" kombinieren Java Basics - Anfänger-Themen 2
C Dateiinhalt zweier Dateien auf Gleichheit prüfen Java Basics - Anfänger-Themen 3
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
W Unterschiede zweier Dateien herauslesen Java Basics - Anfänger-Themen 7
P Unterschiede zweier System.in Varianten Java Basics - Anfänger-Themen 3
I Abhängigkeiten zweier Klassen Java Basics - Anfänger-Themen 25
G Vergleich zweier Arrays Java Basics - Anfänger-Themen 8
D Eine Nachkommazahl zweier Double vergleichen Java Basics - Anfänger-Themen 4
N sortieren zweier abhängiger array listen Java Basics - Anfänger-Themen 12
S Addieren zweier Arrays Java Basics - Anfänger-Themen 10
T ermittlung des minimus zweier eingegebener werte Java Basics - Anfänger-Themen 7
G größere zweier zahlen ermitteln und ausgeben Java Basics - Anfänger-Themen 6
G Summe zweier doubles falsch? Java Basics - Anfänger-Themen 10
H Genauigkeit beim Multiplizieren zweier Zahlen Java Basics - Anfänger-Themen 2
K Vergleich zweier Objekte in einer HashMap Java Basics - Anfänger-Themen 6
B Zusammenspiel zweier JFrames Java Basics - Anfänger-Themen 2
A Schnitt zweier Rechtecke ermitteln Java Basics - Anfänger-Themen 2
N Vergleich zweier Elemente verschiedener Vectoren Java Basics - Anfänger-Themen 2
G Vergleich zweier 'long'-Werte. Problem! Java Basics - Anfänger-Themen 6
T Inhalte zweier Variablen tauschen Java Basics - Anfänger-Themen 18
U Maximum zweier Zahlen ermitteln Java Basics - Anfänger-Themen 7
N Den Inhalt zweier Strings (Zahlen) addieren Java Basics - Anfänger-Themen 5
S maximum zweier Zahlen Java Basics - Anfänger-Themen 1
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
K zwei Rechtecke auf Berührung prüfen Java Basics - Anfänger-Themen 2
S mehrere Rechtecke in ein Panel Java Basics - Anfänger-Themen 2
M flaeche 2er schneidender rechtecke Java Basics - Anfänger-Themen 6
S Rechtecke zu moeglichst groesseren Rechtecken kombinieren? Java Basics - Anfänger-Themen 7
L rechtecke zeichnen anhand von matrix Java Basics - Anfänger-Themen 27
B wie kann man mehrere rechtecke erzeugen? Java Basics - Anfänger-Themen 3
H Rechtecke, Quadrate. Was soll ich machen? Java Basics - Anfänger-Themen 2
J rechtecke als hintergrund / thread Java Basics - Anfänger-Themen 4
S Gezeichnete Rechtecke werden nicht dargestellt Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben