在曲面中插入边缘-CGAL错误:违反断言

时间:2019-01-23 08:55:36

标签: c++ computational-geometry cgal

我正在使用qt创建器创建一个应用程序,该应用程序以CGAL :: Linear_cell_complex_for_combinatorial_map读取.off文件并对其进行预览,我想对读取的网格进行操作,例如删除边缘并还原它。

它显示以下错误:

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");
 }

输出: 飞镖= 24,#0-单元= 8,#1-单元= 12,#2-单元= 6,#ccs = 1,有效= 1

Darts = 36,#0-cells = 10,#1-cells = 18,#2-cells = 10,#ccs = 1,有效=地图无效:dart 0x5d7df0没有顶点。

0

.off输出文件:

OFF 
8 10 0

我不知道它是如何成功插入边缘的,同时Map无效并且输出的.off文件不正确。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您使用的方法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。插入单元格时,为了进行精确的操作,我不会随机飞镖,而是精确飞镖。