首页 > 解决方案 > CGAL edge_collapse 断言失败

问题描述

我正在使用具有内核类型typedef CGAL::Simple_cartesian<float> Kernel;和表面网格类型的 CGAL 5.1typedef 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”属性,但位置属性是默认值。

如果有人可以给我一个健全性检查,我将不胜感激!

标签: c++cgal

解决方案


在尝试将问题隔离到此处发布时,我开始玩弄,发现由于我的网格嘈杂且不完整 - 这是摄影测量扫描 - 标准的简化策略在我的边界上大吃一惊。忽略断言只会产生海星。

所以我按照用户手册中的示例,将我的边框标记为不可移动,现在它更快乐了。


推荐阅读