Developer Documentation
unittests_trimesh_split.cc
1 
2 #include <gtest/gtest.h>
3 #include <Unittests/unittests_common.hh>
4 #include <iostream>
5 
6 namespace {
7 
8 class OpenMeshSplitTriangleMesh : public OpenMeshBase {
9 
10  protected:
11 
12  // This function is called before each test is run
13  virtual void SetUp() {
14 
15  // Do some initial stuff with the member data here...
16  }
17 
18  // This function is called after all tests are through
19  virtual void TearDown() {
20 
21  // Do some final stuff with the member data here...
22  }
23 
24  // Member already defined in OpenMeshBase
25  //Mesh mesh_;
26 };
27 
28 /*
29  * ====================================================================
30  * Define tests below
31  * ====================================================================
32  */
33 
34 /* splits a face that has a property in a triangle mesh with split_copy
35  * the property should be copied to the new faces
36  */
37 TEST_F(OpenMeshSplitTriangleMesh, Split_Triangle_Mesh_1_4_center) {
38 
39  mesh_.clear();
40 
41  mesh_.request_vertex_status();
42  mesh_.request_edge_status();
43  mesh_.request_face_status();
44 
45  // Add some vertices
46  Mesh::VertexHandle vhandle[6];
47 
48  vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
49  vhandle[1] = mesh_.add_vertex(Mesh::Point(1, 0, 0));
50  vhandle[2] = mesh_.add_vertex(Mesh::Point(2, 1, 0));
51  vhandle[3] = mesh_.add_vertex(Mesh::Point(3, 0, 0));
52  vhandle[4] = mesh_.add_vertex(Mesh::Point(4, 1, 0));
53  vhandle[5] = mesh_.add_vertex(Mesh::Point(2,-1, 0));
54 
55  // Add three faces
56  std::vector<Mesh::VertexHandle> face_vhandles;
57 
58  face_vhandles.push_back(vhandle[0]);
59  face_vhandles.push_back(vhandle[1]);
60  face_vhandles.push_back(vhandle[2]);
61  mesh_.add_face(face_vhandles);
62 
63  face_vhandles.clear();
64 
65  face_vhandles.push_back(vhandle[2]);
66  face_vhandles.push_back(vhandle[1]);
67  face_vhandles.push_back(vhandle[3]);
68  Mesh::FaceHandle to_split = mesh_.add_face(face_vhandles);
69 
70  face_vhandles.clear();
71 
72  face_vhandles.push_back(vhandle[2]);
73  face_vhandles.push_back(vhandle[3]);
74  face_vhandles.push_back(vhandle[4]);
75  mesh_.add_face(face_vhandles);
76 
77  face_vhandles.clear();
78 
79  face_vhandles.push_back(vhandle[1]);
80  face_vhandles.push_back(vhandle[5]);
81  face_vhandles.push_back(vhandle[3]);
82  mesh_.add_face(face_vhandles);
83 
84  /* Test setup:
85  *
86  * edge x => halfedge x/x+1
87  * i.e. edge 0 => halfedge 0/1
88  *
89  * 0 --4--- 2 ------ 4
90  * \ / \ /
91  * 0 0 2 6 2 /
92  * \ / 1 \ /
93  * 1 ---8--- 3
94  * \ /
95  * \ 3 /
96  * \ /
97  * \ /
98  * 5
99  */
100 
101  EXPECT_EQ(4u, mesh_.n_faces());
102 
103  // split face in center (non-boundary case)
104  mesh_.split(to_split);
105 
106  mesh_.garbage_collection();
107 
108  EXPECT_EQ(10u, mesh_.n_faces());
109 
110 }
111 
112 /* splits a face that has a property in a triangle mesh with split_copy
113  * the property should be copied to the new faces
114  */
115 TEST_F(OpenMeshSplitTriangleMesh, Split_Triangle_Mesh_1_4_boundary) {
116 
117  mesh_.clear();
118 
119  mesh_.request_vertex_status();
120  mesh_.request_edge_status();
121  mesh_.request_face_status();
122 
123  // Add some vertices
124  Mesh::VertexHandle vhandle[6];
125 
126  vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
127  vhandle[1] = mesh_.add_vertex(Mesh::Point(1, 0, 0));
128  vhandle[2] = mesh_.add_vertex(Mesh::Point(2, 1, 0));
129  vhandle[3] = mesh_.add_vertex(Mesh::Point(3, 0, 0));
130  vhandle[4] = mesh_.add_vertex(Mesh::Point(4, 1, 0));
131  vhandle[5] = mesh_.add_vertex(Mesh::Point(2,-1, 0));
132 
133  // Add three faces
134  std::vector<Mesh::VertexHandle> face_vhandles;
135 
136  face_vhandles.push_back(vhandle[0]);
137  face_vhandles.push_back(vhandle[1]);
138  face_vhandles.push_back(vhandle[2]);
139  Mesh::FaceHandle to_split = mesh_.add_face(face_vhandles);
140 
141  face_vhandles.clear();
142 
143  face_vhandles.push_back(vhandle[2]);
144  face_vhandles.push_back(vhandle[1]);
145  face_vhandles.push_back(vhandle[3]);
146  mesh_.add_face(face_vhandles);
147 
148  face_vhandles.clear();
149 
150  face_vhandles.push_back(vhandle[2]);
151  face_vhandles.push_back(vhandle[3]);
152  face_vhandles.push_back(vhandle[4]);
153  mesh_.add_face(face_vhandles);
154 
155  face_vhandles.clear();
156 
157  face_vhandles.push_back(vhandle[1]);
158  face_vhandles.push_back(vhandle[5]);
159  face_vhandles.push_back(vhandle[3]);
160  mesh_.add_face(face_vhandles);
161 
162  /* Test setup:
163  *
164  * edge x => halfedge x/x+1
165  * i.e. edge 0 => halfedge 0/1
166  *
167  * 0 --4--- 2 ------ 4
168  * \ / \ /
169  * 0 0 2 6 2 /
170  * \ / 1 \ /
171  * 1 ---8--- 3
172  * \ /
173  * \ 3 /
174  * \ /
175  * \ /
176  * 5
177  */
178 
179  EXPECT_EQ(4u, mesh_.n_faces());
180 
181  // split face at boundary
182  mesh_.split(to_split);
183 
184  mesh_.garbage_collection();
185 
186  EXPECT_EQ(8u, mesh_.n_faces());
187 
188 }
189 
190 
191 }
192 
193 
194 
Kernel::Point Point
Coordinate type.
Definition: PolyMeshT.hh:112
SmartVertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
Definition: PolyMeshT.hh:235
SmartVertexHandle split(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition: TriMeshT.hh:267
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition: PolyMeshT.hh:136