2014-11-26 92 views
7

enter image description hereCalcolare area di sovrapposizione tra i due rettangoli

voglio calcolare l'area di sovrapposizione "THE GRAY REGIONE" tra i rettangoli rossi e blu.

Ogni rettangolo è definito dalle sue quattro coordinate d'angolo. L'unità risultante dell'area sovrapposta è unità quadrata.

Non riesco a immaginare come posso farlo?

Eventuali commenti creativi sarebbero apprezzati.

+2

Quindi qual è il tuo problema esattamente? Se conosci tutti i punti degli angoli, puoi facilmente calcolare l'angolo del rettangolo di intersezione. Le coordinate dell'angolo e le funzioni 'min' e' max' dovrebbero essere tutto ciò di cui hai bisogno. – cel

+0

fa shapely in grado di calcolare l'angolo del rettangolo di intersezione? –

+0

Non lo so. Eppure, sono abbastanza sicuro che puoi capire come puoi calcolare quegli angoli da solo. Guarda l'angolo in alto a sinistra: per essere nell'intersezione devi avere un x_coord grande almeno quanto il massimo delle estremità sinistra del rosso e del blu e un y_coord al massimo il minimo delle estremità superiori del rosso e del blu ... hai argomenti simili per ciascuno dei quattro punti d'angolo. – cel

risposta

17

Questo tipo di intersezione è facilitato dall'idea "min of the maxes" e "max of the mins". Per scrivere fuori uno ha bisogno di una nozione specifica per il rettangolo, e, solo per rendere le cose chiare userò un namedtuple:

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 

Se non ti piace la notazione namedtuple, si potrebbe utilizzare:

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

ecc., O qualunque altra annotazione tu preferisca.

+0

grazie accettato, ma il tuo codice funziona ancora anche se il poligono blu si trova sul lato sinistro del poligono rosso? –

+0

@just: Sì, funziona in entrambi i modi. Usare l'approccio max e min è solo un modo semplice di quello che altrimenti sarebbe un complicato insieme di condizionali per determinare le posizioni relative. Ovvero, leggi 'max (a.xmin, b.xmin)' come "l'angolo rettamente più a sinistra", ecc. Inoltre, ho cambiato la mia risposta per includere ora il caso in cui i rettangoli non si intersecano. – tom10

+0

grazie, ho capito. –