Чему равна площадь пересечения двух одинаковых квадратов на рисунке, если длина стороны каждого равна 2, а точка О является центром одного из них?
update
Быстрее всех был Eugene Dobrovolskyi.
Ответ
Площадь пересечения равна четверти площади квадрата, то есть 1 кв.ед. Это видно из следующего рисунка.
Чему равна площадь шестиугольника?
Хотя вопрос и простой, оставлю в качестве шпаргалки-сниппета:
#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 растет сверху вниз, то необходимо внести соответствующие поправки).
Идея простая, иллюстрируется на картинке (показано как определяется ширина общего прямоугольника, высота определяется аналогично):
Кхм. Очень просто. Пусть прямоугольник $%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$%
На плоскости даны два прямоугольника, каждый прямоугольник задан координатами левого нижнего и правого верхнего угла. Найдите площадь пересечения этих прямоугольников.
ВХОДНЫЕ ДАННЫЕ
Программа получает на вход 8 чисел. Сначала даны координаты левого нижнего угла первого прямоугольника . Затем даны координаты правого верхнего угла первого прямоугольника . Затем аналогично даны координаты второго прямоугольника и .
Числа заданы по одному числу в строке, −10000⩽x1
ВЫХОДНЫЕ ДАННЫЕ
Программа должна выводить одно целое число – площадь пересечения данных прямоугольников.
-
Вопрос заданболее трёх лет назад
-
2526 просмотров
s = 0
x1=int(input())
y1=int(input())
x2=int(input())
y2=int(input())
x3=int(input())
y3=int(input())
x4=int(input())
y4=int(input())
# границы области пересечения
left = max(x1, x3) # левая
bottom = max(y1, y3) # нижняя
right = min(x2, x4) # правая
top = min(y2, y4) # верхняя
width = right — left # ширина пересечения
height = top — bottom # высота пересечения
# если ширина и высота области пересечения меньше или равны 0
if width <= 0 or height <= 0:
# то его площадь 0
—-print(0)
else:
# если больше 0, то выводим площадь
—-print(width * height)
вместо — ставить пробелы
Пригласить эксперта
-
Показать ещё
Загружается…
25 мая 2023, в 05:30
1000 руб./за проект
25 мая 2023, в 05:14
5000 руб./за проект
25 мая 2023, в 02:38
1000 руб./за проект
Минуточку внимания
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