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

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

2

Решение

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]