Тесселяция произвольного многоугольника с помощью треугольников плитки
-
22-09-2019 - |
Вопрос
Мне нужно заполнить произвольный многоугольник, используя почти универсированную плитку треугольников. Как бы я это сделал? Вы можете предоставить либо ссылки на существующие алгоритмы, либо даже просто идеи или свои собственные намеки.
Предполагается следующее:
- Полигон может быть выпуклым (но бонусные баллы, если вы придумаете алгоритм, который работает для вогнутых форм)
- Полигон имеет произвольное количество краев (3 или более)
- Количество тесселяции (предпочтительно количество вершин, добавленных алгоритмом), должно быть параметризовано
- Края многоугольника могут быть разделены на алгоритм
- Треугольники должны быть почти равномерными по размеру и форме (то есть углы будут стремиться к 60 градусам)
- Предпочтительно, номеры в вершине должны быть немного, чем многие. Это, вероятно, последует с предыдущего пункта (то есть алгоритм должен создавать «чистую сетку»).
Это нелегкая проблема для решения, и я ожидаю, что «эвристическое» решение может быть наиболее эффективным ... (верно?)
Решение
Как отметил Джейсон Орендорф, вы должны попытаться использовать треугольник для создания качественной сетки. У него есть много вариантов, с которыми вы можете играть, чтобы попытаться получить изотропную сетку. Затем вы можете попытаться использовать итеративный алгоритм для создания хорошо ориентированной триангуляции. Более подробная информация перечислена на эта страница публикаций. Анкет Я внедрил статью 2007 года «хорошо ориентированную плоскую триангуляцию-итеративный подход», и это дает достойные результаты по сеткам среднего размера. Хорошо сосредоточенная триангуляция-это та, в которой все обходы треугольников лежат внутри соответствующего треугольника. Поскольку вы хотите что -то немного другое, вы можете просто попытаться изменить вовлеченную метрику ошибки. Вы могли бы найти меру «не сознания» среди треугольников и минимизировать эту ошибку. Скорее всего, такая функция ошибки будет невыпуктной, поэтому описанная нелинейная оптимизация градиента конъюгата, как и вы.
Другие советы
Делает Треугольник делай что хочешь?
(Объяснения алгоритмов на этом сайте лучше, чем я мог придумать.)
На самом деле не звучит так сложно, алгоритмически. Или я что -нибудь упускаю?
Некоторый псевдокод:
- Поместите приподнятую ось, плотно прилагая квадрат вокруг многоугольника.
- Подразуйте каждый квадрат на четырех детей (как квадри-дерево), где количество итераций определяет ваше «количество тесселяции».
- Каждый полученный квадрат либо чисто, за пределами вашего многоугольника (= игнорировать), чисто, внутри вашего многоугольника (= разделен на два треугольника, полученного в результате диагонали), или пересекает ваш многоугольник.
- Точные случаи для пересечения квадратов остаются в качестве упражнения для читателя. ;-) [На данный момент, по крайней мере.
Это даст вам треугольники с углом 45 °/45 °/90 °. Если вы хотите как можно ближе к 60 °, вам следует начать с того, что вы можете начать с того, что он вызывает поверхность вашего многоугольника гексагонами (с размером шестиугольника, являющимся вашим «количеством тесселяции»), а затем проверить каждое из шести 60 °/60 ° /60 ° треугольников, которые составляют эти гексагоны. Для этих треугольников вы делаете то же самое, что и с квадратами в вышеупомянутом псевдокоде, за исключением того факта, что вам не нужно разделять те, которые чисто, внутри вашего многоугольника, поскольку они уже являются треугольниками.
Это какая -либо помощь? Должен работать на любой многоугольник (выпуклый/вогнутый/с отверстиями в них), я думаю, учитывая, что именно вы делаете для пересекающихся квадратов/треугольников, обрабатывает такие многоугольники.
Это можно сделать для вогнутых/выпуклого многоугольника, используя простой метод с расписанием ушей (при условии, что нам не нужно поддерживать отверстия).
- Тесселлат многоугольник
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.115.291 - Поверните края между треугольниками, где площадь, разделенная по периметру, меньше, как только край вращается в новое состояние.
Это 2 шага, поэтому он может быть более эффективным, чтобы итеративно обрезать «Лучшее» ухо, чтобы получить больше ровных результатов, поэтому вам не нужно повторно арансурс топологию в качестве второго прохода (YMMV).
(Обратите внимание, что здесь используются 2 шага, заключается в том, что расчет более равномерного распределения не всегда необходима).
Полное раскрытие, я сам столкнулся с этой проблемой, когда мне понадобился быстрый тесселлатор для полигонов для приложения в реальном времени.
Рабочая реализация, написанная в C,
которые принимают и возвращают Pod (float[2]
массив, заполняя uint[3]
множество):
- Polyfill2d.c (Tessellates)
polyfill2d_beautify.c (корректирует топологию для более ровных результатов)
также сделал порт
polyfill2d.c
до ржавчины
(Обратите внимание, что обрезка ушей основана на LIBGDX с пространственными оптимизациями на проверки пересечения, чтобы масштабировать до тысяч сторон без такого значительного удара по производительности, поскольку обрезка каждого уха проверяла все остальные точки каждый раз).