CG|CGAL-SDF原理讲解以及使用

综述
最近老师安排我们熟悉CGAL的SDF工具。上周才弄完,这周发一下。
作业较多所以拖的有点晚。
环境
clion
基础知识
SDF详细讲解
这里面讲的很详细,但是需要注意SDF算法本身是有缺陷的。对于那么环状的处理是不佳的。
代码
核心代码 导入为mesh

SM mesh; if (argc==2){ std::ifstream input(argv[1]); input >> mesh; } else { std::ifstream cactus("/Users/frankdura/Desktop/CG_playground/bunny.off"); cactus >> mesh; } //将mesh导入

将mesh灌入函数,在此之前你需要将面与id相关联
CGAL::sdf_values(mesh, sdf_property_map);

【CG|CGAL-SDF原理讲解以及使用】对mesh分割
std::size_t number_of_segments = CGAL::segmentation_from_sdf_values(mesh, sdf_property_map, segment_property_map);

完整代码
#include #include #include #include #include #include #include #include #include #include typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef CGAL::Surface_mesh SM; typedef boost::graph_traits::face_descriptor face_descriptor; int main(int argc, char** argv ) { SM mesh; if (argc==2){ std::ifstream input(argv[1]); input >> mesh; } else { std::ifstream cactus("/Users/frankdura/Desktop/CG_playground/bunny.off"); cactus >> mesh; } //将mesh导入 typedef SM::Property_map Facet_double_map; Facet_double_map sdf_property_map; sdf_property_map = mesh.add_property_map("f:sdf").first; CGAL::sdf_values(mesh, sdf_property_map); // 为每个segment创建联系 typedef SM::Property_map Facet_int_map; Facet_int_map segment_property_map = mesh.add_property_map("f:sid").first; ; // segment the mesh using default parameters for number of levels, and smoothing lambda // Any other scalar values can be used instead of using SDF values computed using the CGAL functionstd::size_t number_of_segments = CGAL::segmentation_from_sdf_values(mesh, sdf_property_map, segment_property_map); typedef CGAL::Face_filtered_graph Filtered_graph; Filtered_graph segment_mesh(mesh, 0, segment_property_map); for(std::size_t id = 0; id < number_of_segments; ++id) { if(id > 0) segment_mesh.set_selected_faces(id, segment_property_map); //得到被选中的曲面 std::cout << "Segment "<

    推荐阅读