Тесселяция произвольного многоугольника с помощью треугольников плитки

StackOverflow https://stackoverflow.com/questions/1999397

Вопрос

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

Предполагается следующее:

  • Полигон может быть выпуклым (но бонусные баллы, если вы придумаете алгоритм, который работает для вогнутых форм)
  • Полигон имеет произвольное количество краев (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] множество):

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

example output

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top