2 / 2 / 2
Регистрация: 21.07.2015
Сообщений: 36
|
|
1 | |
Сумма площадей прямоугольников с учетом их пересечения19.09.2015, 01:23. Показов 3525. Ответов 11
Метки нет (Все метки)
Есть плоскость (поле) 1000х1000. В нем задаются N прямоугольников (каждый 4-мя точками). Необходимо рассчитать суммарную площадь всех прямоугольников с учетом их пересечений. При чем в одной области могут пересекаться несколько прямоугольников.
Координаты точек прямоугольников могут быть десятичными дробями, поэтому просто выразить поле через матрицу, по видимому, не выйдет. Помогите придумать алгоритм, поиск ничего подобного не выдал. П.с. Все прямоугольники параллельны осям координат. Добавлено через 2 часа 41 минуту Очевидно, речь о использовании формулы включений-исключений, но только как это все формализовать?
0
|
19.09.2015, 01:23 | |
Ответы с готовыми решениями:
11
Нахождение площадей пересечения случайных прямоугольников Нахождения площадей всех прямоугольников с заданным полупериметром P Посчитать сумму площадей двух прямоугольников, стороны которых заданы Написать функции для вычисления площадей кругов, прямоугольников и треугольников |
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,749
|
|
19.09.2015, 08:48 | 2 |
Лучше сказать "найти площадь покрываемую всеми пр-ками". Простое решение: берем пр-к, добавляем его плошадь и от нее отнимаем площади пересечений со всеми предыдущими пр-ками. Это квадратичный перебор, т.е. плохая скорость.
Более сложное (но и более скоростное) решение: на исходное поле наложить сетку, напр 10x10. Идти по всем пр-кам, искать какие клетки они пересекают и подсчитывать покрываемые площади в каждой клетке. Если оказалось что клетка полностью покрыта - дальнейшие проверки для нее опускаем.
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,472
|
|
19.09.2015, 14:53 | 3 |
как её искать?
ведь это, практически, исходная задача Добавлено через 42 минуты Пока мне приходит в голову только замена прямоугольников на набор непересекающихся прямоугольников. Нужно аккуратно выписать все виды пересечения и для каждого задать набор результирующих прямоугольников (от 1 до 3, вроде бы). Добавлено через 25 минут У Вас есть набор координат x и набор координат y. Нанесите их на поле - и получите "матрицу". Возможно, это самый быстрый способ.
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,749
|
|
20.09.2015, 09:44 | 4 |
Да, верно. Это для 2 все просто, а для большего числа отнимаемое значение могло быть уже отнято предыдущим (только "дошло" ).
Ну и что дальше делать с этой матрицей? Наверное так: каждая строка и каждый столбец хранят список своих пр-ков. Смысл в том что элемент матрицы (образованный текущими строкой и столбцом) или полностью покрывается или полностью нет. Проверяем все пр-ки принадлежащие текущей строке и столбцу + следующей строке и столбцу. Если эл-т никем не покрыт - добавляем его площадь в рез-т Добавлено через 1 час 45 минут Точнее так: каждая строка/столбец хранят список всех пр-ков покрывающих хотя бы часть данной строки/столбца. Тогда эл-т матрицы покрыт если найдется хотя бы 1 пр-к покрывающий и строку и столбец.
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,472
|
|||||||||||
20.09.2015, 11:59 | 5 | ||||||||||
1. У нас есть два отсортированных массива с границами (по одному для каждой координаты).
2. Для каждого прямоугольника "закрашиваем" клетки матрицы, которые лежат внутри него. 3. Суммируем площади закрашенных клеток. Примерно так:
Массивы границ можно вычислить примерно так:
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,749
|
||||||
20.09.2015, 13:15 | 6 | |||||
Может чуть техничнее обойтись без binary_search (напр сохранить индексы в самих пр-ках).
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,472
|
||||||
20.09.2015, 14:51 | 7 | |||||
Не понял, как можно хранить индексы в прямоугольниках. И смысла приведённого кода тоже не понял.
Без BinarySearch обойтись можно. Например, поместить границы в словарь (хеш-таблицу).
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,749
|
|
20.09.2015, 15:33 | 8 |
Эл-т массива/контейнера границ xранит указатель на то "из чего он был создан" (мин x, и.т.д). Когда индекс границы уже определен, он вписывается по этому указателю. А сами значения (на которые указывают указатели) сидят в пр-ках
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,472
|
|
20.09.2015, 18:54 | 9 |
Igor3D,
Пусть у Вас есть два прямоугольника с одинаковыми x0. Если я правильно понимаю, index_x0 в них имеют разные адреса. На который из них будет ссылаться index в элементе массива границ (RVal), val которого равен этим x0?
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,749
|
|
21.09.2015, 08:12 | 10 |
В готовом массиве границ указывает на index_x0 одного из пр-ков (какого - зависит от сортировки). Но это неважно, когда массив готов, то указатели уже не нужны, пр-ки имеют готовые индексы.
При создании RVal(ы) указывают на поля index_x0 каждый в своем пр-ке (из которого этот RVal создан). Когда массив RVal пакуется в оба пр-ка запишется одинаковое значение index_x0. Не по теме:
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,472
|
|
21.09.2015, 17:01 | 11 |
Да, нет. Просто у Вас логика запутана. Вы сначала задаёте индекс (в большинстве случаев - неправильно), а потом проверяете, правильно ли Вы его задали. Если неправильно, то, не доделав одну задачу ("задать индекс"), переходите к другой ("сдвинуть элемент"). Причём, не ясно, зачем сдвигать элементы в массиве, если в дальнейшем Вы не собираетесь использовать этот массив. И только после этого Вы устанавливаете правильное значение (обращаясь к элементу по новому индексу в массиве).
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,749
|
||||||
21.09.2015, 18:03 | 12 | |||||
Как же не собираюсь? rx(y) - это то же что у Вас x(y)limits, они нужны для подсчета площадей. А вот здесь ошибка
1
|
21.09.2015, 18:03 | |
21.09.2015, 18:03 | |
Помогаю со студенческими работами здесь
12
Подсчитать суму площадей двух прямоугольников, для которых заданы их стороны Площадь пересечения прямоугольников Площадь пересечения прямоугольников Определить точки пересечения прямоугольников Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |