Триангуляция многоугольника

Я пытаюсь триангулировать многоугольник для использования в 3D-модели. Когда я пытаюсь использовать метод уха на многоугольнике с точками, пунктирными ниже, я получаю треугольники на месте красных линий. Поскольку внутри этих треугольников нет других точек, это, вероятно, правильно. Но я хочу, чтобы он триангулировал область только внутри черных линий. Кто-нибудь знает какие-либо алгоритмы, которые это сделают?

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


person user978281    schedule 16.01.2012    source источник
comment
Вы можете разрезать фигуру на выпуклые части и триангулировать их. А вот с большими сложными фигурами становится неаккуратно.   -  person Daniel Fischer    schedule 17.01.2012
comment
Есть ли у вашей триангуляции какие-либо ограничения (Делоне?) Или у вас есть какие-то ограничения по времени? В противном случае ответ будет довольно широким.   -  person pmr    schedule 17.01.2012
comment
Ограничений нет, модель генерируется один раз, поэтому время не является большой проблемой.   -  person user978281    schedule 17.01.2012


Ответы (5)


Существует множество алгоритмов триангуляции многоугольника, которые не требуют предварительного разбиения на монотонные многоугольники. Один из них описан в моем учебнике Computational Geometry in C, в котором есть код связанный с ним, который можно бесплатно загрузить по этой ссылке (на C или на Java). Сначала вы должны расположить точки в порядке, соответствующем обходу границы. Мой код предполагает движение против часовой стрелки, но, конечно, это легко изменить. См. Также статью в Википедии. Возможно, в этом ваша проблема, что у вас нет упорядоченной организации пограничных точек?

person Joseph O'Rourke    schedule 17.01.2012
comment
Обожаю твою книгу «Джозеф», пусть на полке позади меня лежат несколько ее изданий. Занимает почетное место среди Edelsbrunner, Shamos & Perparata и Hjelle & Daehlen. Настоящая необходимость для всех, кто работает с ИНН. - person SmacL; 17.01.2012
comment
@Shane: Спасибо за добрые слова! :-) - person Joseph O'Rourke; 17.01.2012

Обычный подход состоит в том, чтобы разделить ваш простой многоугольник на монотонный многоугольник с использованием трапециевидной декомпозиции, а затем триангулировать монотонные многоугольники. Первая часть может быть достигнута с помощью алгоритма развертки линии. И ускорение возможно с помощью правильной структуры данных (например, двусвязного списка ребер). Лучшее описание этого, насколько мне известно, можно найти в Вычислительная геометрия. Это и это тоже кажется полезным.

person pmr    schedule 16.01.2012

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

person Soren    schedule 16.01.2012

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

person sloriot    schedule 17.01.2012

Вам нужно использовать алгоритм EarClipping, а не алгоритм Делоне. См. Следующий технический документ: http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf

person abenci    schedule 18.01.2012