2009-10-11 15 views
12

Edit:Znalezienie pokrywają obszar dwóch prostokątów (w C#)

Prosty kod użyłem, aby rozwiązać problem w przypadku gdy ktoś jest zainteresowany (dzięki 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; 
    } 

oryginalne pytanie:

Chciałbym poznać szybki i brudny sposób sprawdzenia, czy dwa prostokąty zachodzą na siebie i czy obliczyć obszar nakładania się. Dla ciekawostek interesuje mnie przypadek, w którym 1) wszystkie linie w obu prostokątach są pionowe lub poziome lub 2) ogólny przypadek dla dwóch dowolnych prostokątów, ale jedyną odpowiedzią, której naprawdę potrzebuję, jest przypadek 1.

Zastanawiam się wzdłuż linii:

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

    return 0; 
} 

Dla A.Intersects() myślałem o użyciu testu oddzielającą oś, ale jeśli prostokąty mają tylko linie poziome i pionowe tam jest jeszcze prostsze (szybciej) sposób sprawdzić?

A do obliczenia obszaru, w którym przecinają się, jest szybki sposób, aby to zrobić, jeśli prostokąty tylko linie poziome i pionowe?

Wreszcie, nie ma to związku z pytaniem, ale byłbym wdzięczny za radę, jaką ktoś może mieć na dobrej książce/stronie internetowej, na której mógłbym przejrzeć matematykę dotyczącą grafiki komputerowej. Jestem na studiach przez jakiś czas i czuję, że zapominam o wszystkim :)! Ktoś jeszcze ma ten problem?

(UWAGA: Znalazłem to pytanie innego niż this który wydaje się bardziej skomplikowana i nie bezpośrednio odpowiedzieć na pytanie.)

+0

Pozioma prostokąt pionowy prostokąt, zależy po której stronie za –

+4

** (overlap.IsEmpty) ** powinien być ** jeśli (! overlap.IsEmpty) ** – ReinierDG

Odpowiedz

11

Może błędnie interpretują to pytanie, ale nie ma sposobu Rectangle.Intersect wykonać zadanie? Zwraca obszar przecinający się, a następnie można łatwo obliczyć jego obszar.

+0

tak, to jest perfekcyjne :). dzięki! – Evan

1

Brzmi jak podstawowe wykrywanie kolizji. Pan spojrzał na this page on Wikipedia?

Mike

edit: Fredrik dokonać jego odpowiedź w tym samym czasie zrobiłem to jedno, a jego odpowiedź dostałem upvote (:

+0

Dzięki, sprawdź stronę! – Evan

Powiązane problemy