From 8ce1dc352cb5639a01a5ebaf566af1cfb03ab40e Mon Sep 17 00:00:00 2001 From: Daniel Zint Date: Fri, 27 Jun 2025 14:15:00 +0200 Subject: [PATCH] Test for comparing different non-manifold splitting methods. --- tests/test_manifold.cpp | 91 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/tests/test_manifold.cpp b/tests/test_manifold.cpp index 4beb4cf665..641de269ce 100644 --- a/tests/test_manifold.cpp +++ b/tests/test_manifold.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -45,3 +46,93 @@ TEST_CASE("manifold-separate-test-37989", "[test_util]") Eigen::VectorXi VI; REQUIRE(igl::is_vertex_manifold(F, VI)); } + +TEST_CASE("compare_lagrange_igl", "[test_util][.]") +{ + wmtk::manifold_internal::Vertices V; + wmtk::manifold_internal::Facets F; + + // SECTION("simple") + //{ + // F.resize(2, 3); + // F.row(0) << 0, 1, 2; + // F.row(1) << 1, 0, 3; // same orientation + // + // V.resize(4, 3); + // V.setZero(); + //} + SECTION("twisted") + { + F.resize(2, 3); + F.row(0) << 0, 1, 2; + F.row(1) << 0, 1, 3; // different orientation + + V.resize(4, 3); + V.setZero(); + } + SECTION("large") + { + std::string filename = WMTK_DATA_DIR "/37989_sf.obj"; + igl::read_triangle_mesh(filename, V, F); + // REQUIRE_FALSE(igl::is_edge_manifold(F)); + // std::vector modified_vertices; + // wmtk::manifold_internal::resolve_nonmanifoldness(V, F, modified_vertices); + // REQUIRE(modified_vertices.size() > 0); + // REQUIRE(igl::is_edge_manifold(F)); + // Eigen::VectorXi VI; + // REQUIRE(igl::is_vertex_manifold(F, VI)); + } + + { + Eigen::VectorXi SVI; + wmtk::manifold_internal::Facets SF; + igl::split_nonmanifold(F, SF, SVI); + // std::cout << "IGL:\n" << SF << std::endl; + + wmtk::manifold_internal::Vertices V_new; + V_new.resize(SVI.size(), V.cols()); + std::map used_vids; // map old vertex ID to first new ID + std::set modified_vertices; + for (int i = 0; i < SVI.size(); ++i) { + auto old_vid = SVI[i]; + + V_new.row(i) = V.row(old_vid); + if (used_vids.count(old_vid) > 0) { + // vertex was duplicated + modified_vertices.insert(used_vids[old_vid]); + modified_vertices.insert(i); + } else { + used_vids[old_vid] = i; // store first occurance + } + } + + // F = SF; + + // std::cout << SVI.transpose() << std::endl; + // std::cout << "IGL MOD: "; + // for (const auto v : modified_vertices) { + // std::cout << v << " "; + // } + // std::cout << std::endl; + std::cout << "IGL " << modified_vertices.size() << std::endl; + + CHECK(igl::is_edge_manifold(SF)); + Eigen::VectorXi VI; + CHECK(igl::is_vertex_manifold(SF, VI)); + } + { + std::vector modified_vertices; + wmtk::manifold_internal::resolve_nonmanifoldness(V, F, modified_vertices); + // std::cout << "LAG:\n" << F << std::endl; + // std::cout << "LAG MOD: "; + // for (const auto v : modified_vertices) { + // std::cout << v << " "; + // } + // std::cout << std::endl; + std::cout << "LAG " << modified_vertices.size() << std::endl; + + CHECK(igl::is_edge_manifold(F)); + Eigen::VectorXi VI; + CHECK(igl::is_vertex_manifold(F, VI)); + } +}