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

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 ]

12 голосов
/ 11 октября 2009

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

1 голос
/ 11 октября 2009

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

Mike

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

...