Prüfen Sie, ob sich zwei Rechtecke in Java überlappen

Ü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:

image

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:

  1. Eines der beiden Rechtecke befindet sich über der Oberkante des anderen Rechtecks

  2. Eines der beiden Rechtecke befindet sich links vom linken Rand des anderen Rechtecks

image

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