Хотя вопрос и простой, оставлю в качестве шпаргалки-сниппета:
#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.
Задача решается также просто, как и звучит. Графически задача выглядит следующим образом:
Нам необходимо найти площадь заштрихованной области. Для решения задачи необходимо знать координаты четырех точек:
- (X1, Y1) — координаты нижнего левого угла первого прямоугольника
- (X2, Y2) — координаты верхнего правого угла первого прямоугольника
- (X3, Y3) — координаты нижнего левого угла второго прямоугольника
- (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<=0) or (Height<=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})$%, где Л — лево, П — право, Н — низ, В — верх.
- Проверить условия перекрытия, например, если $%X_{ПA} < X_{ЛB}$%, то прямоугольники не пересекаются, общая площадь равна нулю.
- Определить стороны прямоугольника образованного пересечением, например, если $%X_{ПA} > X_{ЛB}$%, а $%X_{ЛA} < X_{ЛB}$%, то $%Delta X=X_{ПA}-X_{ЛB}$%
- Определить площадь, как произведение сторон: $%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(). Попытался сам все расчертить. Вроде проанализировал для одного случая выдает правильно, для других случаев чеккер выдает ошибку. Заранее спасибо если поможете.
0 |
906 / 663 / 318 Регистрация: 23.10.2016 Сообщений: 1,543 |
|
11.02.2017, 21:28 |
2 |
Mnemonik39,
0 |
83 / 84 / 48 Регистрация: 12.10.2013 Сообщений: 1,079 |
|
11.02.2017, 22:22 |
3 |
Да,простая геометрия. Добавлено через 2 минуты
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 |
|||
Решение
Добавлено через 4 минуты Не по теме:
ВОт 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 |
Помогаю со студенческими работами здесь Известны длины сторон двух прямоугольников. Вычислить площади прямоугольников и сравнить их. Определить, являются ли прямоугольники квадратами… Нахождение площадей пересечения случайных прямоугольников Нахождение площади пересечения колец Нахождение площади под графиком методом прямоугольников Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 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