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

Edit:

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

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

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

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

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

2 ответов


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


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

Майк

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