Разделение сетки на связанные компоненты в Openmesh


У меня есть obj-файл mesh, и я хочу извлечь из него связанные компоненты через OpenMesh. Я могу найти граничные вершины и ребра, но есть ли способ непосредственно разделить сетку на связанные компоненты в Openmesh ?

1 2

1 ответ:

Эта функциональность не обеспечивается OpenMesh (целью библиотеки является только предоставление структуры данных mesh). OpenFlipper , библиотека обработки сетки, построенная поверх OpenMesh, является более подходящим кандидатом, но также не обеспечивает эту функциональность. Однако вы можете найти в кодовой базе в MeshTools/MeshInfoT.cc функцию componentCount, которая подсчитывает количество связанных компонентов (она просто выполняет поиск по глубине на графе вершин).

Исходя из этого функция, вы должны быть в состоянии написать код для разделения сетки на ее связанные компоненты:

  1. Добавьте свойство Связного номера компонента на вершину (например, инициализированное до -1, что означает, что вершина еще не посещена).
  2. пересеките вершины сетки с помощью поиска по глубине (или поиска по ширине)..), и установить этот номер компонента для каждой вершины:
    1. Когда найдена не посещенная вершина, увеличьте текущий номер Связного компонента и создайте новый связная компонента. Найденная вершина используется в качестве начальной вершины для этого компонента.
    2. задайте номер компонента всех вершин, пройденных от начальной вершины Связного компонента.
  3. после того, как обход выполнен, общее число связанных компонентов известно, и для каждой вершины также известен номер ее компонента. Из этой информации можно построить связные компонентные сетки (все вершины, принадлежащие компоненту, известны, а грани могут быть идентифицированы с помощью ссылки на половину ребра вершины). Для каждого подключенного компонента:
    1. создайте новую сетку для этого связанного компонента.
    2. Добавьте все вершины из одного связного компонента. Создайте отображение от дескриптора вершины в исходной сетке к соответствующему дескриптору вершины в новой сетке для связанного компонента.
    3. найти все грани компонента: для достижения этого простым способом может быть перебор всех вершин компонента и для каждая вершина перебирает все грани, к которым она принадлежит. Для каждой вновь пройденной грани создайте грань в новой компонентной сетке, ссылающуюся на новые вершинные дескрипторы (используя отображение от старых к новым вершинным дескрипторам).