|
В этом разделе представлены алгоритмы триангуляции многоугольников, которые работают только с индексами вершин,
а тип вершин и размерность пространства может быть произвольной.
При этом среди множества различных вариантов триангуляции ищется в некотором смысле лучшая.
Для этого должна быть задана функция качества треугольника и способ, как через качество отдельных треугольников
можно получить качество всей триангуляции.
template <class F, class A1, class A2=A1>
class Func2a // Функция двух аргументов
{
public:
virtual F operator () ( A1 a1, A2 a2 ) const = 0;
};
template <F, class A1, class A2=A1, class A3=A2>
class Func3a // Функция трёх аргументов
{
public:
virtual F operator () ( A1 a1, A2 a2, A3 a3 ) const = 0;
};
template <class T>
void maxL1 ( const Func3a<T,nat> & quality, const Func2a<T,T> & merge, ArrRef<SemiRib> rib )
...
Исходными данными являются: функтор качества треугольника, функтор слияния качеств,
количество рёбер, ссылка на массив с рёбрами.
В массиве должна быть записана какая-то триангуляция.
Причём рёбра принадлежащие к одному треугольнику должны находится последовательно,
и поле twin должно быть меньше количества рёбер только у одного ребра из пары.
Шаблон функций maxG1 осуществляет глобальную оптимизацию путём перебора всех возможных вариантов триангуляции: template <class T>
SuiteRef<Set3<nat> > & maxG1 ( const Func3a<T,nat> & quality, const Func2a<T,T> & merge,
nat nv, SuiteRef<Set3<nat> > & res )
...
Исходными данными являются: функтор качества треугольника, функтор слияния качеств,
количество вершин многоугольника и ссылка на массив, куда записывается результат триангуляции.
Этот алгоритм требует дополнительной памяти O ( n 2 ) и времени O ( n 3 ).
Описание шаблона классов Set3 находится здесь.
|