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

Чему равна площадь пересечения двух одинаковых квадратов на рисунке, если длина стороны каждого равна 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})$%, где Л — лево, П — право, Н — низ, В — верх.

  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$%

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

ВХОДНЫЕ ДАННЫЕ
Программа получает на вход 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 :)

Понравилась статья? Поделить с друзьями:
  • Как найти друга корейца в инстаграм
  • Как мне найти своего настоящего отца
  • Another instance is already running как исправить эту ошибку
  • Как найти своего участкового по фамилии
  • Как найти свой vpn сервер