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种解决方案:

  1. 你可以在插入后给新的顶点添加一个点,例如set_vertex_attribute(d3, create_vertex_attribute(
  2. 将insert_cell_0_in_cell_1的使用替换为线性单元复合体的方法,该方法同时更新拓扑和几何。例如,您可以使用 insert_point_in_cell 方法。

使用其中一种解决方案将为您提供有效的线性单元复合体,因此您可以将其导出为非文件。

但是,一个重要的问题是您要做什么?看起来你随机插入一些单元格,因此很可能得到一个非常奇怪的网格。

再次查看线性单元复合包的示例Modification Operations。我插入cell的时候,不是随机的飞镖,而是精确的飞镖,目的是为了做一个精确的操作。