Я изменил сетку, и некоторые края были добавлены.
Затем я сохранил измененную сетку в файл .obj. Когда я открываю этот файл .obj с помощью функции чтения OpenMesh, индексы ребер отличаются от индексов ребер при сохранении сетки, поскольку файл .obj содержит информацию только о вершинах и гранях.
Мне нужно сохранить дополнительный файл информации о ребре в порядке индекса ребра при сохранении модифицированной сетки. Но согласно тому, что я упомянул выше, порядок отличается, поэтому информация о границе неверна после повторного открытия модифицированной сетки.
У меня есть решение. Я сохраняю измененную сетку (старая сетка), затем считываю сохраненный файл как новую сетку. Проверьте каждое ребро новой сетки в порядке индекса и найдите то же ребро в старой сетке. Затем я могу вывести информацию о ребре в порядке индекса ребра новой сетки.
Есть ли простое решение без повторного открытия? Например, функция OpenMesh, которая пересчитывает индексы ребер?
Спасибо
Исходя из того, что вы говорите, я полагаю, что вы, вероятно, используете (или, по крайней мере, должны использовать) пользовательское свойство края, в котором хранится ваша дополнительная информация. В идеале так:
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"
Других решений пока нет …