Ответ 1
Возможно, я неверно истолковал ваш вопрос, но не выполняет ли это Rectangle.Intersect
метод? Он возвращает пересекающуюся область, а затем вы можете легко вычислить ее область.
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() я думал об использовании теста разделительной оси, но если у прямоугольников есть только горизонтальные и вертикальные линии, есть еще более простой (более быстрый) способ проверить?
И для вычисления области, где они пересекаются, есть быстрый способ сделать это, если прямоугольники только горизонтальные и вертикальные линии?
Наконец, это не связано с вопросом, но я был бы признателен за любые советы, которые кто-то может иметь на хорошей книге/веб-странице, где я мог бы пересмотреть математику для компьютерной графики. Некоторое время я отсутствовал в колледже и чувствую, что забываю все:)! У кого-нибудь еще есть эта проблема?
(ПРИМЕЧАНИЕ. Я нашел этот вопрос, отличный от этого, который кажется более сложным и напрямую не отвечает на вопрос.)
Возможно, я неверно истолковал ваш вопрос, но не выполняет ли это Rectangle.Intersect
метод? Он возвращает пересекающуюся область, а затем вы можете легко вычислить ее область.
Звучит как базовое обнаружение столкновений. Вы просмотрели эту страницу в Википедии?
Mike
edit: Фредрик делает свой ответ в то же самое время, когда я сделал это, его ответ получил мое преимущество (: