Insert an edges in a surface - CGAL error: assertion violation
Insert an edges in a surface - CGAL error: assertion violation
我正在使用 qt creator 创建一个应用程序,它读取 .off 文件作为 CGAL::Linear_cell_complex_for_combinatorial_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=10,#ccs=1,valid=Map 无效:dart 0x5d7df0 没有顶点。
0
输出.off文件:
OFF
8 10 0
我不知道它是如何成功插入边缘的,同时地图无效并且输出的 .off 文件不正确。
感谢任何帮助。
您使用的方法insert_cell_0_in_cell_1是来自组合映射的方法。
此方法修改了对象的拓扑结构,插入了一个新的顶点,但几何图形没有更新,因为组合映射不一定有几何图形。
有2种解决方案:
- 你可以在插入后给新的顶点添加一个点,例如set_vertex_attribute(d3, create_vertex_attribute(
- 将insert_cell_0_in_cell_1的使用替换为线性单元复合体的方法,该方法同时更新拓扑和几何。例如,您可以使用 insert_point_in_cell 方法。
使用其中一种解决方案将为您提供有效的线性单元复合体,因此您可以将其导出为非文件。
但是,一个重要的问题是您要做什么?看起来你随机插入一些单元格,因此很可能得到一个非常奇怪的网格。
再次查看线性单元复合包的示例Modification Operations。我插入cell的时候,不是随机的飞镖,而是精确的飞镖,目的是为了做一个精确的操作。
我正在使用 qt creator 创建一个应用程序,它读取 .off 文件作为 CGAL::Linear_cell_complex_for_combinatorial_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=10,#ccs=1,valid=Map 无效:dart 0x5d7df0 没有顶点。
0
输出.off文件:
OFF
8 10 0
我不知道它是如何成功插入边缘的,同时地图无效并且输出的 .off 文件不正确。
感谢任何帮助。
您使用的方法insert_cell_0_in_cell_1是来自组合映射的方法。
此方法修改了对象的拓扑结构,插入了一个新的顶点,但几何图形没有更新,因为组合映射不一定有几何图形。
有2种解决方案:
- 你可以在插入后给新的顶点添加一个点,例如set_vertex_attribute(d3, create_vertex_attribute(
- 将insert_cell_0_in_cell_1的使用替换为线性单元复合体的方法,该方法同时更新拓扑和几何。例如,您可以使用 insert_point_in_cell 方法。
使用其中一种解决方案将为您提供有效的线性单元复合体,因此您可以将其导出为非文件。
但是,一个重要的问题是您要做什么?看起来你随机插入一些单元格,因此很可能得到一个非常奇怪的网格。
再次查看线性单元复合包的示例Modification Operations。我插入cell的时候,不是随机的飞镖,而是精确的飞镖,目的是为了做一个精确的操作。