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);

对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_mapdouble> Facet_double_map;
    Facet_double_map sdf_property_map;
    sdf_property_map = mesh.add_property_mapdouble>("f:sdf").first;
    CGAL::sdf_values(mesh, sdf_property_map);
    // 为每个segment创建联系
    typedef SM::Property_mapstd::size_t> Facet_int_map;
    Facet_int_map segment_property_map = mesh.add_property_mapstd::size_t>("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 function

    std::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 "<"'s area is : "<std::endl;
        SM out;
        CGAL::copy_face_graph(segment_mesh, out);
        std::ostringstream oss;
        oss << "/Users/frankdura/Desktop/CG_playground/Segment_" << id<<".off";
        std::ofstream os(oss.str().data());
        os<

你可能感兴趣的:(CG,CGAL)