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