Developer Documentation
unittests_eigen3_type.cc
1 
2 #ifdef ENABLE_EIGEN3_TEST
3 
4 #include <gtest/gtest.h>
5 #include <Unittests/unittests_common.hh>
6 #include <iostream>
7 
9 #include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
10 
11 #include <OpenMesh/Core/Geometry/EigenVectorT.hh>
12 
13 struct EigenTraits : OpenMesh::DefaultTraits {
14  using Point = Eigen::Vector3d;
15  using Normal = Eigen::Vector3d;
16 
17  using TexCoord2D = Eigen::Vector2d;
18 };
19 
21 
22 namespace {
23 
24 
25 class OpenMeshEigenTest : public testing::Test {
26 
27  protected:
28 
29  // This function is called before each test is run
30  virtual void SetUp() {
31 
32  // Do some initial stuff with the member data here...
33  }
34 
35  // This function is called after all tests are through
36  virtual void TearDown() {
37 
38 
39  }
40 
41  EigenTriMesh mesh_;
42 };
43 
44 TEST_F(OpenMeshEigenTest, Test_external_vectorize) {
45 
46 
47  EigenTriMesh::Normal normal;
48 
49  vectorize(normal,2);
50 
51  EXPECT_EQ(normal[0],2.0f ) << "Wrong x value";
52  EXPECT_EQ(normal[1],2.0f ) << "Wrong y value";
53  EXPECT_EQ(normal[2],2.0f ) << "Wrong z value";
54 
55 
56 }
57 
58 TEST_F(OpenMeshEigenTest, Test_external_norm) {
59 
60 
61  EigenTriMesh::Normal normal(1,0,0);
62 
63  EigenTriMesh::Scalar result = norm(normal);
64 
65  EXPECT_EQ(result,1.0f ) << "Wrong norm";
66 
67  normal = EigenTriMesh::Normal(2,0,0);
68 
69  result = norm(normal);
70 
71  EXPECT_EQ(result,2.0f ) << "Wrong norm";
72 }
73 
74 TEST_F(OpenMeshEigenTest, Test_external_sqrnorm) {
75 
76 
77  EigenTriMesh::Normal normal(1,0,0);
78 
79  EigenTriMesh::Scalar result = sqrnorm(normal);
80 
81  EXPECT_EQ(result,1.0f ) << "Wrong norm";
82 
83  normal = EigenTriMesh::Normal(2,0,0);
84 
85  result = sqrnorm(normal);
86 
87  EXPECT_EQ(result,4.0f ) << "Wrong norm";
88 }
89 
90 TEST_F(OpenMeshEigenTest, Test_external_normalize) {
91 
92 
93  EigenTriMesh::Normal normal(2,0,0);
94 
95  normalize(normal);
96 
97  EXPECT_EQ(norm(normal),1.0f ) << "Wrong norm after normalization";
98 
99  normal = EigenTriMesh::Normal(2,6,9);
100 
101  normalize(normal);
102 
103  EXPECT_EQ(norm(normal),1.0f ) << "Wrong norm after normalization";
104 
105 }
106 
107 TEST_F(OpenMeshEigenTest, Test_external_cross_Product) {
108 
109 
110  EigenTriMesh::Normal normal1(1,0,0);
111  EigenTriMesh::Normal normal2(1,1,0);
112 
113  EigenTriMesh::Normal result = cross(normal1,normal2);
114 
115  EXPECT_EQ(result[0],0.0f ) << "Wrong result x direction";
116  EXPECT_EQ(result[1],0.0f ) << "Wrong result y direction";
117  EXPECT_EQ(result[2],1.0f ) << "Wrong result z direction";
118 }
119 
120 TEST_F(OpenMeshEigenTest, Test_external_dot_Product) {
121 
122 
123  EigenTriMesh::Normal normal1(1,0,0);
124  EigenTriMesh::Normal normal2(1,1,0);
125  EigenTriMesh::Normal normal3(1,1,1);
126  EigenTriMesh::Normal normal4(2,4,6);
127 
128  EigenTriMesh::Scalar result = dot(normal1,normal2);
129  EigenTriMesh::Scalar result1 = dot(normal3,normal4);
130 
131  EXPECT_EQ(result,1.0f ) << "Wrong dot product";
132  EXPECT_EQ(result1,12.0f ) << "Wrong dot product";
133 
134 }
135 
136 
137 TEST_F(OpenMeshEigenTest, Test_Basic_setup) {
138 
139  // Add some vertices
140  EigenTriMesh::VertexHandle vhandle[4];
141 
142  vhandle[0] = mesh_.add_vertex(EigenTriMesh::Point(0, 0, 0));
143  vhandle[1] = mesh_.add_vertex(EigenTriMesh::Point(0, 1, 0));
144  vhandle[2] = mesh_.add_vertex(EigenTriMesh::Point(1, 1, 0));
145  vhandle[3] = mesh_.add_vertex(EigenTriMesh::Point(1, 0, 0));
146 
147  // Add two faces
148  std::vector<EigenTriMesh::VertexHandle> face_vhandles;
149 
150  face_vhandles.push_back(vhandle[2]);
151  face_vhandles.push_back(vhandle[1]);
152  face_vhandles.push_back(vhandle[0]);
153 
154  mesh_.add_face(face_vhandles);
155 
156  face_vhandles.clear();
157 
158  face_vhandles.push_back(vhandle[2]);
159  face_vhandles.push_back(vhandle[0]);
160  face_vhandles.push_back(vhandle[3]);
161  mesh_.add_face(face_vhandles);
162 
163 
164  EXPECT_EQ(mesh_.n_faces(),2u) << "Wrong number of faces";
165 
166 }
167 
168 TEST_F(OpenMeshEigenTest, test_normal_computation) {
169 
170  // Add some vertices
171  EigenTriMesh::VertexHandle vhandle[4];
172 
173  mesh_.request_vertex_normals();
174  mesh_.request_face_normals();
175 
176  vhandle[0] = mesh_.add_vertex(EigenTriMesh::Point(0, 0, 0));
177  vhandle[1] = mesh_.add_vertex(EigenTriMesh::Point(0, 1, 0));
178  vhandle[2] = mesh_.add_vertex(EigenTriMesh::Point(1, 1, 0));
179  vhandle[3] = mesh_.add_vertex(EigenTriMesh::Point(1, 0, 0));
180 
181  // Add two faces
182  std::vector<EigenTriMesh::VertexHandle> face_vhandles;
183 
184  face_vhandles.push_back(vhandle[2]);
185  face_vhandles.push_back(vhandle[1]);
186  face_vhandles.push_back(vhandle[0]);
187 
188  EigenTriMesh::FaceHandle face1 = mesh_.add_face(face_vhandles);
189 
190  face_vhandles.clear();
191 
192  face_vhandles.push_back(vhandle[2]);
193  face_vhandles.push_back(vhandle[0]);
194  face_vhandles.push_back(vhandle[3]);
195  EigenTriMesh::FaceHandle face2 = mesh_.add_face(face_vhandles);
196 
197  mesh_.update_face_normals();
198 
199 
200  EXPECT_EQ(mesh_.n_faces(),2u) << "Wrong number of faces";
201 
202  EigenTriMesh::Normal normal = mesh_.normal(face1);
203 
204  EXPECT_EQ(normal[0],0.0f ) << "Wrong normal x direction";
205  EXPECT_EQ(normal[1],0.0f ) << "Wrong normal y direction";
206  EXPECT_EQ(normal[2],1.0f ) << "Wrong normal z direction";
207 
208  normal = mesh_.normal(face2);
209 
210  EXPECT_EQ(normal[0],0.0f ) << "Wrong normal x direction";
211  EXPECT_EQ(normal[1],0.0f ) << "Wrong normal y direction";
212  EXPECT_EQ(normal[2],1.0f ) << "Wrong normal z direction";
213 
214 }
215 
216 /* Just load a simple mesh file in obj format and count whether
217 * the right number of entities has been loaded. Afterwards recompute
218 * normals
219 */
220 TEST_F(OpenMeshEigenTest, LoadSimpleOFFFile) {
221 
222  mesh_.clear();
223 
224  bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
225 
226  EXPECT_TRUE(ok);
227 
228  EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!";
229  EXPECT_EQ(22572u, mesh_.n_edges()) << "The number of loaded edges is not correct!";
230  EXPECT_EQ(15048u, mesh_.n_faces()) << "The number of loaded faces is not correct!";
231 
232  mesh_.update_normals();
233 }
234 
235 }
236 
237 #endif
Add 2D texture coordinates (vertices, halfedges)
Definition: Attributes.hh:87
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
Definition: MeshIO.hh:112
SmartVertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
Definition: PolyMeshT.hh:235
void update_normals()
Compute normals for all primitives.
void update_face_normals()
Update normal vectors for all faces.