2010-12-29 18 views
11

Что такое алгоритм определения общей площади двух прямоугольников, которые пересекаются и могут поворачиваться с осевых координат?Общая площадь пересекающихся прямоугольников

+2

связанный, но не имеет возможности поворота: [общая площадь пересекающихся прямоугольников] (http: // stackoverflow. com/questions/4549544/total-area-of-intersecting-rectangles/4555164 # 4555164) – jball

+0

Хотелось бы отметить, что самый высокий рейтинг Тома Медли, хотя и очень интересный, - это * не самый простой подход. Прямым решением является использование одного из алгоритмов для [пересечения выпуклых многоугольников] (http://stackoverflow.com/a/13105297/145999) (например, Sutherland-Hodgman), чтобы найти пересечение между обоими прямоугольниками, затем вычислить [область пересечения] (http://www.mathwords.com/a/area_convex_polygon.htm), затем вычислить площадь объединения как Area (rect1) + Area (rect2) - Area (пересечение). Это также указано в ответе Александра С. – HugoRune

ответ

18

Вот примерно то, что вам нужно сделать, выраженный как обычно, как это возможно, но охватывающий все возможности:

  • Отработать класс пересечения. То есть Сколько ребер имеет область пересечения? Это может быть любое значение от 0 до 8.
  • Найти все вершины пересечения. Это будут все пересечения между краями прямоугольников и соответствующие углы самих прямоугольников. Работа с этим битом является самой сложной/утомительной.
  • Определите площадь пересечения, разделив его на треугольники, если это необходимо.

Вот все способы прямоугольники могут пересекаться: alt text

Update

У меня были кое-какие мысли, и лучший способ классифицировать пересечение проследить вокруг периметра каждый прямоугольник и подсчитывать количество раз, когда каждое ребро пересекает другое ребро. Вы получите вектор, например. для шестисторонней зоны пересечения: {1,1,1,1}, {0,1,1,1} и для 8: {2,2,2,2}, {2,2,2,2} , Два специальных случая, которые вам нужно проверить, - это когда один прямоугольник полностью перекрывает другой и когда края находятся в очереди. Вам понадобятся тщательные проверки, но это будет отправной точкой для функции, чтобы классифицировать пересечение.

+1

Поскольку прямоугольники могут быть наклонены, пересечение может быть также треугольником –

+3

. Также существует вероятность того, что пересечение может быть 5, 6, 7 или 8-сторонним. –

+0

Я исправил свой ответ, пропустил ли я какие-либо случаи? – fredley

1

Хорошо, у вас есть 3 возможности: 1. Прямоугольники не пересекаются 2. Один прямоугольник полностью находится внутри другого (или они совпадают) 3. В результате пересечения некоторый выпуклый многоугольник. Вы вычисляете область многоугольника, разбивая ее на треугольники (путем отрисовки сегментов от первой вершины к каждой другой, за исключением смежных один раз). Вы суммируете области. Вы можете использовать теорему Геродота, чтобы вычислить область треугольника, и вот где находится геометрия средней школы.

+3

Теорема Геродота? Вы имеете в виду формулу Герона? – IVlad

+1

Уверен, что Геродот гораздо интереснее читать, чем Херон .... –

+0

@belisarius - на самом деле я не думаю, что он может быть вогнутым. Конечно, этот ответ не имеет никакого смысла, и я отказался от него, но я не вижу, как пересечение может быть вогнутым ... – IVlad

3

Площадь (R1 union R2) = Area (R1) + Area (R2) - Area (R1 intersection R2), поэтому вы можете вычислить область пересечения, чтобы иметь площадь союза.

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

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

Так это выглядит следующим образом:

  • Ь первоначально пустое связанный список
  • R1 имеет ребра e1, e2, e3, e4, R2 имеет ребра f1, f2, f3, f4. Вычислить точки пересечения ei и fj для всех i, j = 1,2,3,4. Добавьте их в список L.
  • Для каждой вершины v из R1, если v находится внутри R2, добавьте ее в L.
  • Для каждой вершины w R2, если w находится внутри R1, добавьте ее в L.

Выпуклая оболочка точек в L - это ваше пересечение. Поскольку каждая точка в L находится на границе пересечения, вы можете триангулировать ее и вычислить ее площадь. Легко:

  • L = [x0, x1, ...]
  • Сортировка точек в L в соответствии с углом (XI - х0) по отношению к горизонтальной линии, проходящей через точку х0
  • первого треугольника является x0, x1, x2
  • Второй треугольник x0, x2, x3
  • п-й треугольник х0, х (п + 1), х (п + 2)

площадь треугольника по формуле Heron:

  • а, Ь, с длинами ребер
  • S = 0,5 * (а + B + C)
  • площадь = SQRT (S * (S - а) * (S - B) * (s - с))

но остерегайтесь вычисления s - а, с - Ь и с - Ĉ independantly, так как вы можете столкнуться ошибку округления (что, если с ~ а и б < <, например)

?
+0

Рассчитывает пересечение каждого ребра в первом прямоугольнике с каждым ребром во втором прямоугольнике, действительно лучшим решением? – jball

+0

@jball: для прямоугольников это дает вам 16 таких тестов. Для пересечения более сложных выпуклых многоугольников вы можете использовать квадранты или подобные, чтобы избежать большинства тестов. Обратите внимание, однако, что после смены переменных, чтобы положить R1 вдоль осей координат, эти тесты просты. –

+0

Думая об этом больше, поиск пересечения просто создает ненужные вычисления. Лучший метод - найти вершины всего объединения, а затем вычислить его площадь. Это уменьшает расчеты площадей с 3 (2, которые тривиальны) до 1. И есть лучшие алгоритмы, чем триангуляция для вычисления площади многоугольника. – jball

Смежные вопросы