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