Вставить ребра в поверхность - ошибка CGAL: нарушение утверждения - PullRequest
0 голосов
/ 23 января 2019

Я создаю приложение, используя 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");
 }

выход: Дартс = 24, # 0-ячеек = 8, # 1-ячеек = 12, # 2-ячеек = 6, # ccs = 1, действительный = 1

Дартс = 36, # 0-ячеек = 10, # 1-ячеек = 18, # 2-ячеек = 10, # ccs = 1, действительный = Карта недействительна: у дротика 0x5d7df0 нет вершины.

0

выходной файл .off:

OFF 
8 10 0

Я не знаю, как он успешно вставил ребра, и в то же время карта недействительна, а выходной файл .off неверен.

Я ценю любую помощь.

1 Ответ

0 голосов
/ 24 января 2019

Метод, который вы используете, 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 .

Использование одного изэти решения дадут вам действительный линейный комплекс ячеек, и, таким образом, вы сможете экспортировать его в виде файла.

Но один важный вопрос: что вы пытаетесь сделать? Кажется, вы вставляете несколько ячеек случайным образом, поэтомувесьма вероятно, получит очень странную сетку.

Посмотрите еще раз на EXAmples Операции модификации комплексного пакета с линейными ячейками.Когда я вставляю ячейки, я беру не случайные дротики, а точные дротики, чтобы выполнить точную операцию.

...