Связь треугольника CGAL с Facet_iterator и идентификатором примитива - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь связать грани треугольника CGAL Polyhedron_3 с Primitive :: ID с массивом фасетов, полученных путем итерации с помощью Facet_iterator.

У меня есть треугольная сетка Polyhedron_3, созданная из файла .off с помощью функции read_off(). Теперь я использую дерево AABB_tree, чтобы найти ближайший треугольник к точке. Я успешно подаю заявку AABB_tree::closest_point_and_primitive(). Однако я не смог найти способ преобразовать Primitive :: Id в целое число, соответствующее фасету.

Чтобы было понятно, зачем мне нужно это целое число: я использую Polyhedron :: Facet_iterator, чтобы экспортировать все треугольники в массив для визуализации. В другом массиве я хотел бы сохранить информацию из поиска ближайшей точки. Чтобы получить доступ к нужной позиции, мне нужен соответствующий идентификатор из Primitive :: ID в виде целого числа.

Я нашел возможное решение здесь и попытался реализовать его безуспешно.

В моем классе MeshModel я получаю Facet_iterator:

Polyhedron::Facet_iterator MeshModel::getFacetIterator() {
  return P_.facets_begin();
}

После использования closest_point_and_primitive():

cgal::Polyhedron::Facet_iterator iterator = mesh_model->getFacetIterator();
int triangle_id = &(*ppid.second) - &(*iterator);
associations.triangles_to.push_back(triangle_id);

Не уверен, что я здесь делаю неправильно или есть лучшее решение, чтобы получить целочисленные значения между 0 и "числом граней". И я не могу найти документацию о том, что на самом деле Primitive :: Id.

Это сообщение об ошибке, которое я сейчас получаю:

error: request for member ‘push_back’ in ‘associations::Associations::triangles_to’, which is of non-class type ‘int [0]’
     associations.triangles_to.push_back(triangle_id);

1 Ответ

0 голосов
/ 13 мая 2019

Нашел решение, используя

typedef CGAL::Polyhedron_3<Kernel, CGAL::Polyhedron_items_with_id_3> Polyhedron;

После прочтения в файле .off я устанавливаю идентификатор

std::size_t i = 0;
for (Polyhedron::Facet_iterator facet = P_.facets_begin(); facet != P_.facets_end(); ++facet) {
    facet->id() = i++;
  }

И затем, после closest_point_and_primitive (), я получаю идентификатор, используя Primitive :: ID, который на самом деле является Facet_handle:

int getFacetIndex(Polyhedron::Facet_handle &handle) {
  int facet_id;
  facet_id = handle->id();
  return facet_id;
}
...