#include #include #include #include #include TEST_CASE("cotmatrix_entries: simple", "[igl]") { //The allowed error for this test const double epsilon = 1e-15; Eigen::MatrixXd V; Eigen::MatrixXi F; //This is a cube of dimensions 1.0x1.0x1.0 igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F); //Prepare another mesh with triangles along side diagonals of the cube //These triangles are form a regular tetrahedron of side sqrt(2) Eigen::MatrixXi F_tet(4,3); F_tet << 4,6,1, 6,4,3, 4,1,3, 1,6,3; //1. Check cotmatrix_entries Eigen::MatrixXd C1; igl::cotmatrix_entries(V,F,C1); REQUIRE (C1.rows() == F.rows()); REQUIRE (C1.cols() == 3); //All angles in unit cube measure 45 or 90 degrees //Their (half)cotangent must value 0.5 or 0.0 for(int f = 0;f 0.1) REQUIRE (C1(f,v) == 0.5); else REQUIRE (C1(f,v) == 0.0); //All cotangents sum 1.0 for those triangles REQUIRE (C1.row(f).sum() == 1.0); #else //Soft assert if we have not edge_length_squared for(int v = 0;v<3;v++) if (C1(f,v) > 0.1) REQUIRE (C1(f,v) == Approx (0.5).margin( epsilon)); else REQUIRE (C1(f,v) == Approx (0.0).margin( epsilon)); //All cotangents sum 1.0 for those triangles REQUIRE (C1.row(f).sum() == Approx (1.0).margin( epsilon)); #endif } //Check the regular tetrahedron Eigen::MatrixXd C2; igl::cotmatrix_entries(V,F_tet,C2); REQUIRE (C2.rows() == F_tet.rows()); REQUIRE (C2.cols() == 3); for(int f = 0;f 0.1) REQUIRE (C1(f,v) == 0.5); else REQUIRE (C1(f,v) == 0.0); //All cotangents sum 1.0 for those triangles REQUIRE (C1.row(f).sum() == 1.0); #else //Soft assert if we have not edge_length_squared for(int v = 0;v<3;v++) if (C1(f,v) > 0.1) REQUIRE (C1(f,v) == Approx (0.5).margin( epsilon)); else REQUIRE (C1(f,v) == Approx (0.0).margin( epsilon)); //All cotangents sum 1.0 for those triangles REQUIRE (C1.row(f).sum() == Approx (1.0).margin( epsilon)); #endif } //Check the huge regular tetrahedron igl::cotmatrix_entries(V_huge,F_tet,C2); REQUIRE (C2.rows() == F_tet.rows()); REQUIRE (C2.cols() == 3); for(int f = 0;f 0.1) REQUIRE (C1(f,v) == Approx (0.5).margin( epsilon)); else REQUIRE (C1(f,v) == Approx (0.0).margin( epsilon)); //All cotangents sum 1.0 for those triangles REQUIRE (C1.row(f).sum() == Approx (1.0).margin( epsilon)); } //Check the tiny regular tetrahedron igl::cotmatrix_entries(V_tiny,F_tet,C2); REQUIRE (C2.rows() == F_tet.rows()); REQUIRE (C2.cols() == 3); for(int f = 0;f()); }