Как найти область прямоугольника

Как посчитать границы прямоугольника?

ДЕВОЧКА — РОМАШКА
[16.8K]

5 лет назад 

Ксени­я-М-1994
[1.1K]

5 лет назад 

Для начала нужно вспомнить, что такое прямоугольник? Это геометрическая фигура из четырёх углов, у которой все углы прямые. Размеры прямоугольника определяются длинами его сторон, обозначаемых обычно a и b. Прямоугольник, все стороны которого равны (a = b) называется квадратом.

Периметр прямоугольника — это сложение 2 сторон, умноженное на 2.

Проще описать формулой:

Р = 2*(a + b).

Площадь прямоугольника — это умножение одной стороны на другую.

S = a*b.

комментировать

в избранное

ссылка

отблагодарить

Знаете ответ?

Say the list of rectangles is L and say the final list that only has the green ones is G. The rectangles can be added one after another to G. Before each add, it is checked against the list already in G. If it overlaps with one of them, compare their sizes(areas). If it is bigger than the one in the list, replaces it, otherwise it is not added to G.

G will never have two rectangles that overlap (that is the algorithm invariant). This way you only check against those that are candidates for ending up in the final list.

This is definitely better than O(n^2), if the rectangles have random overlaps. But the worst case is still O(n^2) — when none of the input rectangles in L overlap. In that case each overlap check is a O(n) operation.

But the overlap check can be optimized. By maintaining a sorted list of points, based on both X and Y, the overlap check can be done just against the ones that are closest to the rectangle’s xmin, xmax, ymin and ymax. This I think is a bit tricky, esp when the new rectangle only partially overlaps or if it overlaps with multiple ones. But it can be done.

In any case, the overlap check can be sped up to some extent that it doesn’t have to be against all the rectangles in G. I couldn’t quantify it, but done correctly, I believe, it can be done in O(nlogn).

Скажем, что список прямоугольников L, и укажите конечный список, который имеет только зеленые G. Прямоугольники могут быть добавлены один за другим в G. Перед каждым добавлением он проверяется на список уже в G. Если они совпадают с одним из них, сравните их размеры (области). Если он больше, чем тот, который указан в списке, его заменяет, иначе он не добавляется к G.

G никогда не будет иметь двух прямоугольников, которые перекрываются (это инвариант алгоритма). Таким образом, вы проверяете только те, которые являются кандидатами на участие в конечном списке.

Это определенно лучше, чем O (n ^ 2), если прямоугольники имеют случайные перекрытия. Но худшим случаем остается O (n ^ 2) — когда ни один из входных прямоугольников в L не перекрывается. В этом случае каждая проверка перекрытия является операцией O (n).

Но проверка перекрытия может быть оптимизирована. Поддерживая отсортированный список точек, основанный на X и Y, проверка перекрытия может быть выполнена только против тех, которые ближе всего к прямоугольнику xmin, xmax, ymin и ymax. Это, я думаю, немного сложно, особенно если новый прямоугольник частично перекрывается или перекрывается с несколькими. Но это можно сделать.

В любом случае, проверка перекрытия может быть ускорена до некоторой степени, что она не должна быть против всех прямоугольников в G. Я не мог его количественно оценить, но, как я полагаю, это сделано правильно, это можно сделать в O (nlogn).

Все категории

  • Фотография и видеосъемка
  • Знания
  • Другое
  • Гороскопы, магия, гадания
  • Общество и политика
  • Образование
  • Путешествия и туризм
  • Искусство и культура
  • Города и страны
  • Строительство и ремонт
  • Работа и карьера
  • Спорт
  • Стиль и красота
  • Юридическая консультация
  • Компьютеры и интернет
  • Товары и услуги
  • Темы для взрослых
  • Семья и дом
  • Животные и растения
  • Еда и кулинария
  • Здоровье и медицина
  • Авто и мото
  • Бизнес и финансы
  • Философия, непознанное
  • Досуг и развлечения
  • Знакомства, любовь, отношения
  • Наука и техника


0

Как посчитать границы прямоугольника?

1 ответ:



1



0

Для начала нужно вспомнить, что такое прямоугольник? Это геометрическая фигура из четырёх углов, у которой все углы прямые. Размеры прямоугольника определяются длинами его сторон, обозначаемых обычно a и b. Прямоугольник, все стороны которого равны (a = b) называется квадратом.

Периметр прямоугольника — это сложение 2 сторон, умноженное на 2.

Проще описать формулой:

Р = 2*(a + b).

Площадь прямоугольника — это умножение одной стороны на другую.

S = a*b.

Читайте также

Задачку я решил, конечно не сразу. Потребовалось перенести рисунок на внешний листик, так как в уме ход решения не удавалось сохранять.

Верхняя строчка читается : 2, 0, 1, 3, 4

средняя строчка читается : 4, 2, 0, 1, 3

нижняя строчка читается : 1, 3, 2, 0, 4

Как видим из предложенного решения, в клетке со знаком вопроса должна быть 1.

Ответ на вопрос задания вариант Б { 1 }

Наиболее рациональным решением этой задачи является такое решение. Боковые стены бассейна — это фактически боковая поверхность прямой призмы (только с внутренней стороны). А площадь боковой поверхности такой призмы (параллелепипеда) умеют находит даже пятиклассники по формуле S = P*h, P = 2*(а+в) — периметр. Далее находим площадь дна (прямоугольник) по известной формуле S = а*в и суммируем их. а=10 м, в=25 м, h= 2 м.

Получаем площадь дна бассейна равна 2*(10+25)*2 + 10*25 = 140 м2 + 250 м2 = 390 м2.

Эта задача сначала кажется ужасно сложной, я даже хотела ее оставить «на потом», но ее нужно просто внимательно прочитать и понять, что пчел то всего четыре и сидят они не внутри прямоугольника, а на его контуре, и капля меда тоже падает на контур. Просто вначале сбивает вот это: 10х25, но нам эти данные показывают просто длину сторон прямоугольника. На какую бы сторону не упала капля, две пчелы с вершин этой стороны проползут путь до капли равный длине этой стороны, а две другие проползут путь равный периметру, если из него вычесть длину противоположной стороны, равную той стороне по которой ползут первые две пчелы, то есть общий путь будет как раз равен периметру прямоугольника: 10 + 10 + 25 + 25 = 70.

У нас есть условие, что клетки закрашены некоторые, если бы этого не было, то минимальный прямоугольник был бы 5 х 6, а его площадь была бы равна 30, но в нем не соблюдалось бы это условие, поэтому прямоугольник придется удлинить или расширить, допустим, мы добавим с этой целью одну строку, по условию задачи в ней нам тоже придется закрасить пять клеток, но тогда нарушится другое условие задачи, в столбцах уже будет не шесть клеток, а больше закрашено. Тогда, чтобы условия все же были выполнены в полном объеме мы будем вынуждены добавить пять столбцов, чтобы закрасить в них клетки этой дополнительной добавленной строки. А еще мы должны будем добавить в дополнение к той первой еще пять строк для закрашивания клеток, чтобы в столбцах было по 6 клеток закрашено. В итоге у нас получится прямоугольник 10 х 12 с площадью 120, такой вариант ответа у нас как раз есть и он правильный.

Зная, что периметр прямоугольника равен P=2(a+b). Подставим наше значение периметра в формулу: 28=2(a+b). Тогда

a+b=14. Далее по тереме Пифагора имеем a*a+b*b=10*10. Тогда имеем a*a+b*b=100. Далее выразим а=14-b. Получим (14-b)*(14-b)+b*b=10­<wbr />0.

196-28b+b*b+b*b=100. 2b*b-28b+96=0. b*b-14b+48=0. Отсюда b1=8. b2=6. Тогда a1=14-8=6. a2=14-6=8. В общем, получилось, что длина прямоугольника равна 8, а ширина равна 6.

У меня есть список точек [xmin, ymin, xmax, ymax] для каждой, как показано черной точкой

Как определить, какие прямоугольники покрыты другим прямоугольником и насколько он покрыт? Алгоритм должен быть эффективным. одним из решений было бы проверить каждый прямоугольник друг с другом прямоугольником, что потребует временной сложности O (n ^ 2), но мне нужен эффективный алгоритм. введите описание изображения здесь

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

На входе n прямоугольника, на выходе — площадь покрытия и идентификатор прямоугольника, которым он покрывается. Было бы желательно дать некоторый алгоритм и объяснение.

2 ответа

Лучший ответ

Скажем, список прямоугольников — L, а последний список, в котором есть только зеленые — G. Прямоугольники могут быть добавлены один за другим к G. Перед каждым добавлением он сверяется со списком, уже находящимся в G. Если он перекрывается с одним из них, сравните их размеры (площади). Если он больше, чем тот, что в списке, заменяет его, иначе он не добавляется в G.

G никогда не будет иметь двух перекрывающихся прямоугольников (это инвариант алгоритма). Таким образом, вы проверяете только тех, кто является кандидатом на попадание в окончательный список.

Это определенно лучше, чем O (n ^ 2), если прямоугольники имеют случайное перекрытие. Но в худшем случае все равно O (n ^ 2) — когда ни один из входных прямоугольников в L не перекрывается. В этом случае каждая проверка перекрытия является операцией O (n).

Но проверку перекрытия можно оптимизировать. Поддерживая отсортированный список точек, основанный как на X, так и на Y, проверка перекрытия может выполняться только с теми, которые наиболее близки к xmin, xmax, ymin и ymax прямоугольника. Я думаю, это немного сложно, особенно когда новый прямоугольник перекрывается только частично или если он перекрывается с несколькими. Но это может быть сделано.

В любом случае, проверку перекрытия можно до некоторой степени ускорить, чтобы она не касалась всех прямоугольников в G. Я не мог количественно оценить это, но все сделано правильно, я считаю, это можно сделать за O (nlogn).


3

Arun R
14 Май 2014 в 18:58

Это не ответ, просто намек:

Вы можете найти полезную структуру данных разделения пространства Quadtree. При правильной планировке вы можете значительно сократить количество обнаружений столкновений.

Такая структура использовалась различными движками 2D-спрайтов в старых машинах для аркадных видеоигр, а также имеет другие приложения в графике.

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

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


1

xmojmr
16 Май 2014 в 16:55

Понравилась статья? Поделить с друзьями:
  • Как найти количество стороны н угольника
  • Как найти центр шара вписанного в конус
  • Как найти телефон в раевке
  • Как мне найти свою страницу в контактах
  • Как найти папку centos