Недавно я начал использовать OpenMesh, и мне нужно сделать рекурсивную итерацию, где я обращаюсь к одной вершине, затем к ее соседним вершинам, а затем к их соседям. Мне также нужно вести список вершин, которые я уже использовал. Моя основная проблема заключается в том, что я не знаю, как получить идентификатор вершины, чтобы я мог получить доступ к определенным вершинам.
Рекурсивная итерация OpenMesh
Ответы (1)
Удалось решить мою проблему: дескриптор можно выбрать по его идентификационному номеру следующим образом:
MyMesh::VHandle myVertexHandle = mesh.vertex_handle(ID_number);
Чтобы вернуть идентификационный номер из VertexHandle, используйте следующую команду:
myVertexHandle.idx();
Чтобы рекурсивно пройтись по сетке из начальной вершины, используйте следующий код:
void graphTraversal(const MyMesh& mesh, MyMesh::VHandle start)
{
// print starting vertex handle
std::cout << "Vertex " << start.idx() << std::endl;
// retrieve XYZ of initial vertex
OpenMesh::Vec3f pointA = mesh.point(start);
for (MyMesh::VOHIter vohit = mesh.voh_iter(start); vohit.is_valid(); ++vohit)
{
MyMesh::VHandle newHandle = mesh.to_vertex_handle(*vohit);
// used to retrive point X Y Z positions
OpenMesh::Vec3f point = mesh.point(newHandle);
// print out neighbouring vertex x y z position
std:cout << point[0] << " " << point[1] << " " << point[2] << std::endl;
// call the recursive function from the new vertex
graphTraversal(mesh, newHandle );
}
return;
}
person
Phil333
schedule
01.04.2016
Обратите внимание, что аргумент
mesh
передается по значению, в результате чего ваша сетка копируется при каждом вызове graphTraversal
. Это сильно повлияет на производительность. Вы должны передать mesh
по (const
) ссылке!
- person hc_; 02.05.2016
Да, это имеет смысл, учитывая количество вершин, которые я перебираю. Спасибо за ваш комментарий.
- person Phil333; 05.05.2016
Пожалуйста, отредактируйте свой ответ соответствующим образом, чтобы начинающие пользователи, которые не читают комментарии, не столкнулись с этой ловушкой.
- person hc_; 06.05.2016
MyMesh::VertexIter
. Для циклического обхода соседних вершин я могу использоватьMyMesh::VertexVertexIter
. Но я не знаю, как преобразовать VertexVertexiter в Vertexiter. Итак, я думаю, мой фактический вопрос заключается в том, как я могу получить идентификатор из этих вершин, чтобы я мог обращаться к ним без этих инструментов итерации? - person Phil333   schedule 23.03.2016