Как найти площадь пересечения двух прямоугольников

Хотя вопрос и простой, оставлю в качестве шпаргалки-сниппета:

#include <algorithm>

/*
    x1, y1 - левая нижняя точка первого прямоугольника
    x2, y2 - правая верхняя точка первого прямоугольника
    x3, y3 - левая нижняя точка второго прямоугольника
    x4, y4 - правая верхняя точка второго прямоугольника
*/
int f(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
    int left = std::max(x1, x3);
    int top = std::min(y2, y4);
    int right = std::min(x2, x4);
    int bottom = std::max(y1, y3);

    int width = right - left;
    int height = top - bottom;

    if (width < 0 || height < 0)
        return 0;

    return width * height;
}

Исходя из вопроса, полагаю, что координаты растут из нижнего левого угла (если же Y растет сверху вниз, то необходимо внести соответствующие поправки).

Идея простая, иллюстрируется на картинке (показано как определяется ширина общего прямоугольника, высота определяется аналогично):

введите сюда описание изображения

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Бывает возникнет какая-нибудь простенькая задачка, наподобие заявленной в теме поста, а ты сидишь и тупишь в монитор полдня. Вот для таких случаев я, в свое время, и заводил блог — чтобы при необходимости можно было достаточно быстро найти ответ на вопрос, который ранее решался. Итак, исходные условия задачи: есть два прямоугольника со сторонами параллельными осям координат. Необходимо найти площадь пересечения этих прямоугольников, используя возможности Delphi.

Задача решается также просто, как и звучит. Графически задача выглядит следующим образом:

Нам необходимо найти площадь заштрихованной области. Для решения задачи необходимо знать координаты четырех точек:

  1. (X1, Y1) — координаты нижнего левого угла первого прямоугольника
  2. (X2, Y2) — координаты верхнего правого угла первого прямоугольника
  3. (X3, Y3) — координаты нижнего левого угла второго прямоугольника
  4. (X4, Y4) — координаты верхнего правого угла второго прямоугольника

Графически, условия задачи будут выглядеть так:

Вычисления будут такими (подробно):

uses Math, System.Types;
function Intersection(P1, P2, P3, P4: TPointF): double;
// P1 - (X1, Y1) - координаты нижнего левого угла первого прямоугольника
// P2 - (X2, Y2) - координаты верхнего правого угла первого прямоугольника
// P3 - (X3, Y3) - координаты нижнего левого угла второго прямоугольника
// P4 - (X4, Y4) - координаты верхнего правого угла второго прямоугольника
var Left, Top, Right, Bottom: double;
    Width, Height: double;
begin
  Left:=Max(P1.X,P3.X);
  Top:=Min(P2.Y, P4.Y);
  Right:=Min(P2.X, P4.X);
  Bottom:=Max(P1.Y, P3.Y);
  Width:=Right-Left;
  Height:=Top-Bottom;
  if (Width&lt;=0) or (Height&lt;=0) then
    raise Exception.Create('Прямоугольники не пересекаются');
  Result:=Width*Height;
end;

Если прямоугольники не пересекаются, то функция выдаст исключение «Прямоугольники не пересекаются», иначе — площадь пересечения двух прямоугольников.

3.5
4
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Кхм. Очень просто. Пусть прямоугольник $%A$% ограничен координатами $%(X_{ЛA}, Y_{НA}, X_{ПA}, Y_{ВA})$%, а прямоугольник $%B$% — координатами $%(X_{ЛB}, Y_{НB}, X_{ПB}, Y_{ВB})$%, где Л — лево, П — право, Н — низ, В — верх.

  1. Проверить условия перекрытия, например, если $%X_{ПA} < X_{ЛB}$%, то прямоугольники не пересекаются, общая площадь равна нулю.
  2. Определить стороны прямоугольника образованного пересечением, например, если $%X_{ПA} > X_{ЛB}$%, а $%X_{ЛA} < X_{ЛB}$%, то $%Delta X=X_{ПA}-X_{ЛB}$%
  3. Определить площадь, как произведение сторон: $%S_{AB}=Delta X ast Delta Y$%

Mnemonik39

24 / 6 / 3

Регистрация: 06.12.2015

Сообщений: 315

1

Нахождение площади пересечения двух прямоугольников

11.02.2017, 21:16. Показов 21714. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Заранее извиняюсь за казалось бы абсурдный вопрос, но к сожалению ничего вменяемого нагуглить для Шарпа не смог. Два прямоугольника, стороны параллельны осям координат. Есть координаты верхней левой вершины прямоугольника, есть ширина, высота, есть свойства Bottom = Top + Height, есть свойство Right = Left + Width. Библиотечные ф-ии использовать нельзя кроме Math.Min() и Math.Max(). Попытался сам все расчертить. Вроде проанализировал для одного случая выдает правильно, для других случаев чеккер выдает ошибку. Заранее спасибо если поможете.
Вот мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
public static int IntersectionSquare(Rectangle r1, Rectangle r2)
        {
            int square;
            if (AreIntersected(r1, r2))// метод проверяющий пересекаются или нет прямоугольники
                if (r1.Right >= r2.Right || r1.Bottom >= r2.Bottom)
                    return square = (r1.Right + r2.Width - r2.Right) * (r1.Bottom + r2.Height - r2.Bottom);
            else if(r1.Right <= r2.Right || r1.Bottom <= r2.Bottom)
                    return square = (r1.Right + r2.Width - r1.Right) * (r1.Bottom + r2.Height - r1.Bottom);
 
            return 0;
            
        }



0



906 / 663 / 318

Регистрация: 23.10.2016

Сообщений: 1,543

11.02.2017, 21:28

2

Mnemonik39,
1) Найдите длину пересечения отрезков [r1.Left; r1.Right] и [r2.Left; r2.Right]
2) Найдите длину пересечения отрезков [r1.Top; r1.Bottom] и [r2.Top; r2.Bottom]
3) Перемножьте полученные результаты



0



83 / 84 / 48

Регистрация: 12.10.2013

Сообщений: 1,079

11.02.2017, 22:22

3

Да,простая геометрия.

Добавлено через 2 минуты
Было бы интереснее оформить всё это графически и динамически!!! Ч.р. Form1!



0



24 / 6 / 3

Регистрация: 06.12.2015

Сообщений: 315

11.02.2017, 22:43

 [ТС]

4

Все так и есть. ВОт 50 разных случаев в задании. И надо, чтобы один метод элегантно без нагромождений возвращал значение которое бы и считало площадь во всех случаях



0



TopLayer

906 / 663 / 318

Регистрация: 23.10.2016

Сообщений: 1,543

11.02.2017, 22:57

5

Лучший ответ Сообщение было отмечено Mnemonik39 как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int GetRectanglesIntersectionSquare(Rectangle a, Rectangle b)
{
    int xIntersection = GetSegmentsIntersectionLength(a.Left, a.Right, b.Left, b.Right);
    int yIntersection = GetSegmentsIntersectionLength(a.Top, a.Bottom, b.Top, b.Bottom);
    
    return xIntersection * yIntersection;
}
 
int GetSegmentsIntersectionLength(int aLeft, int aRight, int bLeft, int bRight)
{
    int left = Math.Max(aLeft, bLeft);
    int right = Math.Min(aRight, bRight);
    
    return Math.Max(right - left, 0);
}

Добавлено через 4 минуты

Не по теме:

Цитата
Сообщение от Mnemonik39
Посмотреть сообщение

ВОт 50 разных случаев в задании.

Было бы 100 — было бы в 2 раза сложнее



1



24 / 6 / 3

Регистрация: 06.12.2015

Сообщений: 315

11.02.2017, 23:03

 [ТС]

6

Большое спасибо…



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

11.02.2017, 23:03

Помогаю со студенческими работами здесь

Известны длины сторон двух прямоугольников. Вычислить площади прямоугольников и сравнить их. Определить, являются ли прямоугольники квадратами…
Привет , ребята нужна помощь
Разместите на форме Элементы управления для решения задачи
Известны…

Нахождение площадей пересечения случайных прямоугольников
Предположим у меня есть некоторое количество прямоугольников (точек x;y которые образуют…

Нахождение площади пересечения колец
program project1;
var x1,x2,y1,y2,q1,q2,r1,r2,s1,s2,f1,f2,d,l,s:real;
begin

Нахождение площади под графиком методом прямоугольников
Есть график cos’инуса. Требуется найти две площади под ним. Первая-это практическая (методом…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

I have a problem where I have TWO NON-rotated rectangles (given as two point tuples {x1 x2 y1 y2}) and I like to calculate their intersect area. I have seen more general answers to this question, e.g. more rectangles or even rotated ones, and I was wondering whether there is a much simpler solution as I only have two non-rotated rectangles.

What I imagine should be achievable is an algorithm that only uses addition, subtraction and multiplication, possibly abs() as well. What certainly should not be used are min/max, equal, greater/smaller and so on, which would make the question obsolete.

Thank you!

EDIT 2: okay, it’s become too easy using min/max or abs(). Can somebody show or disprove the case only using add/sub/mul?

EDIT: let’s relax it a little bit, only conditional expressions (e.g. if, case) are prohibited!

PS: I have been thinking about it for a half hour, without success, maybe I am now too old for this :)

Понравилась статья? Поделить с друзьями:
  • Как найти деревни которых нет на картах
  • Usbmsc identifier non unique хакинтош как исправить
  • Как найти телеграм канал по фото
  • Как найти нулевые элементы массива
  • Как составить бухгалтерскую отчетность для банка