Как разделить ориентированную ограничивающую рамку?

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

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

Изображение ниже является примером этого. Залитый желтым многоугольник с красными линиями и красными точками изображает исходный многоугольник. Выпуклая оболочка показана синим цветом с черными линиями, а куб — ​​фиолетовыми линиями.

(Редактировать) В соответствии с запросом: Интерактивная версия - проверено только в хроме

Теперь я хочу расширить свой код для построения дерева OBB, а не только OBB. Это означает, что я должен вырезать полигон и вычислить новые OBB для каждой половины полигона.

Рекомендуемый способ сделать это, по-видимому, состоит в том, чтобы разрезать полигон, разрезав OBB пополам. Но если я разрезаю квадрат посередине по любой из его осей, похоже, мне придется создавать новые вершины на многоугольнике (иначе как мне найти выпуклую оболочку этого раздела?).

  1. Есть ли способ избежать добавления таких вершин?
  2. Если нет, то как проще всего это сделать (с точки зрения сложности реализации)? Каков наиболее эффективный способ выполнения?

5
задан Cam 28 May 2012 в 22:15
поделиться