Как найти вершины на самой длинной границе SurfaceMesh в CGAL - PullRequest
0 голосов
/ 02 мая 2018

Я хочу использовать CGAL, чтобы отметить самую длинную границу меша типа SurfaceMesh. Я знаю, что существует функция CGAL::Polygon_mesh_processing::longest_border, но она дает только halfedge_descriptor, что в документации гласит, что является частью этой границы . Итак, как получить все вершины или половинки этой самой длинной границы.

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

И вместо цикла с next() вы также можете написать

for(vertex_descriptor : CGAL::vertices_around_face(hd, mesh){ // do something }

См. руководство

0 голосов
/ 03 мая 2018

Комбинируя вышеупомянутые ответы, следующий ответ печатает список индекса всех вершин, лежащий на самой длинной границе (и также сохраняет вектор индекса). Для простоты включения игнорируются:

typedef CGAL::Simple_cartesian<double>    Kernel;
typedef CGAL::Surface_mesh<Kernel::Kernel::Point_3>  SurfaceMesh;
typedef boost::graph_traits<SurfaceMesh>::halfedge_descriptor  halfedge_descriptor;
typedef SurfaceMesh::Vertex_index  mesh_vertex_descriptor;

boost::filesystem::path in;
SurfaceMesh sm;
std::vector<int> borderVertexID;
in >> sm;
bhd = CGAL::Polygon_mesh_processing::longest_border(sm).first;
BOOST_FOREACH(mesh_vertex_descriptor ved, vertices_around_face(bhd,sm)){
    std::cout << ved << std::endl;
    borderVertexID.push_back(ved);
  }
0 голосов
/ 03 мая 2018

Вы можете использовать что-то подобное:

halfedge_descriptor hd = CGAL::Polygon_mesh_processing::longest_border(mesh);
halfedge_descriptor start = hd;
do
{
  //store hd 
  hd = next(hd, mesh);
}while hd != start;
...