gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:40:58 25 4
gpt4 key购买 nike

我正在 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 来获取没有折叠边,但我不知道如何获取与折叠边相关的信息。

感谢任何帮助。

最佳答案

我有一个 branch在 github 上,我使用访问者记录边缘崩溃。我还向访问者添加了进一步的回调,以便可以撤消边缘折叠。我让它适用于 CGAL::Surface_mesh 以及 OpenMesh。

关于c++ - 如何使用 CGAL 存储折叠的边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54840943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com