Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Mike

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