Индекс края OpenMesh после повторного открытия модифицированной сетки

Я изменил сетку, и некоторые края были добавлены.

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

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

У меня есть решение. Я сохраняю измененную сетку (старая сетка), затем считываю сохраненный файл как новую сетку. Проверьте каждое ребро новой сетки в порядке индекса и найдите то же ребро в старой сетке. Затем я могу вывести информацию о ребре в порядке индекса ребра новой сетки.

Есть ли простое решение без повторного открытия? Например, функция OpenMesh, которая пересчитывает индексы ребер?

Спасибо

2

Решение

Исходя из того, что вы говорите, я полагаю, что вы, вероятно, используете (или, по крайней мере, должны использовать) пользовательское свойство края, в котором хранится ваша дополнительная информация. В идеале так:

auto edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew<
OpenMesh::EPropHandleT<std::string> >(mesh, "edge_info");
// Set some random edge info.
edge_pm[mesh.edge_handle(23)] = "foo";

Вы можете использовать родной OpenMesh .om формат, который позволяет хранить пользовательские свойства. Посмотрите на модульные тесты в /src/Unittests/unittests_read_write_OM.ccконкретно WriteTriangleVertexBoolProperty тот, который реализует пример, где сетка с пользовательским свойством сохраняется в .om файл, а затем снова прочитайте из этого файла. Для приведенного выше примера это будет выглядеть примерно так:

// Flag property so it gets serialized.
mesh.property(edge_pm.getRawProperty()).set_persistent(true);
bool ok = OpenMesh::IO::write_mesh(mesh, "bar.om");

Когда вы загружаете сетку из файла, обязательно сначала создайте свойство:

Mesh new_mesh;
auto new_edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew<
OpenMesh::EPropHandleT<std::string> >(new_mesh, "edge_info");
bool ok = OpenMesh::IO::read_mesh(new_mesh, "bar.om");

После этого ваша собственность должна быть восстановлена:

std::cout << new_edge_pm[new_mesh.edge_handle(23)] << std::endl;
// Should print "foo"
2

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

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

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