if (RectA.Left < RectB.Right && RectA.Right > RectB.Left &&
RectA.Top > RectB.Bottom && RectA.Bottom < RectB.Top )
oder, bei Verwendung kartesischer Koordinaten
(X1 ist die linke Koordinate, X2 ist die rechte Koordinate, aufsteigend von links nach rechts wobei Y1 die obere Koordinate und Y2 die untere Koordinate ist, von unten nach oben ansteigend -- wenn Ihr Koordinatensystem nicht auf diese Weise funktioniert [z. B. haben die meisten Computer die Y-Richtung umgekehrt], tauschen Sie die folgenden Vergleiche aus ) ...
if (RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 &&
RectA.Y1 > RectB.Y2 && RectA.Y2 < RectB.Y1)
Angenommen, Sie haben Rechteck A und Rechteck B. Der Beweis erfolgt durch Widerspruch. Jede der vier Bedingungen garantiert, dass keine Überschneidungen bestehen können :
- Kond1. Wenn die linke Kante von A rechts von der rechten Kante von B liegt, - dann ist A völlig rechts von B
- Kond2. Wenn die rechte Kante von A links von der linken Kante von B liegt, - dann ist A völlig links von B
- Kond3. Wenn die Oberkante von A unterhalb der Unterkante von B liegt, - dann ist A vollständig unter B
- Kond4. Wenn die untere Kante von A über der oberen Kante von B liegt, - dann liegt A vollständig über B
Die Bedingung für die Nicht-Überschneidung ist also
NON-Overlap => Cond1 Or Cond2 Or Cond3 Or Cond4
Eine hinreichende Bedingung für die Überschneidung ist daher das Gegenteil.
Overlap => NOT (Cond1 Or Cond2 Or Cond3 Or Cond4)
Das De-Morgan'sche Gesetz besagt
Not (A or B or C or D)
ist dasselbe wie Not A And Not B And Not C And Not D
Mit Hilfe von De Morgan ergibt sich also
Not Cond1 And Not Cond2 And Not Cond3 And Not Cond4
Dies ist gleichbedeutend mit:
- Die linke Kante von A liegt links von der rechten Kante von B, [
RectA.Left < RectB.Right
], und
- Die rechte Kante von A liegt rechts von der linken Kante von B, [
RectA.Right > RectB.Left
], und
- A's oben über B's unten, [
RectA.Top > RectB.Bottom
], und
- A's Unterseite unter B's Oberseite [
RectA.Bottom < RectB.Top
]
Anmerkung 1 : Es ist ziemlich offensichtlich, dass dieses Prinzip auf eine beliebige Anzahl von Dimensionen ausgedehnt werden kann.
Anmerkung 2 : Es sollte auch ziemlich offensichtlich sein, dass man Überlappungen von nur einem Pixel zählen kann, indem man die <
und/oder die >
an dieser Grenze zu einem <=
oder eine >=
.
Anmerkung 3 : Diese Antwort basiert bei Verwendung kartesischer Koordinaten (X, Y) auf algebraischen kartesischen Standardkoordinaten (x steigt von links nach rechts und Y steigt von unten nach oben). Wenn ein Computersystem die Bildschirmkoordinaten anders mechanisiert (z. B. Y von oben nach unten oder X von rechts nach links), muss die Syntax natürlich entsprechend angepasst werden.
5 Stimmen
Ich würde denken, dass die Lösung für Ihr Problem nicht darin besteht tout Multiplikation.
0 Stimmen
Für den Fall, dass Sie eine Antwort für ein gedrehtes Rechteck benötigen, habe ich eine Antwort mit allen Schritten erstellt: stackoverflow.com/questions/62028169/ (es ist in Javascript, kann aber leicht in C++ reproduziert werden)