Developer Documentation
Loading...
Searching...
No Matches
unittests_decimater.cc
1
2#include <gtest/gtest.h>
3#include <Unittests/unittests_common.hh>
7
8namespace {
9
10class OpenMeshDecimater : public OpenMeshBase {
11
12 protected:
13
14 // This function is called before each test is run
15 virtual void SetUp() {
16
17 // Do some initial stuff with the member data here...
18 }
19
20 // This function is called after all tests are through
21 virtual void TearDown() {
22
23 // Do some final stuff with the member data here...
24 }
25
26 // Member already defined in OpenMeshBase
27 //Mesh mesh_;
28};
29
30/*
31 * ====================================================================
32 * Define tests below
33 * ====================================================================
34 */
35
36/*
37 */
38TEST_F(OpenMeshDecimater, DecimateMesh) {
39
40 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
41
42 ASSERT_TRUE(ok);
43
46
47 Decimater decimaterDBG(mesh_);
48 HModQuadric hModQuadricDBG;
49 decimaterDBG.add( hModQuadricDBG );
50 decimaterDBG.initialize();
51 size_t removedVertices = 0;
52 removedVertices = decimaterDBG.decimate_to(5000);
53 decimaterDBG.mesh().garbage_collection();
54
55 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
56 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
57 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
58 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
59}
60
61TEST_F(OpenMeshDecimater, DecimateMeshToFaceVerticesLimit) {
62
63 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
64
65 ASSERT_TRUE(ok);
66
69
70 Decimater decimaterDBG(mesh_);
71 HModQuadric hModQuadricDBG;
72 decimaterDBG.add( hModQuadricDBG );
73 decimaterDBG.initialize();
74 size_t removedVertices = 0;
75 removedVertices = decimaterDBG.decimate_to_faces(5000, 8000);
76 decimaterDBG.mesh().garbage_collection();
77
78 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
79 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
80 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
81 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
82}
83
84TEST_F(OpenMeshDecimater, DecimateMeshToFaceFaceLimit) {
85
86 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
87
88 ASSERT_TRUE(ok);
89
92
93 Decimater decimaterDBG(mesh_);
94 HModQuadric hModQuadricDBG;
95 decimaterDBG.add( hModQuadricDBG );
96 decimaterDBG.initialize();
97 size_t removedVertices = 0;
98 removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
99 decimaterDBG.mesh().garbage_collection();
100
101 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
102 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
103 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
104 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
105}
106
107
108TEST_F(OpenMeshDecimater, DecimateMeshToVertexLimitWithLowNormalDeviation) {
109
110 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
111
112 ASSERT_TRUE(ok);
113
117
118 Decimater decimaterDBG(mesh_);
119 HModQuadric hModQuadricDBG;
120 decimaterDBG.add( hModQuadricDBG );
121 HModNormalDeviation hModNormalDeviation;
122 decimaterDBG.add( hModNormalDeviation );
123 decimaterDBG.module(hModNormalDeviation).set_normal_deviation(15.0);
124 decimaterDBG.initialize();
125 size_t removedVertices = 0;
126 removedVertices = decimaterDBG.decimate_to(8);
127 decimaterDBG.mesh().garbage_collection();
128
129 EXPECT_EQ(6998u, removedVertices) << "The number of remove vertices is not correct!";
130 EXPECT_EQ( 528u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
131 EXPECT_EQ(1578u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
132 EXPECT_EQ(1052u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
133}
134
135TEST_F(OpenMeshDecimater, DecimateMeshExampleFromDoc) {
136
137 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
138
139 ASSERT_TRUE(ok);
140
143
144 Decimater decimaterDBG(mesh_);
145 HModQuadric hModQuadricDBG;
146 decimaterDBG.add( hModQuadricDBG );
147
148 decimaterDBG.module( hModQuadricDBG ).unset_max_err();
149
150 decimaterDBG.initialize();
151 size_t removedVertices = 0;
152 removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
153 decimaterDBG.mesh().garbage_collection();
154
155 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
156 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
157 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
158 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
159}
160
161class UnittestObserver : public OpenMesh::Decimater::Observer
162{
163 size_t notifies_;
164 size_t all_steps_;
165public:
166 explicit UnittestObserver(size_t _steps) :Observer(_steps), notifies_(0), all_steps_(0) {}
167
168 void notify(size_t _step)
169 {
170 ++notifies_;
171 all_steps_ = _step;
172 }
173 bool abort() const
174 {
175 return all_steps_ >= 2526u;
176 }
177
178 size_t countedNotifies()
179 {
180 return notifies_;
181 }
182};
183
184TEST_F(OpenMeshDecimater, DecimateMeshStoppedByObserver) {
185
186 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
187
188 ASSERT_TRUE(ok);
189
192
193 Decimater decimaterDBG(mesh_);
194 HModQuadric hModQuadricDBG;
195 decimaterDBG.add(hModQuadricDBG);
196
197 decimaterDBG.module(hModQuadricDBG).unset_max_err();
198
199 decimaterDBG.initialize();
200 UnittestObserver obs(2);
201 decimaterDBG.set_observer(&obs);
202 size_t removedVertices = 0;
203 removedVertices = decimaterDBG.decimate_to_faces(0, 0);
204 decimaterDBG.mesh().garbage_collection();
205
206 EXPECT_TRUE(obs.abort()) << "Observer did not abort the decimater!";
207 EXPECT_EQ(obs.countedNotifies(), 2526u / 2u) << "Observer did not get the right amount of notifications!";
208
209 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
210 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
211 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
212 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
213}
214
215
216}
Use Normal deviation to control decimation.
Mesh decimation module computing collapse priority based on error quadrics.
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
Definition MeshIO.hh:95