2 #include <gtest/gtest.h> 3 #include <Unittests/unittests_common.hh> 8 #include <OpenMesh/Tools/Subdivider/Uniform/MidpointT.hh> 15 virtual void SetUp() {
20 virtual void TearDown() {
28 class OpenMeshSubdividerUniform_Triangle :
public OpenMeshBase {
31 virtual void SetUp() {
36 virtual void TearDown() {
50 TEST_F(OpenMeshSubdividerUniform_Triangle, Subdivider_Sqrt3) {
67 std::vector<Mesh::VertexHandle> face_vhandles;
69 face_vhandles.push_back(vhandle[0]);
70 face_vhandles.push_back(vhandle[4]);
71 face_vhandles.push_back(vhandle[3]);
73 mesh_.add_face(face_vhandles);
74 face_vhandles.clear();
76 face_vhandles.push_back(vhandle[0]);
77 face_vhandles.push_back(vhandle[1]);
78 face_vhandles.push_back(vhandle[4]);
80 mesh_.add_face(face_vhandles);
81 face_vhandles.clear();
83 face_vhandles.push_back(vhandle[1]);
84 face_vhandles.push_back(vhandle[2]);
85 face_vhandles.push_back(vhandle[4]);
87 mesh_.add_face(face_vhandles);
88 face_vhandles.clear();
90 face_vhandles.push_back(vhandle[2]);
91 face_vhandles.push_back(vhandle[5]);
92 face_vhandles.push_back(vhandle[4]);
94 mesh_.add_face(face_vhandles);
95 face_vhandles.clear();
97 face_vhandles.push_back(vhandle[3]);
98 face_vhandles.push_back(vhandle[7]);
99 face_vhandles.push_back(vhandle[6]);
101 mesh_.add_face(face_vhandles);
102 face_vhandles.clear();
104 face_vhandles.push_back(vhandle[3]);
105 face_vhandles.push_back(vhandle[4]);
106 face_vhandles.push_back(vhandle[7]);
108 mesh_.add_face(face_vhandles);
109 face_vhandles.clear();
111 face_vhandles.push_back(vhandle[4]);
112 face_vhandles.push_back(vhandle[8]);
113 face_vhandles.push_back(vhandle[7]);
115 mesh_.add_face(face_vhandles);
116 face_vhandles.clear();
118 face_vhandles.push_back(vhandle[4]);
119 face_vhandles.push_back(vhandle[5]);
120 face_vhandles.push_back(vhandle[8]);
122 mesh_.add_face(face_vhandles);
139 EXPECT_EQ(9u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
140 EXPECT_EQ(8u, mesh_.n_faces() ) <<
"Wrong number of faces";
148 EXPECT_EQ(121u, mesh_.n_vertices() ) <<
"Wrong number of vertices after subdivision with sqrt3";
149 EXPECT_EQ(216u, mesh_.n_faces() ) <<
"Wrong number of faces after subdivision with sqrt3";
153 TEST_F(OpenMeshSubdividerUniform_Triangle, Subdivider_Loop) {
170 std::vector<Mesh::VertexHandle> face_vhandles;
172 face_vhandles.push_back(vhandle[0]);
173 face_vhandles.push_back(vhandle[4]);
174 face_vhandles.push_back(vhandle[3]);
176 mesh_.add_face(face_vhandles);
177 face_vhandles.clear();
179 face_vhandles.push_back(vhandle[0]);
180 face_vhandles.push_back(vhandle[1]);
181 face_vhandles.push_back(vhandle[4]);
183 mesh_.add_face(face_vhandles);
184 face_vhandles.clear();
186 face_vhandles.push_back(vhandle[1]);
187 face_vhandles.push_back(vhandle[2]);
188 face_vhandles.push_back(vhandle[4]);
190 mesh_.add_face(face_vhandles);
191 face_vhandles.clear();
193 face_vhandles.push_back(vhandle[2]);
194 face_vhandles.push_back(vhandle[5]);
195 face_vhandles.push_back(vhandle[4]);
197 mesh_.add_face(face_vhandles);
198 face_vhandles.clear();
200 face_vhandles.push_back(vhandle[3]);
201 face_vhandles.push_back(vhandle[7]);
202 face_vhandles.push_back(vhandle[6]);
204 mesh_.add_face(face_vhandles);
205 face_vhandles.clear();
207 face_vhandles.push_back(vhandle[3]);
208 face_vhandles.push_back(vhandle[4]);
209 face_vhandles.push_back(vhandle[7]);
211 mesh_.add_face(face_vhandles);
212 face_vhandles.clear();
214 face_vhandles.push_back(vhandle[4]);
215 face_vhandles.push_back(vhandle[8]);
216 face_vhandles.push_back(vhandle[7]);
218 mesh_.add_face(face_vhandles);
219 face_vhandles.clear();
221 face_vhandles.push_back(vhandle[4]);
222 face_vhandles.push_back(vhandle[5]);
223 face_vhandles.push_back(vhandle[8]);
225 mesh_.add_face(face_vhandles);
242 EXPECT_EQ(9u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
243 EXPECT_EQ(8u, mesh_.n_faces() ) <<
"Wrong number of faces";
251 EXPECT_EQ(289u, mesh_.n_vertices() ) <<
"Wrong number of vertices after subdivision with loop";
252 EXPECT_EQ(512u, mesh_.n_faces() ) <<
"Wrong number of faces after subdivision with loop";
257 TEST_F(OpenMeshSubdividerUniform_Triangle, Subdivider_Loop_delete_vertex) {
261 mesh_.request_vertex_status();
262 mesh_.request_halfedge_status();
263 mesh_.request_edge_status();
264 mesh_.request_face_status();
280 std::vector<Mesh::VertexHandle> face_vhandles;
282 face_vhandles.push_back(vhandle[0]);
283 face_vhandles.push_back(vhandle[4]);
284 face_vhandles.push_back(vhandle[3]);
286 mesh_.add_face(face_vhandles);
287 face_vhandles.clear();
289 face_vhandles.push_back(vhandle[0]);
290 face_vhandles.push_back(vhandle[1]);
291 face_vhandles.push_back(vhandle[4]);
293 mesh_.add_face(face_vhandles);
294 face_vhandles.clear();
296 face_vhandles.push_back(vhandle[1]);
297 face_vhandles.push_back(vhandle[2]);
298 face_vhandles.push_back(vhandle[4]);
300 mesh_.add_face(face_vhandles);
301 face_vhandles.clear();
303 face_vhandles.push_back(vhandle[2]);
304 face_vhandles.push_back(vhandle[5]);
305 face_vhandles.push_back(vhandle[4]);
307 mesh_.add_face(face_vhandles);
308 face_vhandles.clear();
310 face_vhandles.push_back(vhandle[3]);
311 face_vhandles.push_back(vhandle[7]);
312 face_vhandles.push_back(vhandle[6]);
314 mesh_.add_face(face_vhandles);
315 face_vhandles.clear();
317 face_vhandles.push_back(vhandle[3]);
318 face_vhandles.push_back(vhandle[4]);
319 face_vhandles.push_back(vhandle[7]);
321 mesh_.add_face(face_vhandles);
322 face_vhandles.clear();
324 face_vhandles.push_back(vhandle[4]);
325 face_vhandles.push_back(vhandle[8]);
326 face_vhandles.push_back(vhandle[7]);
328 mesh_.add_face(face_vhandles);
329 face_vhandles.clear();
331 face_vhandles.push_back(vhandle[4]);
332 face_vhandles.push_back(vhandle[5]);
333 face_vhandles.push_back(vhandle[8]);
335 mesh_.add_face(face_vhandles);
350 mesh_.delete_vertex(vhandle[1]);
351 mesh_.garbage_collection();
357 EXPECT_EQ(8u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
358 EXPECT_EQ(6u, mesh_.n_faces() ) <<
"Wrong number of faces";
366 EXPECT_EQ(225u, mesh_.n_vertices() ) <<
"Wrong number of vertices after subdivision with loop";
367 EXPECT_EQ(384u, mesh_.n_faces() ) <<
"Wrong number of faces after subdivision with loop";
380 TEST_F(OpenMeshSubdividerUniform_Poly, Subdivider_CatmullClark) {
397 std::vector<Mesh::VertexHandle> face_vhandles;
399 face_vhandles.push_back(vhandle[0]);
400 face_vhandles.push_back(vhandle[1]);
401 face_vhandles.push_back(vhandle[4]);
402 face_vhandles.push_back(vhandle[3]);
404 mesh_.add_face(face_vhandles);
405 face_vhandles.clear();
407 face_vhandles.push_back(vhandle[1]);
408 face_vhandles.push_back(vhandle[2]);
409 face_vhandles.push_back(vhandle[5]);
410 face_vhandles.push_back(vhandle[4]);
412 mesh_.add_face(face_vhandles);
413 face_vhandles.clear();
415 face_vhandles.push_back(vhandle[4]);
416 face_vhandles.push_back(vhandle[5]);
417 face_vhandles.push_back(vhandle[8]);
418 face_vhandles.push_back(vhandle[7]);
420 mesh_.add_face(face_vhandles);
421 face_vhandles.clear();
423 face_vhandles.push_back(vhandle[3]);
424 face_vhandles.push_back(vhandle[4]);
425 face_vhandles.push_back(vhandle[7]);
426 face_vhandles.push_back(vhandle[6]);
428 mesh_.add_face(face_vhandles);
445 EXPECT_EQ(9u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
446 EXPECT_EQ(4u, mesh_.n_faces() ) <<
"Wrong number of faces";
453 EXPECT_EQ(289u, mesh_.n_vertices() ) <<
"Wrong number of vertices after subdivision with catmull clark";
454 EXPECT_EQ(256u, mesh_.n_faces() ) <<
"Wrong number of faces after subdivision with catmull clark";
459 TEST_F(OpenMeshSubdividerUniform_Poly, Midpoint) {
474 std::vector<Mesh::VertexHandle> face_vhandles;
476 face_vhandles.clear();
477 face_vhandles.push_back(vhandle[0]);
478 face_vhandles.push_back(vhandle[1]);
479 face_vhandles.push_back(vhandle[2]);
480 face_vhandles.push_back(vhandle[3]);
481 mesh_.add_face(face_vhandles);
483 face_vhandles.clear();
484 face_vhandles.push_back(vhandle[7]);
485 face_vhandles.push_back(vhandle[6]);
486 face_vhandles.push_back(vhandle[5]);
487 face_vhandles.push_back(vhandle[4]);
488 mesh_.add_face(face_vhandles);
490 face_vhandles.clear();
491 face_vhandles.push_back(vhandle[1]);
492 face_vhandles.push_back(vhandle[0]);
493 face_vhandles.push_back(vhandle[4]);
494 face_vhandles.push_back(vhandle[5]);
495 mesh_.add_face(face_vhandles);
497 face_vhandles.clear();
498 face_vhandles.push_back(vhandle[2]);
499 face_vhandles.push_back(vhandle[1]);
500 face_vhandles.push_back(vhandle[5]);
501 face_vhandles.push_back(vhandle[6]);
502 mesh_.add_face(face_vhandles);
504 face_vhandles.clear();
505 face_vhandles.push_back(vhandle[3]);
506 face_vhandles.push_back(vhandle[2]);
507 face_vhandles.push_back(vhandle[6]);
508 face_vhandles.push_back(vhandle[7]);
509 mesh_.add_face(face_vhandles);
511 face_vhandles.clear();
512 face_vhandles.push_back(vhandle[0]);
513 face_vhandles.push_back(vhandle[3]);
514 face_vhandles.push_back(vhandle[7]);
515 face_vhandles.push_back(vhandle[4]);
516 mesh_.add_face(face_vhandles);
534 EXPECT_EQ(12u, mesh_.n_edges()) <<
"Wrong number of Edges";
535 EXPECT_EQ(24u, mesh_.n_halfedges()) <<
"Wrong number of HalfEdges";
536 EXPECT_EQ(8u, mesh_.n_vertices()) <<
"Wrong number of vertices";
537 EXPECT_EQ(6u, mesh_.n_faces()) <<
"Wrong number of faces";
548 EXPECT_EQ(48u, mesh_.n_edges()) <<
"Wrong number of Edges";
549 EXPECT_EQ(96u, mesh_.n_halfedges()) <<
"Wrong number of HalfEdges";
550 EXPECT_EQ(24u, mesh_.n_vertices()) <<
"Wrong number of vertices";
551 EXPECT_EQ(26u, mesh_.n_faces()) <<
"Wrong number of faces";
556 TEST_F(OpenMeshSubdividerUniform_Triangle, Modified_Butterfly) {
573 std::vector<Mesh::VertexHandle> face_vhandles;
575 face_vhandles.push_back(vhandle[0]);
576 face_vhandles.push_back(vhandle[4]);
577 face_vhandles.push_back(vhandle[3]);
579 mesh_.add_face(face_vhandles);
580 face_vhandles.clear();
582 face_vhandles.push_back(vhandle[0]);
583 face_vhandles.push_back(vhandle[1]);
584 face_vhandles.push_back(vhandle[4]);
586 mesh_.add_face(face_vhandles);
587 face_vhandles.clear();
589 face_vhandles.push_back(vhandle[1]);
590 face_vhandles.push_back(vhandle[2]);
591 face_vhandles.push_back(vhandle[4]);
593 mesh_.add_face(face_vhandles);
594 face_vhandles.clear();
596 face_vhandles.push_back(vhandle[2]);
597 face_vhandles.push_back(vhandle[5]);
598 face_vhandles.push_back(vhandle[4]);
600 mesh_.add_face(face_vhandles);
601 face_vhandles.clear();
603 face_vhandles.push_back(vhandle[3]);
604 face_vhandles.push_back(vhandle[7]);
605 face_vhandles.push_back(vhandle[6]);
607 mesh_.add_face(face_vhandles);
608 face_vhandles.clear();
610 face_vhandles.push_back(vhandle[3]);
611 face_vhandles.push_back(vhandle[4]);
612 face_vhandles.push_back(vhandle[7]);
614 mesh_.add_face(face_vhandles);
615 face_vhandles.clear();
617 face_vhandles.push_back(vhandle[4]);
618 face_vhandles.push_back(vhandle[8]);
619 face_vhandles.push_back(vhandle[7]);
621 mesh_.add_face(face_vhandles);
622 face_vhandles.clear();
624 face_vhandles.push_back(vhandle[4]);
625 face_vhandles.push_back(vhandle[5]);
626 face_vhandles.push_back(vhandle[8]);
628 mesh_.add_face(face_vhandles);
645 EXPECT_EQ(9u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
646 EXPECT_EQ(8u, mesh_.n_faces() ) <<
"Wrong number of faces";
654 EXPECT_EQ(289u, mesh_.n_vertices() ) <<
"Wrong number of vertices after subdivision with loop";
655 EXPECT_EQ(512u, mesh_.n_faces() ) <<
"Wrong number of faces after subdivision with loop";
660 TEST_F(OpenMeshSubdividerUniform_Triangle, Modified_Butterfly_delete_vertex) {
664 mesh_.request_vertex_status();
665 mesh_.request_halfedge_status();
666 mesh_.request_edge_status();
667 mesh_.request_face_status();
683 std::vector<Mesh::VertexHandle> face_vhandles;
685 face_vhandles.push_back(vhandle[0]);
686 face_vhandles.push_back(vhandle[4]);
687 face_vhandles.push_back(vhandle[3]);
689 mesh_.add_face(face_vhandles);
690 face_vhandles.clear();
692 face_vhandles.push_back(vhandle[0]);
693 face_vhandles.push_back(vhandle[1]);
694 face_vhandles.push_back(vhandle[4]);
696 mesh_.add_face(face_vhandles);
697 face_vhandles.clear();
699 face_vhandles.push_back(vhandle[1]);
700 face_vhandles.push_back(vhandle[2]);
701 face_vhandles.push_back(vhandle[4]);
703 mesh_.add_face(face_vhandles);
704 face_vhandles.clear();
706 face_vhandles.push_back(vhandle[2]);
707 face_vhandles.push_back(vhandle[5]);
708 face_vhandles.push_back(vhandle[4]);
710 mesh_.add_face(face_vhandles);
711 face_vhandles.clear();
713 face_vhandles.push_back(vhandle[3]);
714 face_vhandles.push_back(vhandle[7]);
715 face_vhandles.push_back(vhandle[6]);
717 mesh_.add_face(face_vhandles);
718 face_vhandles.clear();
720 face_vhandles.push_back(vhandle[3]);
721 face_vhandles.push_back(vhandle[4]);
722 face_vhandles.push_back(vhandle[7]);
724 mesh_.add_face(face_vhandles);
725 face_vhandles.clear();
727 face_vhandles.push_back(vhandle[4]);
728 face_vhandles.push_back(vhandle[8]);
729 face_vhandles.push_back(vhandle[7]);
731 mesh_.add_face(face_vhandles);
732 face_vhandles.clear();
734 face_vhandles.push_back(vhandle[4]);
735 face_vhandles.push_back(vhandle[5]);
736 face_vhandles.push_back(vhandle[8]);
738 mesh_.add_face(face_vhandles);
753 mesh_.delete_vertex(vhandle[1]);
754 mesh_.garbage_collection();
760 EXPECT_EQ(8u, mesh_.n_vertices() ) <<
"Wrong number of vertices";
761 EXPECT_EQ(6u, mesh_.n_faces() ) <<
"Wrong number of faces";
769 EXPECT_EQ(225u, mesh_.n_vertices() ) <<
"Wrong number of vertices after subdivision with butter";
770 EXPECT_EQ(384u, mesh_.n_faces() ) <<
"Wrong number of faces after subdivision with butter";
Kernel::Point Point
Coordinate type.
SmartVertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.