Ошибка утверждения CGAL edge_collapse

#c #cgal

#c #cgal

Вопрос:

Я использую CGAL 5.1 с типом ядра typedef CGAL::Simple_cartesian<float> Kernel; и типом сетки поверхности typedef CGAL::Surface_mesh<Kernel::Point_3> Mesh;

Я загружаю сетку через Assimp, и все кажется нормальным. Но когда я запускаю edge_collapse, я получаю сбой утверждения CGAL_assertion(resulting_vertex_count == vertices(m_tm).size()); , и, конечно же, вычисление общего количества вершин за вычетом количества удаленных вершин показывает, что оно отключено на единицу, независимо от установленного мной соотношения.

Соответствующий код:

             if(!CGAL::is_triangle_mesh(*node->mesh_info.mesh))
            {
                std::cerr << "Input geometry is not triangulated." << std::endl;
                return;
            }
            if(!is_valid_polygon_mesh(*node->mesh_info.mesh))
            {
                std::cerr << "Input geometry is not valid." << std::endl;
                return;
            }

            SMS::Count_ratio_stop_predicate<Mesh> stop(reduction);
            SMS::edge_collapse(*node->mesh_info.mesh, stop);
 

Два теста прошли нормально, так есть ли что-то очевидное, чего мне не хватает? Я еще не пробовал другие алгоритмы и не устанавливал какие-либо дополнительные свойства. Я очистил сетку, используя инструменты Assimp для удаления вырожденных граней и ребер и объединения совпадающих вершин, но я не пробовал ни один из инструментов CGAL.

У меня есть свойство «v: uv» для каждой вершины, но свойство position равно значению по умолчанию.

Если кто-нибудь может дать мне проверку работоспособности, я был бы признателен!

Комментарии:

1. Не могли бы вы поделиться входной сеткой, чтобы мы могли попытаться воспроизвести проблему? Минимальный cpp тоже был бы хорош.

Ответ №1:

Пытаясь изолировать проблему для публикации здесь, я начал играть и обнаружил, что из-за того, что моя сетка шумная и неоднородная — это фотограмметрическое сканирование, — стандартная стратегия упрощения нарушала мои границы. Игнорирование утверждения только что привело к появлению морской звезды.

Итак, я последовал примеру в руководстве пользователя и пометил свои границы как несъемные, и теперь это намного лучше.