如何使用CGAL存储折叠的边缘

时间:2019-02-23 11:10:04

标签: c++ qt computational-geometry cgal

我正在QT-creator上创建一个应用程序,并使用CGAL将.off文件读取为Linear_cell_complex_for_bgl_combinatorial_map_helper并使用edge_collapse方法对其进行简化。 我要存储塌陷边,入射顶点,点的位置以及其他所需信息的列表,以再次重新插入已去除边。

我的代码

namespace SMS = CGAL::Surface_mesh_simplification ;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Linear_cell_complex_traits<3, Kernel> MyTraits;
typedef CGAL::Linear_cell_complex_for_bgl_combinatorial_map_helper<2, 3, MyTraits>::type LCC;

typedef boost::graph_traits<LCC>::vertex_descriptor vertex_descriptor;
typedef SMS::Edge_profile<LCC> Profile ;
struct Stats
{
  Stats() :  collapsed(0) {}
  std::size_t collapsed ;
} ;

struct My_visitor : SMS::Edge_collapse_visitor_base<LCC>
{

My_visitor( Stats* s) : stats(s){}
void OnCollapsed( Profile const&, vertex_descriptor )
  {
    ++ stats->collapsed;
  }

Stats* stats ;
};


    namespace SMS = CGAL::Surface_mesh_simplification ;

    SMS::Count_stop_predicate<LCC> stop(1000);
    Stats stats ;

    My_visitor vis(&stats) ;

 int r = SMS::edge_collapse
   (lcc
    ,stop
    ,CGAL::parameters::halfedge_index_map(get(CGAL::halfedge_index, lcc))
             .vertex_index_map(get(boost::vertex_index, lcc))
             .get_cost(SMS::Edge_length_cost<LCC>())
   .get_placement(SMS::Midpoint_placement<LCC>()).visitor(vis)
    );

 std::cout << "\nEdges collapsed: "  << stats.collapsed
            << std::endl;

我尝试使用Edge_collapse_visitor_base来获取未折叠边缘的信息,但是我不知道要获取与折叠边缘相关的信息。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我在github上有一个branch,我在其中使用访客记录边缘塌陷。并且我向访问者添加了更多回调,以便可以撤消边缘崩溃。我使其适用于CGAL::Surface_mesh和OpenMesh。

答案 1 :(得分:1)

看看定义访问者类的概念:EdgeCollapseSimplificationVisitor。如果实现OnCollapsing方法。其参数Profile const & profile包含您需要的所有信息。