intrinsic_delaunay_cotmatrix.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <test_common.h>
  2. #include <igl/intrinsic_delaunay_cotmatrix.h>
  3. #include <igl/EPS.h>
  4. #include <igl/triangulated_grid.h>
  5. #include <igl/is_border_vertex.h>
  6. TEST_CASE("intrinsic_delaunay_cotmatrix: skewed_grid", "[igl]")
  7. {
  8. Eigen::MatrixXd V;
  9. Eigen::MatrixXi F;
  10. const int s = 7;
  11. igl::triangulated_grid(s,s,V,F);
  12. // Skew against diagonal direction
  13. V.col(0) -= 1.1*V.col(1);
  14. Eigen::SparseMatrix<double> L;
  15. Eigen::MatrixXi F_intrinsic;
  16. Eigen::MatrixXd l_intrinsic;
  17. igl::intrinsic_delaunay_cotmatrix(V,F,L,l_intrinsic,F_intrinsic);
  18. Eigen::VectorXi LI,LJ;
  19. Eigen::VectorXd LV;
  20. igl::find(L,LI,LJ,LV);
  21. const auto is_boundary_edge = [](const int i, const int j, const int s)->bool
  22. {
  23. const auto is_boundary_vertex = [](const int i, const int s)->bool
  24. {
  25. return (i<s) || (i>=s*s-s) || (i%s == 0) || (i%s == s-1);
  26. };
  27. return is_boundary_vertex(i,s) && is_boundary_vertex(j,s);
  28. };
  29. // Off diagonals should be all non-positive
  30. for(int k = 0;k<LI.size();k++)
  31. {
  32. if(LI(k) != LJ(k) && !is_boundary_edge(LI(k),LJ(k),s))
  33. {
  34. REQUIRE (-igl::EPS<double>() < LV(k));
  35. }
  36. }
  37. }
  38. TEST_CASE("intrinsic_delaunay_cotmatrix: manifold_meshes", "[igl]")
  39. {
  40. auto test_case = [](const std::string &param)
  41. {
  42. Eigen::MatrixXd V;
  43. Eigen::MatrixXi F;
  44. test_common::load_mesh(param, V, F);
  45. Eigen::SparseMatrix<double> L;
  46. Eigen::MatrixXi F_intrinsic;
  47. Eigen::MatrixXd l_intrinsic;
  48. igl::intrinsic_delaunay_cotmatrix(V,F,L,l_intrinsic,F_intrinsic);
  49. Eigen::VectorXi LI,LJ;
  50. Eigen::VectorXd LV;
  51. igl::find(L,LI,LJ,LV);
  52. const std::vector<bool> is_boundary_vertex = igl::is_border_vertex(F);
  53. // Off diagonals should be all non-positive
  54. for(int k = 0;k<LI.size();k++)
  55. {
  56. if(LI(k) != LJ(k) &&
  57. !(is_boundary_vertex[LI(k)] && is_boundary_vertex[LJ(k)]))
  58. {
  59. REQUIRE (-igl::EPS<double>() < LV(k));
  60. }
  61. }
  62. };
  63. test_common::run_test_cases(test_common::manifold_meshes(), test_case);
  64. }