我正在使用qt-creator创建一个应用程序,该应用程序将.off文件读取为CGAL::Linear_cell_complex_for_combinational_map并预览它。我想对读取的网格进行操作,如删除边并恢复它。
它显示以下错误:
terminate called after throwing an instance of 'CGAL::Assertion_exception'
what(): CGAL ERROR: assertion violation!
Expr: i != idx.end()
我的代码:
filename =std::string("/home/nourhan/QT projects/cube.off");
std::ifstream ifile(filename.c_str());
if (ifile)
{
CGAL::load_off(lcc, ifile);
}
lcc.display_characteristics(std::cout) << ", valid=" <<
lcc.is_valid() << std::endl;
LCC_3::Dart_handle d2=lcc.darts().begin();
LCC_3::Dart_handle d3= lcc.insert_cell_0_in_cell_1( d2);
lcc.insert_cell_0_in_cell_2( d2);
std::vector<LCC_3::Dart_handle> adarts;
adarts.push_back(d2);
adarts.push_back(d3);
adarts.push_back(lcc.beta<1>(d3));
if (lcc.is_insertable_cell_1_in_cell_2(d2, d3))
lcc.insert_cell_1_in_cell_2( d2, d3);
lcc.display_characteristics(std::cout) << ", valid=" <<
lcc.is_valid() << std::endl;
CGAL::write_off(lcc, "copy-head.off");
}
输出:Darts=24,#0-cells=8,#1-cells=12,#2-cells=6,#ccs=1,valid=1
Darts=36,#0-cells=10,#1-cells=18,#2-cells=100,#ccs=1,valid=Map无效:dart 0x5d7df0没有顶点。
0
输出.off文件:
OFF
8 10 0
我不知道它是如何成功插入边的,同时Map无效,输出.off文件也不正确。
我感谢你的帮助。
您使用的方法insert_cell_0_in_cell_1是来自组合映射的方法。
此方法修改对象的拓扑结构,插入新顶点,但不会更新几何体,因为组合贴图不一定具有几何体。
有两种解决方案:
- 您可以在插入后向新顶点添加一个点,例如使用set_vertex_attribute(d3,create_vertex-attribute(
- 将insertcell_0_incell1的使用替换为线性单元复数的方法,该方法更新拓扑和几何结构。例如,您可以使用insert_point_in_cell方法
使用其中一个解决方案将为您提供一个有效的线性单元复合体,因此您可以将其导出为非文件。
但是,一个重要的问题是,你想做什么?你似乎随机插入了一些细胞,因此很可能会获得一个非常奇怪的网格。
再次看一下线性单元复杂包的修改操作示例。当我插入单元格时,我不采用随机的飞镖,而是采用精确的飞镖来进行精确的操作。