алгоритм оптимального подразделения (т.е. тесселяции/разбиения) 2d полигонов на более мелкие полигоны?

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

Мне нужно разделить эти многоугольники на меньшие многоугольники, чтобы соответствовать ограничению размера. Как и исходные многоугольники, меньшие должны быть простыми (несамопересекающимися), и ограничение состоит в том, что каждый из них должен помещаться в пределах одного «единичного квадрата» (который для простоты я могу предположить равным 1x1).

Дело в том, что мне нужно сделать это максимально эффективно, где «эффективно» означает наименьшее возможное количество результирующих (маленьких) полигонов. Время расчета не имеет значения.

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


person Sheldon Pinkman    schedule 10.09.2012    source источник
comment
Вам нужно что-то вроде триангулятора?   -  person huseyin tugrul buyukisik    schedule 10.09.2012
comment
@tuğrul büyükışık: (о, раньше был вопрос о квадрате 20x20 - на всякий случай: да, если у меня есть квадрат 20x20, оптимальное подразделение в этом случае будет 400 квадратов 1x1 каждый) По поводу триангулятора: я' Я не уверен, я так не думаю, меньшие полигоны не обязательно должны быть треугольниками. Это может быть любой случайный простой многоугольник, если он помещается в квадрат 1x1.   -  person Sheldon Pinkman    schedule 10.09.2012
comment
Можно ли вращать полигоны?   -  person Qnan    schedule 10.09.2012
comment
Какой для вас оптимальный результат? Небольшое количество результирующих полигонов/вершин?   -  person ltjax    schedule 10.09.2012
comment
@ltjax это в тексте, оптимальное подразделение - это подразделение с наименьшим количеством полигонов.   -  person Qnan    schedule 10.09.2012
comment
@SheldonPinkman: Просто из любопытства: для чего ты это используешь? Отображение текстур?   -  person ltjax    schedule 10.09.2012


Ответы (2)


Нарисуйте круг с центром в одной из начальных точек начального многоугольника и радиусом желаемого ограничения длины.

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

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

введите здесь описание изображениявведите описание изображения здесьвведите описание изображения здесьвведите описание изображения здесьвведите описание изображения здесь введите здесь описание изображениявведите описание изображения здесьвведите описание изображения здесьвведите здесь описание изображениявведите здесь описание изображения введите здесь описание изображения

Для тонкой настройки внутренних деталей потребуются некоторые расчеты.

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person huseyin tugrul buyukisik    schedule 10.09.2012
comment
Четыре точки (1 черная, 3 красные) на четвертом изображении образуют крайний левый четырехугольник на последнем изображении. Этот четырехугольник не может вписаться ни в один единичный квадрат, так как он имеет тупой угол, примыкающий к стороне длины 1. Похоже, что все ромбовидные фигуры на финальном изображении, кроме одного, имеют одну и ту же проблему. Более подробно: нарисуйте стандартный единичный квадрат. Переместите и поверните этот квадрат, пока его основание не совпадет со стороной ромба, которая имеет единичную длину и находится рядом с тупым углом. Тогда линия из этого угла имеет конечную точку за пределами перемещенного повернутого единичного квадрата. - person James Waldby - jwpat7; 10.09.2012
comment
Ты прав. Вы хотите сказать, что использовали квадрат для the diamonds of this example или для всей формы с самого начала? - person huseyin tugrul buyukisik; 10.09.2012
comment
Простое решение — провести линию по более короткой диагонали каждого ромба. Обратите внимание, что для метода окружностей предположим, что ABC и CDE являются исходными сторонами многоугольника, угол ACE острый, а BC - единичная длина CD. И ABD, и BDE тупые. Я не знаю, что делает ваш метод, если BD превышает единичную длину. Тем не менее, возможно, не стоит подробно описывать ваш метод круга: метод перемещения квадратов может быть проще. Т.е. сдвиньте единичный квадрат вдоль каждой стороны многоугольника и рекурсивно внутри многоугольника; навскидку я ожидаю, что вычисления пересечения будут проще, чем для круга. - person James Waldby - jwpat7; 10.09.2012
comment
Молодец, большое спасибо за подробное описание! В настоящее время читает подробно, чтобы полностью понять это. Однако есть одна вещь: ограничение размера подразумевает, что единичный квадрат (в котором должен поместиться любой подполигон) не может быть повернут. Но я думаю, это не так уж сложно исправить (разделить радиус круга и соединить критерий с помощью sqrt (2) или что-то в этом роде). - person Sheldon Pinkman; 11.09.2012

Я предлагаю вам использовать следующее:

  1. Триангулируйте многоугольник, например. с использованием алгоритма линейной развертки.

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

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

person ltjax    schedule 10.09.2012