CGAL中Surface_mesh转Nef_polyhedron_3编译失败求助
无法将Surface_mesh转换为Nef_polyhedron_3,编译报错C2440
编译失败,出现如下错误:
C2440 "Initialize": Cannot convert from "_Ty" to "size_t" polygon_mesh_to_nef_3.h 199 C2440 "Initialize": Cannot convert from "_Ty" to "size_t" polygon_mesh_to_nef_3.h 250 C2440 "Initialize": Cannot convert from "_Ty" to "size_t" polygon_mesh_to_nef_3.h 282
源代码
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; typedef Kernel::Point_3 Point; typedef CGAL::Surface_mesh<Point> SM; typedef Kernel::Vector_3 Vector; typedef boost::graph_traits<SM>::face_descriptor face_descriptor; typedef boost::graph_traits<SM>::halfedge_descriptor halfedge_descriptor; typedef SM::Property_map<face_descriptor, Vector> FaceMap; typedef SM::Property_map<halfedge_descriptor, Vector> halfedgeMap; using namespace std; namespace PMP = CGAL::Polygon_mesh_processing; namespace params = CGAL::parameters; int main(int argc, char** argv) { char final[] = "E:/point/output/0_10_small_final.obj"; SM mesh; FaceMap faceMap; halfedgeMap HalMap; CGAL::IO::read_polygon_mesh(final, mesh); Nef_PHD mesh3(mesh, HalMap, faceMap); cout << mesh3 << endl; return EXIT_FAILURE; }
环境信息
- 操作系统:Windows 64位
- 编译器:Visual Studio 2019
- 模式:Debug模式
- CGAL版本:5.5.1
- Boost版本:1.71.0
- 其他库:Eigen 3
注:若需要.obj数据文件,可通过Wetransfer提供。
问题分析与解决方案
缺失Nef_polyhedron类型定义
代码中Nef_PHD未声明,需先添加正确的类型定义:typedef CGAL::Nef_polyhedron_3<Kernel> Nef_PHD;错误的转换方式
直接传入未初始化的Property_map调用构造函数不符合CGAL的转换规则,正确做法是使用官方提供的转换函数,并先验证网格有效性:- 检查网格是否为闭合流形(Nef_polyhedron仅支持这类网格):
if (!PMP::is_closed(mesh)) { cerr << "网格未闭合" << endl; return EXIT_FAILURE; } if (!PMP::is_manifold(mesh)) { cerr << "网格非流形" << endl; return EXIT_FAILURE; } - 使用
CGAL::polygon_mesh_to_nef_polyhedron完成转换:Nef_PHD mesh3; CGAL::polygon_mesh_to_nef_polyhedron(mesh, mesh3);
- 检查网格是否为闭合流形(Nef_polyhedron仅支持这类网格):
修正后的完整代码
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; typedef Kernel::Point_3 Point; typedef CGAL::Surface_mesh<Point> SM; typedef CGAL::Nef_polyhedron_3<Kernel> Nef_PHD; using namespace std; namespace PMP = CGAL::Polygon_mesh_processing; int main(int argc, char** argv) { const char* mesh_path = "E:/point/output/0_10_small_final.obj"; SM mesh; if (!CGAL::IO::read_polygon_mesh(mesh_path, mesh)) { cerr << "读取网格失败" << endl; return EXIT_FAILURE; } // 验证网格有效性 if (!PMP::is_closed(mesh)) { cerr << "错误:网格未闭合" << endl; return EXIT_FAILURE; } if (!PMP::is_manifold(mesh)) { cerr << "错误:网格非流形" << endl; return EXIT_FAILURE; } // 转换为Nef多面体 Nef_PHD mesh3; CGAL::polygon_mesh_to_nef_polyhedron(mesh, mesh3); cout << "转换成功" << endl; return EXIT_SUCCESS; }额外注意事项
- 若网格存在非流形、自交或未闭合问题,需先用PMP工具修复(如
PMP::triangulate_faces、PMP::remove_degenerate_faces) - Visual Studio Debug模式下,确保CGAL和Boost的库路径配置正确,链接对应Debug版本的库
- 若网格存在非流形、自交或未闭合问题,需先用PMP工具修复(如
内容的提问来源于stack exchange,提问作者DwightJavaScript
相关产品推荐
相关产品推荐

