2009-10-11 6 views
12

Edit:Нахождение перекрытия площадь двух прямоугольников (в C#)

Простой код, который я использовал, чтобы решить проблему в случае, если кто-либо заинтересован (спасибо 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; 
    } 

Оригинал Вопрос:

Я хотел бы знать быстрый и грязный способ проверить, перекрываются ли два прямоугольника, и если они вычислили область перекрытия. Для любопытства меня интересует случай, когда 1) все линии в обоих прямоугольниках являются либо вертикальными, либо горизонтальными или 2) общим случаем для любых двух прямоугольников, но единственный ответ, который мне действительно нужен, - это случай 1.

Я имею в виду вдоль линий:

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

    return 0; 
} 

для A.Intersects() Я думал об использовании теста отделяющей оси, но если прямоугольники имеют только горизонтальные и вертикальные линии, есть еще проще (быстрее) способ проверить?

И для расчета области, где они пересекаются, есть быстрый способ сделать это, если прямоугольники только горизонтальные и вертикальные линии?

И, наконец, это не связано с вопросом, но я был бы признателен за любые советы, которые кто-то может иметь на хорошей книге/веб-странице, где я мог бы рассмотреть математику для компьютерной графики. Некоторое время я отсутствовал в колледже и чувствую, что забываю все :)! У кого-нибудь еще есть эта проблема?

(Примечание: Я нашел этот вопрос иначе, чем this, который кажется более сложным и не сразу ответить на этот вопрос.)

+0

горизонтальный прямоугольник представляет собой вертикальный прямоугольник, зависит, какая сторона вы считаете вершину. –

+4

** если (перекрытие.IsEmpty) ** должно быть ** если (! перекрытие.IsEmpty) ** – ReinierDG

ответ

11

Может быть, я неправильно истолковать ваш вопрос, но не метод Rectangle.Intersect сделать работу? Он возвращает пересекающуюся область, а затем вы можете легко вычислить ее площадь.

+0

да, это префект :). благодаря! – Evan

1

Звучит как базовое обнаружение столкновений. Вы смотрели на this page on Wikipedia?

Майк

редактировать: Фредрик сделать его ответ в то же время я сделал это один, его ответ получил мой upvote (:

+0

Спасибо, я проверю сайт! – Evan

Смежные вопросы