2009-10-11 11 views
12

Edit:Trovare l'area di sovrapposizione di due rettangoli (in C#)

semplice codice che ho usato per risolvere il problema nel caso in cui qualcuno è interessato (grazie a Fredrik):

int windowOverlap(Rectangle rect1, Rectangle rect2) 
    { 
     if (rect1.IntersectsWith(rect2)) 
     { 
      Rectangle overlap = Rectangle.Intersect(rect1, rect2); 
      if (overlap.IsEmpty) 
       return overlap.Width * overlap.Height; 
     } 

     return 0; 
    } 

domanda iniziale:

Mi piacerebbe sapere un modo rapido e sporco per verificare se due rettangoli si sovrappongono e se calcolano l'area della sovrapposizione. Per curiosità sono interessato al caso in cui 1) tutte le linee in entrambi i rettangoli sono verticali o orizzontali o 2) nel caso generale di due rettangoli, ma l'unica risposta che mi serve è il caso 1.

sto pensando lungo le linee di:

double areaOfOverlap(Rect A, Rect B) 
{ 
    if (A.Intersects(B)) 
    { 
     // calculate area 
     // return area 
    } 

    return 0; 
} 

Per A.Intersects() Stavo pensando di utilizzare il test assi di separazione, ma se i rettangoli hanno solo linee orizzontali e verticali c'è un ancora più semplice (più veloce) modo di controllare?

E per calcolare l'area in cui si intersecano c'è un modo rapido per farlo se i rettangoli sono solo linee orizzontali e verticali?

Infine, questo non è correlato alla domanda, ma mi piacerebbe qualsiasi consiglio che qualcuno potrebbe avere su un buon libro/pagina web in cui potrei rivedere la matematica per la grafica computerizzata. Sono fuori dal college da un po 'e sento che sto dimenticando tutto :)! Qualcun altro ha quel problema?

(NOTA: ho trovato questa domanda diversa rispetto this che sembra più complicato e non risponde direttamente alla domanda.)

+0

Un rettangolo orizzontale è un rettangolo verticale, dipende da che parte consideri la parte superiore. –

+4

** if (overlap.IsEmpty) ** dovrebbe essere ** if (! overlap.IsEmpty) ** – ReinierDG

risposta

11

Forse mi fraintendere tua domanda, ma non lo fa il metodo Rectangle.Intersect fare il lavoro? Restituisce l'area intersecante e quindi è possibile calcolare facilmente l'area di esso.

+0

sì, questo è il prefetto :). Grazie! – Evan

1

Suona come rilevamento collisione di base. Hai guardato this page on Wikipedia?

Mike

edit: Fredrik fare la sua risposta allo stesso tempo ho fatto questo, la sua risposta ha ottenuto il mio upvote (:

+0

Grazie, controllerò il sito! – Evan

Problemi correlati