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

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

  • автор:

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

Есть два прямоугольника стороны, которых параллельны осям и они пересекаются. Нам известно: (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 растет сверху вниз, то необходимо внести соответствующие поправки).

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

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

здравствуйте. сегодня наткнулся на такую задачу: определить координаты левого верхнего и правого нижнего углов общей части 2-х прямоугольников, которые задаются так же координатами левого верхнего и правого нижнего углов. стороны прямоугольников параллельны координатным осям. случаев получается чуть больше чем дофига и как их все учесть? написать нужно на с++. может есть уже готовый алгоритм(знаю что есть для площади, а для координат что-то не видел).

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Площадь пересечения двух прямоугольников
Даны 4 координаты: 2 из них — координаты противоположных вершин первого прямоугольника (не.

Найти точки пересечения двух прямоугольников
Всем привет, очень интересует метод решения следующей задачи: Имеется 2.

Координаты пересечения двух окружностей
На вход даются целочисленные координаты двух окружностей и целочисленные их радиусы, которые не.

Регистрация: 06.05.2009
Сообщений: 34

Лучший ответ

Сообщение было отмечено Agent Smith как решение

Решение

Попробуйте так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
//пересекающиеся прямоугольники #include struct point { int x,y; } struct rectangle { point lt; //left top point rb; //right bottom } int min(int a, int b); int max(int a, int b); int main()  setlocale(NULL,"rus"); rectangle a,b,c; cout"Введите координаты первого прямоугольника:"endl; cout"верхний левый угол:\tx = "; cin>>a.lt.x; cout"\ty = "; cin>>a.lt.y; coutendl"правый нижний угол:\tx = "; cin>>a.rb.x; cout"\ty = "; cin>>a.rb.y; coutendl"Введите координаты второго прямоугольника:"endl; cout"верхний левый угол:\tx = "; cin>>b.lt.x; cout"\ty = "; cin>>b.lt.y; coutendl"правый нижний угол:\tx = "; cin>>b.rb.x; cout"\ty = "; cin>>b.rb.y; // варианты пересечения прямоугольников if(a.rb.y>b.lt.y  else { c.lt.y=min(a.lt.y,b.lt.y); c.lt.x=max(a.lt.x,b.lt.x); c.rb.y=max(a.rb.y,b.rb.y); c.rb.x=min(a.rb.x,b.rb.x); cout"Координаты пересечения:"endl; cout"левый верхний угол: x = "c.lt.x"\t y = "c.lt.yendl; cout"правый нижний угол: x = "c.rb.x"\t y = "c.rb.yendl; } return 0; } int min(int a, int b) { if(ab) return a; else return b; } int max(int a, int b) { if(a>b) return a; else return b; }

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

Imakf → Codeforces Round 906 Editorial

whynesspower → [URGENT] Codeforces need anti-scrapping

_Firdavs_Aminov_ → Dark theme Codeforces

whynesspower → Reverse check the questions: ChatGPT

Некропост

-arma- → SQRT decomposition for beginners

elshiko → Квалификационный раунд Yandex Cup 2023

atcoder_official → Panasonic Programming Contest 2023(AtCoder Beginner Contest 326) Announcement

MercilesslyMan → Vim for competitive programming

AquaMoon → Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Editorial

74TrAkToR → Codeforces Round #904 (Div. 2) Editorial

Imakf → Codeforces Round 906 (Div. 1, Div. 2)

Sokol080808 → Codeforces Round #881 (Div. 3) Разбор

127.0.0.1 → Codeforces Round 907 (Div. 2)

arpit_aditya → Cherry Pickup Leetcode 741 — Why is this approach giving wrong Answer?

yrhiba → I think tomorrow is the day!

Loserinlife → Sum of kth smallest distances.

nor → [Feature Request/Informational Content] Consider adding the Boost C++ library on Codeforces

chenjb → Rescheduling of World Finals 22&23

SkippedSolution → DP bitmask or DNC ?

purp4ever → Teams Qualified for Africa and Arab Collegiate Programming Championship — ACPC 2023 (+teens)

Некропост

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

Некропост

nagitaosu → Codeforces rating distribution

-kirito- → Invitation to TheForces #25 (5^2-Forces, TheForces-Rated, Prizes!)

Esomer → Math and informatics competition, with prizes!

74TrAkToR → Codeforces Round #905 (Div. 1, Div. 2, Div. 3) Editorial

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

Часто при разработке различных интерфейсов возникает задача проверки пересекаются ли два заданных прямоугольника. Решение в данном случае очень простое, однако мной нигде не найденное и поэтому в очередной раз пришлось писать свой велосипед. При этом грабли на которые наступают разработчики одни и те же, а решение выдаваемые гуру на форумах работают лишь в частных случаях и не покрывают все варианты расстановки двух прямоугольников на плоскости.

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

Функция работает только для прямоугольников, чьи стороны параллельны осям координат. В общем-то задача сведена к проецированию сторон на оси координат и попарной проверке пересечений двух отрезков. Если две пары отрезков пересекаются между собой то значит один из прямоугольников лежит на другом. Однако здесь есть подвох: нужно проверять также случай, когда одна сторона прямоугольника №1 лежит внутри той же стороны прямоугольника №2, а другая, сторона у №2 сама лежит внутри такой же в №1. Этот случай представлен на рисунке выше, под номером 1.

Пусть есть два прямоугольника A и B.

(a.x,a.y)--------------| | | | | | | |---------------(a.x1,a.y1) (b.x,b.y)---------------------| | | | | | | |---------------------(b.x1,b.y1)

тогда проверку на пересечение двух этих прямоугольников произведет следующая функция

var intersect = function(a,b)< return( ( ( ( a.x>=b.x && a.x=b.x && a.x1=b.y && a.y=b.y && a.y1=a.x && b.x=a.x && b.x1=a.y && b.y=a.y && b.y1=b.x && a.x=b.x && a.x1=a.y && b.y=a.y && b.y1=a.x && b.x=a.x && b.x1=b.y && a.y=b.y && a.y1

а Вы думали все просто. Я тоже так думал, пока не поймал ряд вариантов, которые не подходят под решения названные на форумах. Первая половина этой «многоэтажки» проверяет все случаи, кроме первого, вторая создана специально для случая №1.

UPD

Благодаря пользователю с ником Ruslan и его комментарию узнаем, что есть еще один достаточно просто способ проверить. Нужно действовать от обратного, проверять не 1,3,4 а только 2

var intersects = function ( a, b ) < return ( a.y < b.y1 || a.y1 >b.y || a.x1 < b.x || a.x >b.x1 ); >

Просто, как дважды два. Проверяем если верхняя грань первого прямоугольника находится ниже второго, или нижняя выше верхней грани первого. Тоже самое и для оси X.

Оставлять комментарии могут только зарегистрированные пользователи

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

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