1 #include <gtest/gtest.h> 2 #include <Unittests/unittests_common.hh> 4 #include <OpenMesh/Core/Mesh/SmartHandles.hh> 5 #include <OpenMesh/Core/Utils/PropertyManager.hh> 17 virtual void SetUp() {
33 std::vector<Mesh::VertexHandle> face_vhandles;
35 face_vhandles.clear();
36 face_vhandles.push_back(vhandle[0]);
37 face_vhandles.push_back(vhandle[1]);
38 face_vhandles.push_back(vhandle[3]);
39 mesh_.add_face(face_vhandles);
41 face_vhandles.clear();
42 face_vhandles.push_back(vhandle[1]);
43 face_vhandles.push_back(vhandle[2]);
44 face_vhandles.push_back(vhandle[3]);
45 mesh_.add_face(face_vhandles);
49 face_vhandles.clear();
50 face_vhandles.push_back(vhandle[7]);
51 face_vhandles.push_back(vhandle[6]);
52 face_vhandles.push_back(vhandle[5]);
53 mesh_.add_face(face_vhandles);
55 face_vhandles.clear();
56 face_vhandles.push_back(vhandle[7]);
57 face_vhandles.push_back(vhandle[5]);
58 face_vhandles.push_back(vhandle[4]);
59 mesh_.add_face(face_vhandles);
63 face_vhandles.clear();
64 face_vhandles.push_back(vhandle[1]);
65 face_vhandles.push_back(vhandle[0]);
66 face_vhandles.push_back(vhandle[4]);
67 mesh_.add_face(face_vhandles);
69 face_vhandles.clear();
70 face_vhandles.push_back(vhandle[1]);
71 face_vhandles.push_back(vhandle[4]);
72 face_vhandles.push_back(vhandle[5]);
73 mesh_.add_face(face_vhandles);
77 face_vhandles.clear();
78 face_vhandles.push_back(vhandle[2]);
79 face_vhandles.push_back(vhandle[1]);
80 face_vhandles.push_back(vhandle[5]);
81 mesh_.add_face(face_vhandles);
83 face_vhandles.clear();
84 face_vhandles.push_back(vhandle[2]);
85 face_vhandles.push_back(vhandle[5]);
86 face_vhandles.push_back(vhandle[6]);
87 mesh_.add_face(face_vhandles);
92 face_vhandles.clear();
93 face_vhandles.push_back(vhandle[3]);
94 face_vhandles.push_back(vhandle[2]);
95 face_vhandles.push_back(vhandle[6]);
96 mesh_.add_face(face_vhandles);
98 face_vhandles.clear();
99 face_vhandles.push_back(vhandle[3]);
100 face_vhandles.push_back(vhandle[6]);
101 face_vhandles.push_back(vhandle[7]);
102 mesh_.add_face(face_vhandles);
106 face_vhandles.clear();
107 face_vhandles.push_back(vhandle[0]);
108 face_vhandles.push_back(vhandle[3]);
109 face_vhandles.push_back(vhandle[7]);
110 mesh_.add_face(face_vhandles);
112 face_vhandles.clear();
113 face_vhandles.push_back(vhandle[0]);
114 face_vhandles.push_back(vhandle[7]);
115 face_vhandles.push_back(vhandle[4]);
116 mesh_.add_face(face_vhandles);
134 EXPECT_EQ(18u, mesh_.n_edges() ) <<
"Wrong number of Edges";
135 EXPECT_EQ(36u, mesh_.n_halfedges() ) <<
"Wrong number of HalfEdges";
136 EXPECT_EQ(8u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
137 EXPECT_EQ(12u, mesh_.n_faces() ) <<
"Wrong number of faces";
141 virtual void TearDown() {
159 template <
typename HandleT>
162 int operator()(HandleT ) {
return 1; }
167 TEST_F(OpenMeshSmartRanges, Sum)
170 EXPECT_EQ(mesh_.vertices().sum(one), mesh_.n_vertices());
171 EXPECT_EQ(mesh_.vertices().sum(F<OpenMesh::VertexHandle>()), mesh_.n_vertices());
172 EXPECT_EQ(mesh_.halfedges().sum(F<OpenMesh::HalfedgeHandle>()), mesh_.n_halfedges());
173 EXPECT_EQ(mesh_.edges().sum(F<OpenMesh::EdgeHandle>()), mesh_.n_edges());
174 EXPECT_EQ(mesh_.faces().sum(F<OpenMesh::FaceHandle>()), mesh_.n_faces());
176 for (
auto vh : mesh_.vertices())
177 EXPECT_EQ(vh.vertices().sum(F<OpenMesh::VertexHandle>()), mesh_.valence(vh));
178 for (
auto vh : mesh_.vertices())
179 EXPECT_EQ(vh.faces().sum(F<OpenMesh::FaceHandle>()), mesh_.valence(vh));
180 for (
auto vh : mesh_.vertices())
181 EXPECT_EQ(vh.outgoing_halfedges().sum(F<OpenMesh::HalfedgeHandle>()), mesh_.valence(vh));
182 for (
auto vh : mesh_.vertices())
183 EXPECT_EQ(vh.incoming_halfedges().sum(F<OpenMesh::HalfedgeHandle>()), mesh_.valence(vh));
185 for (
auto fh : mesh_.faces())
186 EXPECT_EQ(fh.vertices().sum(F<OpenMesh::VertexHandle>()), mesh_.valence(fh));
187 for (
auto fh : mesh_.faces())
188 EXPECT_EQ(fh.halfedges().sum(F<OpenMesh::HalfedgeHandle>()), mesh_.valence(fh));
189 for (
auto fh : mesh_.faces())
190 EXPECT_EQ(fh.edges().sum(F<OpenMesh::EdgeHandle>()), mesh_.valence(fh));
191 for (
auto fh : mesh_.faces())
192 EXPECT_EQ(fh.faces().sum(F<OpenMesh::FaceHandle>()), 3);
198 TEST_F(OpenMeshSmartRanges, PropertyManagerAsFunctor)
200 auto myPos = OpenMesh::makeTemporaryProperty<OpenMesh::VertexHandle, Mesh::Point>(mesh_);
201 for (
auto vh : mesh_.vertices())
202 myPos(vh) = mesh_.point(vh);
205 for (
auto vh : mesh_.vertices())
206 cog += mesh_.point(vh);
207 cog /= mesh_.n_vertices();
209 auto cog2 = mesh_.vertices().avg(myPos);
211 EXPECT_LT(norm(cog - cog2), 0.00001) <<
"Computed center of gravities are significantly different.";
216 TEST_F(OpenMeshSmartRanges, ToVector)
218 auto uvs = OpenMesh::makeTemporaryProperty<OpenMesh::HalfedgeHandle, OpenMesh::Vec2d>(mesh_);
220 for (
auto heh : mesh_.halfedges())
223 for (
auto fh : mesh_.faces())
225 auto tri_uvs = fh.halfedges().to_vector(uvs);
226 auto heh_handles = fh.halfedges().to_vector();
227 for (
auto heh : heh_handles)
231 auto vertex_vec = mesh_.vertices().to_vector();
232 for (
auto vh : vertex_vec)
238 TEST_F(OpenMeshSmartRanges, ToArray)
240 auto uvs = OpenMesh::makeTemporaryProperty<OpenMesh::HalfedgeHandle, OpenMesh::Vec2d>(mesh_);
242 for (
auto heh : mesh_.halfedges())
245 for (
auto fh : mesh_.faces())
247 fh.halfedges().to_array<3>(uvs);
248 fh.halfedges().to_array<3>();
255 TEST_F(OpenMeshSmartRanges, BoundingBox)
259 auto myPos = OpenMesh::makeTemporaryProperty<OpenMesh::VertexHandle, OpenMesh::Vec3f>(mesh_);
260 for (
auto vh : mesh_.vertices())
261 for (
size_t i = 0; i < 3; ++i)
262 myPos(vh)[i] = mesh_.point(vh)[i];
264 auto bb_min = mesh_.vertices().min(myPos);
265 auto bb_max = mesh_.vertices().max(myPos);
266 mesh_.vertices().minmax(myPos);
268 EXPECT_LT(norm(bb_min -
OpenMesh::Vec3f(-1,-1,-1)), 0.000001) <<
"Bounding box minimum seems off";
269 EXPECT_LT(norm(bb_max -
OpenMesh::Vec3f( 1, 1, 1)), 0.000001) <<
"Bounding box maximum seems off";
272 auto uvs = OpenMesh::makeTemporaryProperty<OpenMesh::HalfedgeHandle, OpenMesh::Vec2d>(mesh_);
273 for (
auto heh : mesh_.halfedges())
276 for (
auto fh : mesh_.faces())
278 fh.halfedges().min(uvs);
279 fh.halfedges().max(uvs);
VectorT< double, 2 > Vec2d
Kernel::Point Point
Coordinate type.
Handle for a vertex entity.
SmartVertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.