intrinsic_delaunay_triangulation.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <test_common.h>
  2. #include <igl/intrinsic_delaunay_triangulation.h>
  3. #include <igl/edge_lengths.h>
  4. #include <igl/triangulated_grid.h>
  5. #include <igl/is_delaunay.h>
  6. #include <igl/is_intrinsic_delaunay.h>
  7. #include <igl/is_edge_manifold.h>
  8. #include <igl/unique_simplices.h>
  9. #include <igl/get_seconds.h>
  10. #include <igl/matlab_format.h>
  11. TEST_CASE("intrinsic_delaunay_triangulation: two_triangles", "[igl]")
  12. {
  13. const Eigen::MatrixXd V =
  14. (Eigen::MatrixXd(4,2)<<
  15. 0,12,
  16. 1,0,
  17. 1,20,
  18. 2,9).finished();
  19. const Eigen::MatrixXi FN =
  20. (Eigen::MatrixXi(2,3)<<
  21. 0,1,2,
  22. 2,1,3).finished();
  23. Eigen::MatrixXd lN;
  24. igl::edge_lengths(V,FN,lN);
  25. Eigen::MatrixXd l;
  26. Eigen::MatrixXi F;
  27. igl::intrinsic_delaunay_triangulation( lN, FN, l, F);
  28. Eigen::MatrixXd lext;
  29. igl::edge_lengths(V,F,lext);
  30. test_common::assert_near(l,lext,1e-10);
  31. }
  32. TEST_CASE("intrinsic_delaunay_triangulation: skewed_grid", "[igl]")
  33. {
  34. Eigen::MatrixXd V;
  35. Eigen::MatrixXi F_in;
  36. igl::triangulated_grid(4,4,V,F_in);
  37. // Skew against diagonal direction
  38. V.col(0) -= 1.5*V.col(1);
  39. Eigen::MatrixXd l_in;
  40. igl::edge_lengths(V,F_in,l_in);
  41. Eigen::MatrixXd l;
  42. Eigen::MatrixXi F;
  43. igl::intrinsic_delaunay_triangulation( l_in, F_in, l, F);
  44. Eigen::MatrixXd lext;
  45. igl::edge_lengths(V,F,lext);
  46. test_common::assert_near(l,lext,1e-10);
  47. Eigen::Matrix<bool,Eigen::Dynamic,3> D;
  48. igl::is_delaunay(V,F,D);
  49. const Eigen::Matrix<bool,Eigen::Dynamic,3> Dtrue =
  50. Eigen::Matrix<bool,Eigen::Dynamic,3>::Constant(F.rows(),F.cols(),true);
  51. test_common::assert_eq(D,Dtrue);
  52. }
  53. TEST_CASE("intrinsic_delaunay_triangulation: peaks", "[igl]")
  54. {
  55. Eigen::MatrixXd V2;
  56. Eigen::MatrixXi F_in;
  57. igl::triangulated_grid(20,20,V2,F_in);
  58. Eigen::MatrixXd V(V2.rows(),3);
  59. for(int v=0;v<V.rows();v++)
  60. {
  61. const auto x = (V2(v,0)-0.5)*6.0;
  62. const auto y = (V2(v,1)-0.5)*6.0;
  63. // peaks.m
  64. const auto z = 3.*(1.-x)*(1.-x)*std::exp(-(x*x) - (y+1.)*(y+1.)) +
  65. - 10.*(x/5. - x*x*x - y*y*y*y*y)*std::exp(-x*x-y*y) +
  66. - 1./3.*std::exp(-(x+1.)*(x+1.) - y*y);
  67. V(v,0) = x;
  68. V(v,1) = y;
  69. V(v,2) = z;
  70. }
  71. Eigen::MatrixXd l_in;
  72. igl::edge_lengths(V,F_in,l_in);
  73. Eigen::MatrixXd l;
  74. Eigen::MatrixXi F;
  75. Eigen::MatrixXi E,uE;
  76. Eigen::VectorXi EMAP;
  77. std::vector<std::vector<int> > uE2E;
  78. igl::intrinsic_delaunay_triangulation(l_in,F_in,l,F,E,uE,EMAP,uE2E);
  79. Eigen::Matrix<bool,Eigen::Dynamic,3> D;
  80. const Eigen::Matrix<bool,Eigen::Dynamic,3> D_gt =
  81. Eigen::Matrix<bool,Eigen::Dynamic,3>::Constant(F.rows(),F.cols(),true);
  82. igl::is_intrinsic_delaunay(l,F,uE2E,D);
  83. test_common::assert_eq(D,D_gt);
  84. }
  85. TEST_CASE("intrinsic_delaunay_triangulation: tet", "[igl]")
  86. {
  87. const Eigen::MatrixXd V = (Eigen::MatrixXd(4,3)<<
  88. 10, 4,7,
  89. 5, 9,0,
  90. 8, 8,8,
  91. 1,10,9).finished();
  92. const Eigen::MatrixXi F_in = (Eigen::MatrixXi(4,3)<<
  93. 0,1,2,
  94. 0,2,3,
  95. 0,3,1,
  96. 1,3,2).finished();
  97. const Eigen::Matrix<bool,Eigen::Dynamic,3> D_before =
  98. (Eigen::Matrix<bool,Eigen::Dynamic,3>(4,3)<<
  99. 1,1,1,
  100. 1,0,1,
  101. 1,1,0,
  102. 1,1,1).finished();
  103. Eigen::Matrix<bool,Eigen::Dynamic,3> D;
  104. Eigen::MatrixXd l_in;
  105. igl::edge_lengths(V,F_in,l_in);
  106. igl::is_intrinsic_delaunay(l_in,F_in,D);
  107. test_common::assert_eq(D,D_before);
  108. Eigen::MatrixXd l;
  109. Eigen::MatrixXi F;
  110. Eigen::MatrixXi E,uE;
  111. Eigen::VectorXi EMAP;
  112. std::vector<std::vector<int> > uE2E;
  113. igl::intrinsic_delaunay_triangulation(l_in,F_in,l,F,E,uE,EMAP,uE2E);
  114. const Eigen::Matrix<bool,Eigen::Dynamic,3> D_after =
  115. Eigen::Matrix<bool,Eigen::Dynamic,3>::Constant(F.rows(),F.cols(),true);
  116. igl::is_intrinsic_delaunay(l,F,uE2E,D);
  117. test_common::assert_eq(D,D_after);
  118. }