2014-11-26 9 views
7

enter image description hereberechnen Überlappungsbereich zwischen zwei Rechtecken

Ich mag den Überlappungsbereich „THE GREY REGION“ zwischen roten und blauen Rechtecken berechnen.

Jedes Rechteck wird durch seine vier Eckkoordinaten definiert. Die resultierende Einheit des überlappten Bereichs ist ein Einheitsquadrat.

Ich könnte mir nicht vorstellen, wie kann ich es tun?

Alle kreativen Kommentare würden geschätzt.

+2

Also was ist dein Problem genau? Wenn Sie alle Eckpunkte kennen, können Sie die Ecke des Kreuzungsrechtecks ​​leicht berechnen. Die Eckkoordinaten und die Funktionen "min" und "max" sollten alles sein, was Sie brauchen. – cel

+0

kann formschön Ecke der Kreuzung Rechteck berechnen? –

+0

Das weiß ich nicht. Aber ich bin mir ziemlich sicher, dass Sie herausfinden können, wie Sie diese Ecken selbst berechnen können. Sehen Sie sich einfach die obere linke Ecke an: Um in der Kreuzung zu sein, müssen Sie eine x_coord haben, die mindestens so groß ist wie das Maximum von Rot und Blau und eine y_coord höchstens das Minimum von Rot und Blau hat ... Sie haben ähnliche Argumente für jeden der vier Eckpunkte. – cel

Antwort

17

Diese Art der Kreuzung ist einfach durch die Idee "Min der Maxes" und "Max der Mins" gemacht. Um es zu aufschreiben muss man einen bestimmten Begriff für das Rechteck, und, um nur die Dinge klar Ich werde eine namedtuple verwenden:

from collections import namedtuple 
Rectangle = namedtuple('Rectangle', 'xmin ymin xmax ymax') 

ra = Rectangle(3., 3., 5., 5.) 
rb = Rectangle(1., 1., 4., 3.5) 
# intersection here is (3, 3, 4, 3.5), or an area of 1*.5=.5 

def area(a, b): # returns None if rectangles don't intersect 
    dx = min(a.xmax, b.xmax) - max(a.xmin, b.xmin) 
    dy = min(a.ymax, b.ymax) - max(a.ymin, b.ymin) 
    if (dx>=0) and (dy>=0): 
     return dx*dy 

print area(ra, rb) 
# 0.5 

Wenn Sie nicht die namedtuple Notation mögen, können Sie nur verwenden:

dx = max(a[0], b[0]) - min(a[2], b[2]) 

usw., oder was immer Sie bevorzugen.

+0

Dank akzeptiert, aber funktioniert Ihr Code noch, auch wenn das blaue Polygon auf der linken Seite des roten Polygons ist? –

+0

@just: Ja, so oder so. Die Verwendung des Max- und Min-Ansatzes ist nur ein einfacher Weg zu einem ansonsten komplizierten Satz von Bedingungen, um die relativen Positionen zu bestimmen. Das heißt, lesen Sie "max (a.xmin, b.xmin)" als "die höchste linke Ecke", usw. Außerdem habe ich meine Antwort geändert, um jetzt den Fall einzuschließen, wenn sich die Rechtecke nicht schneiden. – tom10

+0

danke, ich habe es. –