#include #include #include #include #include #include class cotmatrix_intrinsic : public ::testing::TestWithParam {}; TEST(cotmatrix_intrinsic, periodic) { const Eigen::MatrixXi F = (Eigen::MatrixXi(18,3)<< 0,3,1, 3,4,1, 1,4,2, 4,5,2, 2,5,0, 5,3,0, 3,6,4, 6,7,4, 4,7,5, 7,8,5, 5,8,3, 8,6,3, 6,0,7, 0,1,7, 7,1,8, 1,2,8, 8,2,6, 2,0,6).finished(); const Eigen::MatrixXd l = (Eigen::MatrixXd(18,3)<< 0.47140452079103168,0.33333333333333331,0.33333333333333331, 0.33333333333333331,0.47140452079103168,0.33333333333333331, 0.47140452079103168,0.33333333333333331,0.33333333333333331, 0.33333333333333331,0.47140452079103168,0.33333333333333331, 0.47140452079103168,0.33333333333333337,0.33333333333333331, 0.33333333333333331,0.47140452079103168,0.33333333333333337, 0.47140452079103168,0.33333333333333331,0.33333333333333331, 0.33333333333333331,0.47140452079103168,0.33333333333333331, 0.47140452079103168,0.33333333333333331,0.33333333333333331, 0.33333333333333331,0.47140452079103168,0.33333333333333331, 0.47140452079103168,0.33333333333333337,0.33333333333333331, 0.33333333333333331,0.47140452079103168,0.33333333333333337, 0.47140452079103168,0.33333333333333331,0.33333333333333337, 0.33333333333333337,0.47140452079103168,0.33333333333333331, 0.47140452079103168,0.33333333333333331,0.33333333333333337, 0.33333333333333337,0.47140452079103168,0.33333333333333331, 0.47140452079103173,0.33333333333333337,0.33333333333333337, 0.33333333333333337,0.47140452079103173,0.33333333333333337).finished(); Eigen::SparseMatrix L; igl::cotmatrix_intrinsic(l,F,L); const Eigen::MatrixXd L_d = L; const Eigen::MatrixXd L_gt = (Eigen::MatrixXd(9,9)<< -4,1,1,1,0,0,1,0,0, 1,-4,1,0,1,0,0,1,0, 1,1,-4,0,0,1,0,0,1, 1,0,0,-4,1,1,1,0,0, 0,1,0,1,-4,1,0,1,0, 0,0,1,1,1,-4,0,0,1, 1,0,0,1,0,0,-4,1,1, 0,1,0,0,1,0,1,-4,1, 0,0,1,0,0,1,1,1,-4).finished(); test_common::assert_near(L_d,L_gt,igl::EPS()); } TEST_P(cotmatrix_intrinsic , manifold_meshes) { Eigen::MatrixXd V; Eigen::MatrixXi F; test_common::load_mesh(GetParam(), V, F); Eigen::MatrixXd l; igl::edge_lengths(V,F,l); Eigen::SparseMatrix L,Li; igl::cotmatrix(V,F,L); igl::cotmatrix_intrinsic(l,F,Li); // Augh, we don't have assert_near for sparse matrices... // Instead test that bilinear form is near equal for 2 random vectors const Eigen::VectorXd u = Eigen::VectorXd::Random(V.rows(),1); const Eigen::VectorXd v = Eigen::VectorXd::Random(V.rows(),1); const double uv = u.norm()*v.norm(); ASSERT_NEAR( u.dot(L*v)/uv, u.dot(Li*v)/uv, igl::EPS()); } INSTANTIATE_TEST_CASE_P ( manifold_meshes, cotmatrix_intrinsic, ::testing::ValuesIn(test_common::manifold_meshes()), test_common::string_test_name );