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

Редактировать:

Простой код, который я использовал для решения проблемы, если кому-то интересно (спасибо Фредрику):

    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 () я думал об использовании теста разделяющей оси, но если прямоугольники имеют только горизонтальные и вертикальные линии, есть ли еще более простой (более быстрый) способ проверки?

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

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

(ПРИМЕЧАНИЕ: я обнаружил, что этот вопрос отличается от этого, что кажется более сложным и не дает прямого ответа на вопрос.)


person Evan    schedule 11.10.2009    source источник
comment
Горизонтальный прямоугольник - это вертикальный прямоугольник, в зависимости от того, какую сторону вы считаете верхней.   -  person Danny Varod    schedule 11.10.2009
comment
if (overlap.IsEmpty) должен быть if (! overlap.IsEmpty)   -  person ReinierDG    schedule 16.06.2010


Ответы (2)



Похоже на базовое обнаружение столкновений. Вы просматривали эту страницу в Википедии?

Майк

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

person Mike B    schedule 11.10.2009
comment
Спасибо, проверю сайт! - person Evan; 11.10.2009