В этом разделе представлены алгоритмы триангуляции многоугольников, которые работают только с индексами вершин,
а тип вершин и размерность пространства может быть произвольной.
При этом среди множества различных вариантов триангуляции ищется в некотором смысле лучшая.
Для этого должна быть задана функция качества треугольника и способ, как через качество отдельных треугольников
можно получить качество всей триангуляции.
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 находится здесь.
|