Überprüfen Sie, ob sich in Java zwei Rechtecke überlappen
1. Überblick
In diesem kurzen Tutorial lernen wir, ein algorithmisches Problem zu lösen, bei dem überprüft wird, ob sich die beiden angegebenen Rechtecke überlappen.
Wir werden uns zunächst die Problemdefinition ansehen und dann schrittweise eine Lösung entwickeln.
Schließlich werden wir es in Java implementieren.
2. Problem Definition
Nehmen wir an, wir haben zwei gegebene Rechtecke -r1 undr2. Wir müssen prüfen, ob es zwischenr1 undr2 mindestens einen gemeinsamen Punkt gibt. Wenn ja, bedeutet dies einfach, dass sich diese beiden Rechtecke überlappen.
Schauen wir uns einige Beispiele an:
Wenn wir den allerletzten Fall bemerken, haben die Rechtecker1 undr2 keine sich überschneidenden Grenzen. Sie überlappen jedoch Rechtecke, da jeder Punkt inr1 auch ein Punkt inr2 ist.
3. Ersteinrichtung
Um dieses Problem zu lösen, sollten wir zunächst programmgesteuert ein Rechteck definieren. A rectangle can be easily represented by its bottom-left and top-right coordinates:
public class Rectangle {
private Point bottomLeft;
private Point topRight;
//constructor, getters and setters
boolean isOverlapping(Rectangle other) {
...
}
}
Dabei istPoint eine Klasse, die einen Punkt(x,y) im Raum darstellt:
public class Point {
private int x;
private int y;
//constructor, getters and setters
}
Wir werden später die MethodeisOverlapping(Rectangle other)in unserer KlasseRectangledefinieren, um zu überprüfen, ob sie sich mit einem anderen gegebenen Rechteck überschneidet -other.
4. Lösung
Die zweigiven rectangles won’t overlap if einer der folgenden Bedingungen sind wahr:
-
Eines der beiden Rechtecke befindet sich über der Oberkante des anderen Rechtecks
-
Eines der beiden Rechtecke befindet sich links vom linken Rand des anderen Rechtecks
In allen anderen Fällen überlappen sich die beiden Rechtecke. Um uns selbst zu überzeugen, können wir immer mehrere Beispiele anführen.
5. Java-Implementierung
Nachdem wir die Lösung verstanden haben, implementieren wir dieisOverlapping()-Methode:
public boolean isOverlapping(Rectangle other) {
if (this.topRight.getY() < other.bottomLeft.getY()
|| this.bottomLeft.getY() > other.topRight.getY()) {
return false;
}
if (this.topRight.getX() < other.bottomLeft.getX()
|| this.bottomLeft.getX() > other.topRight.getX()) {
return false;
}
return true;
}
UnsereisOverlapping()-Methode in derRectangle-Klasse gibtfalse zurück, wenn eines der Rechtecke entweder über oder links vom anderen liegt, andernfallstrue.
Um herauszufinden, ob ein Rechteck über dem anderen liegt, vergleichen wir ihrey-coordinates. Ebenso vergleichen wir diex-coordinates, um zu überprüfen, ob sich ein Rechteck links vom anderen befindet.
6. Fazit
In diesem kurzen Artikel haben wir gelernt, wie ein algorithmisches Problem gelöst werden kann, bei dem festgestellt wird, ob sich die beiden angegebenen Rechtecke überlappen. Es dient als Kollisionserkennungsstrategie für zwei rechteckige Objekte.
Wie üblich ist der gesamte Quellcodeover on Github. verfügbar