Перейти к содержимому

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

  • автор:

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

Есть два прямоугольника стороны, которых параллельны осям и они пересекаются. Нам известно: (x1,y1) — левая нижняя точка первого прямоугольника (x2,y2) — правая верхняя точка первого прямоугольника (x3,y3) — левая нижняя точка второго прямоугольника (x4,y4) — правая верхняя точка второго прямоугольника И нужно найти площадь их пересечения. Но пересекатся они могут с разних сторон.

Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 14 дек 2017 в 21:45
Oleksii Havryshkiv Oleksii Havryshkiv
111 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков

@Igor просто у меня есть много прямоугольников которие нужно перебирать одни с другими. И не могу понять как найти площадь пересечения каждого с каждим. Как их перебратить и пересекаются ли они я знаю. А вот етого понять не могу. Так как ети прямоугольники могут пересекатся с разних сторон. Если знаете, то помогите пожалуйста

14 дек 2017 в 21:52
Можно для обоих найти общий прямоугольник, а затем умножить его ширину на высоту.
14 дек 2017 в 21:56
@VladimirGamalyan да ну как найти нужное нам пересечение.
14 дек 2017 в 21:58

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

#include /* 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)

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

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

Алгоритм нахождения площади пересечения

Вот задача, но мне не нужен код, помогите с алгоритмом нахождения площади пересечения.

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

Ваша программа должна вводить с клавиатуры числа x1, y1, x2, y2, x3, y3, x4, y4. Числа xi, yi будут вводиться в i-строке (1≤i≤4) и разделяться одним пробелом. Точки (x1, y1) и (x2, y2) – координаты двух противоположных углов первого прямоугольника. Точки (x3, y3) и (x4, y4) – координаты двух противоположных углов второго прямоугольника.

Числа xi, yi – целые; 0≤xi, yi≤30000; оба прямоугольника имеют ненулевую площадь.

Ваша программа должна вывести на экран одно число S – площадь общей части двух введенных прямоугольников. Если введенные прямоугольники не имеют общих точек, то ваша программа должна вывести на экран число 0.

Голосование за лучший ответ

собственно, всё сводится к нахождению пересечений отрезков (x1, x2) ∩ (x3, x4) и отрезков (y1,y2) ∩ (y3, y4)

а пересечение отрезков (a, b)∩(c, d) посчитать легко: это (max(a,c), min(b,d)).
если max(a,c) > min(b,d), то пересечение пустое

так что программа простая:

1) приводишь прямоугольники (xi, yi) — (xj, yj) к «нормальному» виду
xi < xj, yi < yj

2) находишь пересечения отрезков
(x1, x2) ∩ (x3, x4) = (xA, xB)
(y1, y2) ∩ (y3, y4) = (yA, yB)

3) если пересечения не пустые, считаешь площадь прямоугольника (xA, yA) — (xB, yB)

Задача по Python 3.6?

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

ВХОДНЫЕ ДАННЫЕ
Программа получает на вход 8 чисел. Сначала даны координаты левого нижнего угла первого прямоугольника . Затем даны координаты правого верхнего угла первого прямоугольника . Затем аналогично даны координаты второго прямоугольника и .

Числа заданы по одному числу в строке, −10000⩽x1
ВЫХОДНЫЕ ДАННЫЕ
Программа должна выводить одно целое число – площадь пересечения данных прямоугольников.

  • Вопрос задан более трёх лет назад
  • 3107 просмотров

Комментировать
Решения вопроса 1
ban_by_fb @ban_by_fb Автор вопроса

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
—-print(0)
else:
# если больше 0, то выводим площадь
—-print(width * height)

вместо — ставить пробелы

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

standoff → Еhis isn’t fair.

maomao90 → I am top 1 contributor. AMA!

Некропост

arham_doshi → cses graph session editorial(incomplete)

SAD_IN_NIGHTMARE → 2024 OIs

MikeMirzayanov → Codeforces Single Account Policy: zh0ukangyang is Removed from the Rating

mohammed_orkhan → I wnat to be EXPERT!!

parth_1818 → Know Some Sorting Techniques

stefdasca → Easy and Quick Video Tutorials for the CSES Problem Set

maomao90 → Editorial for Hello 2024

I_am_Polish_Girl → Dijkstra Algorithgm

atcoder_official → AtCoder Beginner Contest 335 (Sponsored by Mynavi) Announcement

awoo → Разбор Educational Codeforces Round 149

Vectrizz → Золотой расчет: оптимизация ценности в рюкзаке с умением раздробить слитки!

Hexagons → [OFF TOPIC] Hollow Knight radiant tutorial for bossfight «Markoth»

pajenegod → The Ultimate Reroot Template

CheaterExposer → [UPDATE] Codeforces Cheater IOI Medalist

triumphh → What rating on codeforces should I aim for to crack ZCO and INOI?

Некропост

sahal → CSES Problemset Editorials (almost all section editorial collection)

Некропост

Zlobober → Checkers with testlib.h

oversolver → Expert for the first time since 2011, AMA

Algorithms_with_Shayan → How to approach DP problems & DP playlist

Nurali16 → tourist is not noob . he is genius

Некропост

AminAnvari → Segment Tree Problems

P etr → A 1:1 week

TurtleZW → Codeforces Round #828 (Div. 3)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *