Developer Documentation
Loading...
Searching...
No Matches
unittests_trimesh_split.cc
1
2#include <gtest/gtest.h>
3#include <Unittests/unittests_common.hh>
4#include <iostream>
5
6namespace {
7
8class 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 */
37TEST_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 */
115TEST_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::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
SmartVertexHandle add_vertex(const Point _p)
Definition PolyMeshT.hh:255
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
SmartVertexHandle split(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:275