Рекурсивная итерация OpenMesh

Недавно я начал использовать OpenMesh, и мне нужно сделать рекурсивную итерацию, где я обращаюсь к одной вершине, затем к ее соседним вершинам, а затем к их соседям. Мне также нужно вести список вершин, которые я уже использовал. Моя основная проблема заключается в том, что я не знаю, как получить идентификатор вершины, чтобы я мог получить доступ к определенным вершинам.


person Phil333    schedule 23.03.2016    source источник
comment
Добро пожаловать в Stack Overflow! Пройдите тур и прочитайте Как Спросите, чтобы узнать, чего мы ожидаем от вопросов здесь. Имейте в виду, что мы не предоставляем услугу кодирования с нуля. Пожалуйста, покажите нам, что вы уже пробовали, как это не удалось, и мы могли бы помочь.   -  person Nitish    schedule 23.03.2016
comment
Итак, насколько я понимаю с OpenMesh, я могу циклически перемещаться по вершинам или сетке, используя MyMesh::VertexIter. Для циклического обхода соседних вершин я могу использовать MyMesh::VertexVertexIter. Но я не знаю, как преобразовать VertexVertexiter в Vertexiter. Итак, я думаю, мой фактический вопрос заключается в том, как я могу получить идентификатор из этих вершин, чтобы я мог обращаться к ним без этих инструментов итерации?   -  person Phil333    schedule 23.03.2016


Ответы (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
comment
Обратите внимание, что аргумент mesh передается по значению, в результате чего ваша сетка копируется при каждом вызове graphTraversal. Это сильно повлияет на производительность. Вы должны передать mesh по (const) ссылке! - person hc_; 02.05.2016
comment
Да, это имеет смысл, учитывая количество вершин, которые я перебираю. Спасибо за ваш комментарий. - person Phil333; 05.05.2016
comment
Пожалуйста, отредактируйте свой ответ соответствующим образом, чтобы начинающие пользователи, которые не читают комментарии, не столкнулись с этой ловушкой. - person hc_; 06.05.2016