2013-03-18 2 views
0

Есть ли простой (или нет) алгоритм, способный создавать многоугольники из замкнутого пути?Преобразование формы в полигоны

Пусть ш имеют следующий путь:

0,0; 2,0, 2,1; 1,1; 
1,2; 2,2; 2,3; 0,3; 

Мне нужно, чтобы иметь возможность создавать полигональные индексы для OpenGL буфера вершин. Язык, который я использую, - это C#.

Кто-то предложил мне выпуклый корпус, но это не то, что я ищу, потому что у меня уже есть форма. Я знаю, что это может быть тривиальной проблемой, но серьезно, я не могу найти никакого описания или что-то, что бы указать mi в правильном направлении.

Edit:

Ответ 1 предлагает выбрать точку и соединить его с другими не связанными точками, это работает отлично представлено в форме ответа, но он не будет работать на форму я разместил, формы выше выглядит следующим образом:

Shape

+0

вы хотите триангуляции этого многоугольника? или вы собираетесь использовать 'GL_POLYGON'? –

+0

Я использую' GL_TRIANGLES' в функции 'glDrawElements' для визуализации vertex buffer, поэтому мне нужны вершины (выше), индексы (это мне нужно установить с формой) и нормали (в настоящее время не нужны). – dr4cul4

ответ

2

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

Если многоугольник является выпуклым, самый простой способ заключается в использовании GL_TRIANGLES с indicies

0, 1, 2, 0, 2, 3, 0, 3, 4, ... 

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

triangulation by fanning

Ситуация для вогнутых больше работы. Алгоритм, который также работает для вогнутых многоугольников (не с отверстиями!), - это метод обрезания ушей, описанный на wikipedia (на этой странице больше).

Все становится действительно интересным, когда вы хотите «хорошую» триангуляцию : избегайте тощих или маленьких треугольников, уменьшайте количество треугольников и т. д., а затем вы можете обменивать качество на скорость. Здесь я не буду вдаваться в какие-либо предварительные алгоритмы; поиск триангуляции многоугольника в Google даст вам много информации.

Что касается нормалей, если ваш многоугольник плоский (он скорее всего должен «быть»), тогда возьмите два несовпадающих ребра и перекрестите их (есть две нормали, и вы, вероятно, только хотите: вам нужно выбрать порядок, в котором вы поперечный продукте (по часовой стрелке или против часовой стрелки) на основе right hand rule.

+0

Я придумал такой подход, но он не будет работать ни на каждом, с формами, которые требуется моему проекту. Я обновил свой вопрос, чтобы сделать вещи clea р. – dr4cul4

+0

Да, как я уже говорил, подход для разветвления не будет работать для вогнутых полигонов. (Это также очень плохо в целом). Я упомянул решение, которое (ушивание, есть ссылка - оно также упоминает несколько других методов), и если вы хотите больше алгоритмов, вы должны искать google для «многоугольной триангуляции», так как там многие из них имеют разные компромиссы. –

+1

Человек, вы потрясающий. Поиск обрезки уха (мне не хватало названия: P) Я наткнулся на [это] (http://www.codeproject.com/Articles/8238/Polygon-Triangulation-in-C) – dr4cul4

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