Я должен заполнить произвольный полигон с помощью почти универсального мозаичного размещения треугольников. Как я сделал бы это? Можно обеспечить или ссылки на существующие алгоритмы или даже просто идеи или собственные подсказки.
Следующее предполагается:
Это не легкая проблема для решения, и я ожидаю, что "эвристическое" решение может быть самым эффективным... (право?)
Как отметил Джейсон Орендорфф, для создания качественной сетки следует попробовать использовать треугольник. В нем есть много вариантов, с которыми вы можете поиграть, чтобы попытаться получить изотропную сетку. Затем вы можете попробовать использовать итеративный алгоритм для создания хорошо сфокусированной триангуляции. Более подробная информация приведена на этой странице публикаций . Я реализовал работу 2007 года "Хорошоцентрированная плоскостная триангуляция - итеративный подход", и она дает достойные результаты на сетках среднего размера. Хорошо центрированная триангуляция - это та, в которой все центры треугольников лежат внутри соответствующего треугольника. Так как вы хотите что-то немного другое, вы можете просто попробовать изменить метрику ошибки. Вы можете найти меру "несоответствия" среди треугольников и минимизировать эту ошибку. Скорее всего, такая функция ошибки будет неконфигурационной, поэтому описанная нелинейно-сопряженная градиентная оптимизация также применима.
.Делает ли Треугольник то, что вы хотите?
(Объяснения алгоритмов на этом сайте лучше, чем то, что я мог придумать)
.] На самом деле это не звучит так сложно, алгоритмически. Или я что-то упускаю? [
] []Some pseudocode:[
] [] Но это даст вам треугольники с углами 45°/45°/90°. Если вы хотите, чтобы угол был как можно ближе к 60°, вам следует начать с тесселяции поверхности вашего многоугольника шестиугольниками (при этом размер шестиугольника является вашим "количеством тесселий"), а затем проверить каждый из шести треугольников 60°/60°/60°, из которых состоят эти шестиугольники. Для этих треугольников вы делаете то же самое, что и для квадратов в вышеупомянутом псевдокоде, за исключением того факта, что вам не нужно делить те треугольники, которые чисто внутри вашего многоугольника, так как они уже сами являются треугольниками.[
]. [] Это хоть какая-то помощь? Должно сработать для любого полигона (выпуклого/ вогнутого/ с отверстиями в них), я думаю, учитывая, что именно то, что вы делаете для пересекающихся квадратов/треугольников, обрабатывает такие полигоны.[
].