1#include "unittests_common.hh"
3#include <OpenVolumeMesh/Attribs/StatusAttrib.hh>
4#include <OpenVolumeMesh/Attribs/NormalAttrib.hh>
5#include <OpenVolumeMesh/Attribs/ColorAttrib.hh>
7using namespace OpenVolumeMesh;
8using namespace Geometry;
31 EXPECT_EQ(8u, mesh_.n_vertices()) <<
"The number of vertices is not correct!";
37 std::vector<VertexHandle> fvertices;
39 fvertices.push_back(v3);
40 fvertices.push_back(v2);
41 fvertices.push_back(v1);
42 fvertices.push_back(v0);
44 FaceHandle fh0 = mesh_.add_face(fvertices);
48 fvertices.push_back(v4);
49 fvertices.push_back(v5);
50 fvertices.push_back(v6);
51 fvertices.push_back(v7);
53 FaceHandle fh1 = mesh_.add_face(fvertices);
57 fvertices.push_back(v0);
58 fvertices.push_back(v4);
59 fvertices.push_back(v7);
60 fvertices.push_back(v3);
62 FaceHandle fh2 = mesh_.add_face(fvertices);
66 fvertices.push_back(v1);
67 fvertices.push_back(v2);
68 fvertices.push_back(v6);
69 fvertices.push_back(v5);
71 FaceHandle fh3 = mesh_.add_face(fvertices);
75 fvertices.push_back(v7);
76 fvertices.push_back(v6);
77 fvertices.push_back(v2);
78 fvertices.push_back(v3);
80 FaceHandle fh4 = mesh_.add_face(fvertices);
84 fvertices.push_back(v0);
85 fvertices.push_back(v1);
86 fvertices.push_back(v5);
87 fvertices.push_back(v4);
89 FaceHandle fh5 = mesh_.add_face(fvertices);
91 EXPECT_EQ(12u, mesh_.n_edges()) <<
"The number of edges is not correct!";
92 EXPECT_EQ(6u, mesh_.n_faces()) <<
"The number of faces is not correct!";
98 std::vector<HalfFaceHandle> chfaces;
100 chfaces.push_back(mesh_.halfface_handle(fh0, 0));
101 chfaces.push_back(mesh_.halfface_handle(fh1, 0));
102 chfaces.push_back(mesh_.halfface_handle(fh2, 0));
103 chfaces.push_back(mesh_.halfface_handle(fh3, 0));
104 chfaces.push_back(mesh_.halfface_handle(fh4, 0));
105 chfaces.push_back(mesh_.halfface_handle(fh5, 0));
107 mesh_.add_cell(chfaces);
109 EXPECT_EQ(1u, mesh_.n_cells()) <<
"The number of cells is not correct!";
116 Vec3d p1(0.0, 0.0, 0.0);
117 Vec3d p2(1.0, 0.0, 0.0);
118 Vec3d p3(1.0, 1.0, 0.0);
119 Vec3d p4(0.0, 1.0, 0.0);
121 Vec3d p5(0.0, 0.0, 1.0);
122 Vec3d p6(1.0, 0.0, 1.0);
123 Vec3d p7(1.0, 1.0, 1.0);
124 Vec3d p8(0.0, 1.0, 1.0);
136 EXPECT_HANDLE_EQ(VertexHandle(0), v1);
137 EXPECT_HANDLE_EQ(VertexHandle(1), v2);
138 EXPECT_HANDLE_EQ(VertexHandle(2), v3);
139 EXPECT_HANDLE_EQ(VertexHandle(3), v4);
140 EXPECT_HANDLE_EQ(VertexHandle(4), v5);
141 EXPECT_HANDLE_EQ(VertexHandle(5), v6);
142 EXPECT_HANDLE_EQ(VertexHandle(6), v7);
143 EXPECT_HANDLE_EQ(VertexHandle(7), v8);
155 EXPECT_HANDLE_EQ(VertexHandle(0), e1);
156 EXPECT_HANDLE_EQ(VertexHandle(1), e2);
157 EXPECT_HANDLE_EQ(VertexHandle(2), e3);
158 EXPECT_HANDLE_EQ(VertexHandle(3), e4);
159 EXPECT_HANDLE_EQ(VertexHandle(4), e5);
160 EXPECT_HANDLE_EQ(VertexHandle(5), e6);
161 EXPECT_HANDLE_EQ(VertexHandle(6), e7);
162 EXPECT_HANDLE_EQ(VertexHandle(7), e8);
175 EXPECT_HANDLE_EQ(v1, mesh_.halfedge(h1).from_vertex());
176 EXPECT_HANDLE_EQ(v2, mesh_.halfedge(h1).to_vertex());
177 EXPECT_HANDLE_EQ(v2, mesh_.halfedge(h2).from_vertex());
178 EXPECT_HANDLE_EQ(v3, mesh_.halfedge(h2).to_vertex());
179 EXPECT_HANDLE_EQ(v3, mesh_.halfedge(h3).from_vertex());
180 EXPECT_HANDLE_EQ(v4, mesh_.halfedge(h3).to_vertex());
181 EXPECT_HANDLE_EQ(v4, mesh_.halfedge(h4).from_vertex());
182 EXPECT_HANDLE_EQ(v1, mesh_.halfedge(h4).to_vertex());
184 EXPECT_HANDLE_EQ(v5, mesh_.halfedge(h5).from_vertex());
185 EXPECT_HANDLE_EQ(v6, mesh_.halfedge(h5).to_vertex());
186 EXPECT_HANDLE_EQ(v6, mesh_.halfedge(h6).from_vertex());
187 EXPECT_HANDLE_EQ(v7, mesh_.halfedge(h6).to_vertex());
188 EXPECT_HANDLE_EQ(v7, mesh_.halfedge(h7).from_vertex());
189 EXPECT_HANDLE_EQ(v8, mesh_.halfedge(h7).to_vertex());
190 EXPECT_HANDLE_EQ(v8, mesh_.halfedge(h8).from_vertex());
191 EXPECT_HANDLE_EQ(v5, mesh_.halfedge(h8).to_vertex());
194 EXPECT_HANDLE_EQ(v2, mesh_.opposite_halfedge(h1).from_vertex());
195 EXPECT_HANDLE_EQ(v1, mesh_.opposite_halfedge(h1).to_vertex());
196 EXPECT_HANDLE_EQ(v3, mesh_.opposite_halfedge(h2).from_vertex());
197 EXPECT_HANDLE_EQ(v2, mesh_.opposite_halfedge(h2).to_vertex());
198 EXPECT_HANDLE_EQ(v4, mesh_.opposite_halfedge(h3).from_vertex());
199 EXPECT_HANDLE_EQ(v3, mesh_.opposite_halfedge(h3).to_vertex());
200 EXPECT_HANDLE_EQ(v1, mesh_.opposite_halfedge(h4).from_vertex());
201 EXPECT_HANDLE_EQ(v4, mesh_.opposite_halfedge(h4).to_vertex());
203 EXPECT_HANDLE_EQ(v6, mesh_.opposite_halfedge(h5).from_vertex());
204 EXPECT_HANDLE_EQ(v5, mesh_.opposite_halfedge(h5).to_vertex());
205 EXPECT_HANDLE_EQ(v7, mesh_.opposite_halfedge(h6).from_vertex());
206 EXPECT_HANDLE_EQ(v6, mesh_.opposite_halfedge(h6).to_vertex());
207 EXPECT_HANDLE_EQ(v8, mesh_.opposite_halfedge(h7).from_vertex());
208 EXPECT_HANDLE_EQ(v7, mesh_.opposite_halfedge(h7).to_vertex());
209 EXPECT_HANDLE_EQ(v5, mesh_.opposite_halfedge(h8).from_vertex());
210 EXPECT_HANDLE_EQ(v8, mesh_.opposite_halfedge(h8).to_vertex());
213 std::vector<VertexHandle> vertices;
214 vertices.push_back(v2); vertices.push_back(v6);
215 vertices.push_back(v7); vertices.push_back(v3);
216 FaceHandle f1 = mesh_.add_face(vertices);
218 EXPECT_HANDLE_EQ(FaceHandle(0), f1);
221 std::vector<HalfEdgeHandle> halfedges = mesh_.face(f1).halfedges();
223 std::vector<HalfEdgeHandle>::iterator it = halfedges.begin();
225 EXPECT_HANDLE_EQ(
EdgeHandle(8), mesh_.edge_handle(*it)); ++it;
226 EXPECT_HANDLE_EQ(
EdgeHandle(5), mesh_.edge_handle(*it)); ++it;
227 EXPECT_HANDLE_EQ(
EdgeHandle(9), mesh_.edge_handle(*it)); ++it;
228 EXPECT_HANDLE_EQ(
EdgeHandle(1), mesh_.edge_handle(*it));
232 halfedges.push_back(mesh_.halfedge_handle(e1, 0)); halfedges.push_back(mesh_.halfedge_handle(e2, 0));
233 halfedges.push_back(mesh_.halfedge_handle(e7, 0)); halfedges.push_back(mesh_.halfedge_handle(e4, 0));
235 FaceHandle fI = mesh_.add_face(halfedges,
true);
237 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidFaceHandle, fI);
241 halfedges.push_back(mesh_.halfedge_handle(e1, 0)); halfedges.push_back(mesh_.halfedge_handle(e2, 0));
242 halfedges.push_back(mesh_.halfedge_handle(e3, 0)); halfedges.push_back(mesh_.halfedge_handle(e4, 0));
244 FaceHandle f2 = mesh_.add_face(halfedges);
246 EXPECT_HANDLE_EQ(FaceHandle(1), f2);
249 halfedges = mesh_.face(f2).halfedges();
251 for(it = halfedges.begin(); it != halfedges.end(); ++it) {
252 EXPECT_HANDLE_EQ(
EdgeHandle(handle), mesh_.edge_handle(*it)); handle++;
264 std::vector<VertexHandle> vertices;
267 vertices.push_back(v0); vertices.push_back(v1);vertices.push_back(v3);
268 FaceHandle f0 = mesh_.add_face(vertices);
271 vertices.push_back(v1); vertices.push_back(v2);vertices.push_back(v3);
272 FaceHandle f1 = mesh_.add_face(vertices);
275 vertices.push_back(v0); vertices.push_back(v1);vertices.push_back(v2);
276 FaceHandle f2 = mesh_.add_face(vertices);
279 vertices.push_back(v0); vertices.push_back(v3);vertices.push_back(v2);
280 FaceHandle f3 = mesh_.add_face(vertices);
282 std::vector<HalfFaceHandle> halffaces;
285 halffaces.push_back(mesh_.halfface_handle(f0, 1));
286 halffaces.push_back(mesh_.halfface_handle(f1, 1));
287 halffaces.push_back(mesh_.halfface_handle(f2, 0));
288 halffaces.push_back(mesh_.halfface_handle(f3, 1));
289 EXPECT_HANDLE_NE(PolyhedralMesh::InvalidCellHandle, mesh_.add_cell(halffaces));
300 std::vector<VertexHandle> vertices;
303 vertices.push_back(v0); vertices.push_back(v1);vertices.push_back(v3);
304 FaceHandle f0 = mesh_.add_face(vertices);
307 vertices.push_back(v1); vertices.push_back(v2);vertices.push_back(v3);
308 FaceHandle f1 = mesh_.add_face(vertices);
311 vertices.push_back(v0); vertices.push_back(v1);vertices.push_back(v2);
312 FaceHandle f2 = mesh_.add_face(vertices);
315 vertices.push_back(v0); vertices.push_back(v3);vertices.push_back(v2);
316 FaceHandle f3 = mesh_.add_face(vertices);
318 std::vector<HalfFaceHandle> halffaces;
321 halffaces.push_back(mesh_.halfface_handle(f0, 1));
322 halffaces.push_back(mesh_.halfface_handle(f1, 1));
323 halffaces.push_back(mesh_.halfface_handle(f2, 0));
324 halffaces.push_back(mesh_.halfface_handle(f3, 0));
325 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidCellHandle, mesh_.add_cell(halffaces,
true));
339 std::vector<VertexHandle> fvertices;
341 fvertices.push_back(v3);
342 fvertices.push_back(v2);
343 fvertices.push_back(v1);
344 fvertices.push_back(v0);
346 FaceHandle fh0 = mesh_.add_face(fvertices);
350 fvertices.push_back(v4);
351 fvertices.push_back(v5);
352 fvertices.push_back(v6);
353 fvertices.push_back(v7);
355 FaceHandle fh1 = mesh_.add_face(fvertices);
359 fvertices.push_back(v0);
360 fvertices.push_back(v4);
361 fvertices.push_back(v7);
362 fvertices.push_back(v3);
364 FaceHandle fh2 = mesh_.add_face(fvertices);
368 fvertices.push_back(v1);
369 fvertices.push_back(v2);
370 fvertices.push_back(v6);
371 fvertices.push_back(v5);
373 FaceHandle fh3 = mesh_.add_face(fvertices);
377 fvertices.push_back(v7);
378 fvertices.push_back(v6);
379 fvertices.push_back(v2);
380 fvertices.push_back(v3);
382 FaceHandle fh4 = mesh_.add_face(fvertices);
386 fvertices.push_back(v0);
387 fvertices.push_back(v1);
388 fvertices.push_back(v5);
389 fvertices.push_back(v4);
391 FaceHandle fh5 = mesh_.add_face(fvertices);
393 std::vector<HalfFaceHandle> chfaces;
395 chfaces.push_back(mesh_.halfface_handle(fh0, 0));
396 chfaces.push_back(mesh_.halfface_handle(fh1, 0));
397 chfaces.push_back(mesh_.halfface_handle(fh2, 0));
398 chfaces.push_back(mesh_.halfface_handle(fh3, 0));
399 chfaces.push_back(mesh_.halfface_handle(fh4, 0));
400 chfaces.push_back(mesh_.halfface_handle(fh5, 0));
402 EXPECT_HANDLE_NE(HexahedralMesh::InvalidCellHandle, mesh_.add_cell(chfaces,
true));
416 std::vector<VertexHandle> fvertices;
418 fvertices.push_back(v3);
419 fvertices.push_back(v2);
420 fvertices.push_back(v1);
421 fvertices.push_back(v0);
423 FaceHandle fh0 = mesh_.add_face(fvertices);
427 fvertices.push_back(v4);
428 fvertices.push_back(v5);
429 fvertices.push_back(v6);
430 fvertices.push_back(v7);
432 FaceHandle fh1 = mesh_.add_face(fvertices);
436 fvertices.push_back(v0);
437 fvertices.push_back(v4);
438 fvertices.push_back(v7);
439 fvertices.push_back(v3);
441 FaceHandle fh2 = mesh_.add_face(fvertices);
445 fvertices.push_back(v1);
446 fvertices.push_back(v2);
447 fvertices.push_back(v6);
448 fvertices.push_back(v5);
450 FaceHandle fh3 = mesh_.add_face(fvertices);
454 fvertices.push_back(v7);
455 fvertices.push_back(v6);
456 fvertices.push_back(v2);
457 fvertices.push_back(v3);
459 FaceHandle fh4 = mesh_.add_face(fvertices);
463 fvertices.push_back(v0);
464 fvertices.push_back(v1);
465 fvertices.push_back(v5);
466 fvertices.push_back(v4);
468 FaceHandle fh5 = mesh_.add_face(fvertices);
470 std::vector<HalfFaceHandle> chfaces;
472 chfaces.push_back(mesh_.halfface_handle(fh0, 0));
473 chfaces.push_back(mesh_.halfface_handle(fh1, 1));
474 chfaces.push_back(mesh_.halfface_handle(fh2, 0));
475 chfaces.push_back(mesh_.halfface_handle(fh3, 0));
476 chfaces.push_back(mesh_.halfface_handle(fh4, 0));
477 chfaces.push_back(mesh_.halfface_handle(fh5, 0));
479 EXPECT_HANDLE_EQ(HexahedralMesh::InvalidCellHandle, mesh_.add_cell(chfaces,
true));
484 generatePolyhedralMesh(mesh_);
486 EXPECT_EQ(0, mesh_.genus());
491 generatePolyhedralMesh(mesh_);
494 std::vector<HalfFaceHandle> hfaces;
498 CellHandle i_cell = mesh_.add_cell(hfaces,
true);
500 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidCellHandle, i_cell);
527 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidHalfFaceHandle, ad_hf3);
535 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidHalfFaceHandle, ad_hf5);
537 EXPECT_EQ(12u, mesh_.n_vertices());
538 EXPECT_EQ(20u, mesh_.n_edges());
539 EXPECT_EQ(2u, mesh_.n_cells());
540 EXPECT_EQ(11u, mesh_.n_faces());
545 generatePolyhedralMesh(mesh_);
549 Vec3d n_x(1.0, 0.0, 0.0);
550 Vec3d n_y(0.0, 1.0, 0.0);
551 Vec3d n_z(0.0, 0.0, 1.0);
553 normals.update_face_normals();
556 Vec3d& n = normals[FaceHandle(0)];
557 EXPECT_DOUBLE_EQ(n_z[0], n[0]);
558 EXPECT_DOUBLE_EQ(n_z[1], n[1]);
559 EXPECT_DOUBLE_EQ(n_z[2], n[2]);
562 EXPECT_DOUBLE_EQ(-n_z[0], n[0]);
563 EXPECT_DOUBLE_EQ(-n_z[1], n[1]);
564 EXPECT_DOUBLE_EQ(-n_z[2], n[2]);
567 n = normals[FaceHandle(2)];
568 EXPECT_DOUBLE_EQ(-n_x[0], n[0]);
569 EXPECT_DOUBLE_EQ(-n_x[1], n[1]);
570 EXPECT_DOUBLE_EQ(-n_x[2], n[2]);
573 EXPECT_DOUBLE_EQ(-n_x[0], n[0]);
574 EXPECT_DOUBLE_EQ(-n_x[1], n[1]);
575 EXPECT_DOUBLE_EQ(-n_x[2], n[2]);
578 EXPECT_DOUBLE_EQ(n_x[0], n[0]);
579 EXPECT_DOUBLE_EQ(n_x[1], n[1]);
580 EXPECT_DOUBLE_EQ(n_x[2], n[2]);
583 n = normals[FaceHandle(4)];
584 EXPECT_DOUBLE_EQ(-n_y[0], n[0]);
585 EXPECT_DOUBLE_EQ(-n_y[1], n[1]);
586 EXPECT_DOUBLE_EQ(-n_y[2], n[2]);
589 EXPECT_DOUBLE_EQ(n_y[0], n[0]);
590 EXPECT_DOUBLE_EQ(n_y[1], n[1]);
591 EXPECT_DOUBLE_EQ(n_y[2], n[2]);
594 n = normals[FaceHandle(5)];
595 EXPECT_DOUBLE_EQ(-n_y[0], n[0]);
596 EXPECT_DOUBLE_EQ(-n_y[1], n[1]);
597 EXPECT_DOUBLE_EQ(-n_y[2], n[2]);
602 generatePolyhedralMesh(mesh_);
608 status[FaceHandle(1)].set_tagged(
true);
609 status[FaceHandle(4)].set_tagged(
true);
614 status[VertexHandle(3)].set_selected(
true);
615 status[VertexHandle(8)].set_selected(
true);
617 EXPECT_TRUE(status[FaceHandle(1)].tagged());
618 EXPECT_TRUE(status[FaceHandle(4)].tagged());
619 EXPECT_FALSE(status[FaceHandle(7)].tagged());
620 EXPECT_FALSE(status[FaceHandle(2)].tagged());
627 EXPECT_TRUE(status[VertexHandle(3)].selected());
628 EXPECT_TRUE(status[VertexHandle(8)].selected());
629 EXPECT_FALSE(status[VertexHandle(1)].selected());
630 EXPECT_FALSE(status[VertexHandle(9)].selected());
635 generatePolyhedralMesh(mesh_);
642 colors[VertexHandle(7)] =
Vec4f(1.0f, 1.0f, 0.0f, 1.0f);
645 colors[FaceHandle(4)] =
Vec4f(1.0f, 1.0f, 0.0f, 1.0f);
649 EXPECT_FLOAT_EQ(1.0f, colors[VertexHandle(7)][0]);
650 EXPECT_FLOAT_EQ(1.0f, colors[VertexHandle(7)][1]);
651 EXPECT_FLOAT_EQ(0.0f, colors[VertexHandle(7)][2]);
652 EXPECT_FLOAT_EQ(1.0f, colors[VertexHandle(7)][3]);
653 EXPECT_FLOAT_EQ(1.0f, colors[
EdgeHandle(6)][0]);
654 EXPECT_FLOAT_EQ(1.0f, colors[
EdgeHandle(6)][1]);
655 EXPECT_FLOAT_EQ(0.0f, colors[
EdgeHandle(6)][2]);
656 EXPECT_FLOAT_EQ(1.0f, colors[
EdgeHandle(6)][3]);
661 EXPECT_FLOAT_EQ(1.0f, colors[FaceHandle(4)][0]);
662 EXPECT_FLOAT_EQ(1.0f, colors[FaceHandle(4)][1]);
663 EXPECT_FLOAT_EQ(0.0f, colors[FaceHandle(4)][2]);
664 EXPECT_FLOAT_EQ(1.0f, colors[FaceHandle(4)][3]);
669 EXPECT_FLOAT_EQ(1.0f, colors[
CellHandle(1)][0]);
670 EXPECT_FLOAT_EQ(1.0f, colors[
CellHandle(1)][1]);
671 EXPECT_FLOAT_EQ(0.0f, colors[
CellHandle(1)][2]);
672 EXPECT_FLOAT_EQ(1.0f, colors[
CellHandle(1)][3]);
677 generatePolyhedralMesh(mesh_);
681 EXPECT_TRUE(mesh_.vertex_property_exists<
Vec3d>(
"VProp"));
683 for(
VertexIter v_it = mesh_.v_iter(); v_it.valid(); ++v_it) {
684 vp[*v_it] =
Vec3d(1.0, 0.0, 0.0);
687 for(
VertexIter v_it = mesh_.v_iter(); v_it.valid(); ++v_it) {
690 EXPECT_DOUBLE_EQ(1.0, t[0]);
691 EXPECT_DOUBLE_EQ(0.0, t[1]);
692 EXPECT_DOUBLE_EQ(0.0, t[2]);
698 EXPECT_DOUBLE_EQ(0.0, p[0]);
699 EXPECT_DOUBLE_EQ(0.0, p[1]);
700 EXPECT_DOUBLE_EQ(0.0, p[2]);
704 EXPECT_TRUE(mesh_.edge_property_exists<
unsigned int>(
"EProp"));
707 for(
EdgeIter e_it = mesh_.e_iter(); e_it.valid(); ++e_it) {
712 for(
EdgeIter e_it = mesh_.e_iter(); e_it.valid(); ++e_it) {
713 EXPECT_EQ(i++, ep[*e_it]);
718 EXPECT_TRUE(mesh_.halfface_property_exists<
bool>(
"HFProp"));
721 for(
HalfFaceIter hf_it = mesh_.hf_iter(); hf_it.valid(); ++hf_it) {
727 for(
HalfFaceIter hf_it = mesh_.hf_iter(); hf_it.valid(); ++hf_it) {
728 EXPECT_EQ(b, hfp[*hf_it]);
735 EXPECT_TRUE(mesh_.cell_property_exists<std::string>(
"CProp"));
737 for(
CellIter c_it = mesh_.c_iter(); c_it.valid(); ++c_it) {
738 cp[*c_it] = std::string(
"MyTestString");
741 for(
CellIter c_it = mesh_.c_iter(); c_it.valid(); ++c_it) {
742 EXPECT_EQ(std::string(
"MyTestString"), cp[*c_it]);
745 EXPECT_FALSE(mesh_.halfedge_property_exists<
unsigned char>(
"HEProp"));
746 EXPECT_FALSE(mesh_.vertex_property_exists<
size_t>(
""));
751 generatePolyhedralMesh(mesh_);
756 std::for_each(mesh_.vertices_begin(), mesh_.vertices_end(), p);
758 std::for_each(mesh_.edges_begin(), mesh_.edges_end(), p);
760 std::for_each(mesh_.halfedges_begin(), mesh_.halfedges_end(), p);
762 std::for_each(mesh_.faces_begin(), mesh_.faces_end(), p);
764 std::for_each(mesh_.halffaces_begin(), mesh_.halffaces_end(), p);
766 std::for_each(mesh_.cells_begin(), mesh_.cells_end(), p);
771 generatePolyhedralMesh(mesh_);
773 std::vector<HalfFaceHandle> hfs = mesh_.cell(
CellHandle(0)).halffaces();
777 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin(),
778 hf_end = hfs.end(); hf_it != hf_end; ++hf_it) {
779 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidCellHandle, mesh_.incident_cell(*hf_it));
785 generatePolyhedralMesh(mesh_);
787 std::vector<HalfEdgeHandle> hes = mesh_.face(FaceHandle(0)).halfedges();
789 std::vector<HalfFaceHandle> ihfs[4];
791 for(
size_t i = 0; i < 4; ++i) {
796 if(mesh_.face_handle(hfh) == FaceHandle(0))
continue;
798 hfh.idx((hfh.idx() > mesh_.halfface_handle(FaceHandle(0), 1).idx() ? hfh.idx() - 2 : hfh.idx()));
800 ihfs[i].push_back(hfh);
804 mesh_.delete_face(FaceHandle(0));
806 std::set<HalfFaceHandle> nihfs[4];
807 for(
size_t i = 0; i < 4; ++i) {
809 nihfs[i].insert(*hehf_it);
813 EXPECT_EQ(ihfs[0].size(), nihfs[0].size());
814 EXPECT_EQ(ihfs[1].size(), nihfs[1].size());
815 EXPECT_EQ(ihfs[2].size(), nihfs[2].size());
816 EXPECT_EQ(ihfs[3].size(), nihfs[3].size());
818 for(
size_t i = 0; i < 4; ++i) {
819 for(std::vector<HalfFaceHandle>::const_iterator hf_it = ihfs[i].begin(),
820 hf_end = ihfs[i].end(); hf_it != hf_end; ++hf_it) {
821 EXPECT_GT(nihfs[i].count(*hf_it), 0u);
828 generatePolyhedralMesh(mesh_);
830 VertexHandle vh0 = mesh_.edge(
EdgeHandle(0)).from_vertex();
831 VertexHandle vh1 = mesh_.edge(
EdgeHandle(0)).to_vertex();
833 std::vector<HalfEdgeHandle> hes0;
835 if(mesh_.edge_handle(*voh_it) ==
EdgeHandle(0))
continue;
836 hes0.push_back(
HalfEdgeHandle(voh_it->idx() > mesh_.halfedge_handle(
EdgeHandle(0), 1).idx() ? voh_it->idx() - 2 : voh_it->idx()));
839 std::vector<HalfEdgeHandle> hes1;
841 if(mesh_.edge_handle(*voh_it) ==
EdgeHandle(0))
continue;
842 hes1.push_back(
HalfEdgeHandle(voh_it->idx() > mesh_.halfedge_handle(
EdgeHandle(0), 1).idx() ? voh_it->idx() - 2 : voh_it->idx()));
847 std::set<HalfEdgeHandle> nhes0;
849 nhes0.insert(*voh_it);
852 std::set<HalfEdgeHandle> nhes1;
854 nhes1.insert(*voh_it);
857 EXPECT_EQ(hes0.size(), nhes0.size());
858 EXPECT_EQ(hes1.size(), nhes1.size());
860 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes0.begin(),
861 he_end = hes0.end(); he_it != he_end; ++he_it) {
862 EXPECT_GT(nhes0.count(*he_it), 0u);
865 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes1.begin(),
866 he_end = hes1.end(); he_it != he_end; ++he_it) {
867 EXPECT_GT(nhes1.count(*he_it), 0u);
873 generatePolyhedralMesh(mesh_);
875 mesh_.enable_bottom_up_incidences(
false);
877 std::vector<HalfFaceHandle> hfs = mesh_.cell(
CellHandle(0)).halffaces();
881 mesh_.enable_bottom_up_incidences(
true);
883 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin(),
884 hf_end = hfs.end(); hf_it != hf_end; ++hf_it) {
885 EXPECT_HANDLE_EQ(PolyhedralMesh::InvalidCellHandle, mesh_.incident_cell(*hf_it));
891 generatePolyhedralMesh(mesh_);
893 mesh_.enable_bottom_up_incidences(
false);
895 std::vector<HalfEdgeHandle> hes = mesh_.face(FaceHandle(0)).halfedges();
897 std::vector<HalfFaceHandle> ihfs[4];
899 for(
size_t i = 0; i < 4; ++i) {
900 for(
HalfFaceIter hf_it = mesh_.halffaces_begin(), hf_end = mesh_.halffaces_end(); hf_it != hf_end; ++hf_it) {
902 std::vector<HalfEdgeHandle> t_hes = mesh_.halfface(*hf_it).halfedges();
904 for(std::vector<HalfEdgeHandle>::const_iterator the_it = t_hes.begin(),
905 the_end = t_hes.end(); the_it != the_end; ++the_it) {
906 if(std::find(hes.begin(), hes.end(), *the_it) != hes.end()) {
915 if(mesh_.face_handle(hfh) == FaceHandle(0))
continue;
917 hfh.idx((hfh.idx() > mesh_.halfface_handle(FaceHandle(0), 1).idx() ? hfh.idx() - 2 : hfh.idx()));
919 ihfs[i].push_back(hfh);
923 mesh_.delete_face(FaceHandle(0));
925 std::set<HalfFaceHandle> nihfs[4];
926 for(
size_t i = 0; i < 4; ++i) {
927 for(
HalfFaceIter hf_it = mesh_.halffaces_begin(), hf_end = mesh_.halffaces_end(); hf_it != hf_end; ++hf_it) {
929 std::vector<HalfEdgeHandle> t_hes = mesh_.halfface(*hf_it).halfedges();
931 for(std::vector<HalfEdgeHandle>::const_iterator the_it = t_hes.begin(),
932 the_end = t_hes.end(); the_it != the_end; ++the_it) {
933 if(std::find(hes.begin(), hes.end(), *the_it) != hes.end()) {
940 nihfs[i].insert(*hf_it);
944 EXPECT_EQ(ihfs[0].size(), nihfs[0].size());
945 EXPECT_EQ(ihfs[1].size(), nihfs[1].size());
946 EXPECT_EQ(ihfs[2].size(), nihfs[2].size());
947 EXPECT_EQ(ihfs[3].size(), nihfs[3].size());
949 for(
size_t i = 0; i < 4; ++i) {
950 for(std::vector<HalfFaceHandle>::const_iterator hf_it = ihfs[i].begin(),
951 hf_end = ihfs[i].end(); hf_it != hf_end; ++hf_it) {
952 EXPECT_GT(nihfs[i].count(*hf_it), 0u);
959 generatePolyhedralMesh(mesh_);
961 mesh_.enable_bottom_up_incidences(
false);
963 VertexHandle vh0 = mesh_.edge(
EdgeHandle(0)).from_vertex();
964 VertexHandle vh1 = mesh_.edge(
EdgeHandle(0)).to_vertex();
966 std::vector<HalfEdgeHandle> hes0;
967 for(
HalfEdgeIter he_it = mesh_.halfedges_begin(), he_end = mesh_.halfedges_end(); he_it != he_end; ++he_it) {
969 if(mesh_.halfedge(*he_it).from_vertex() == vh0) {
971 if(mesh_.edge_handle(*he_it) ==
EdgeHandle(0))
continue;
972 hes0.push_back(
HalfEdgeHandle(he_it->idx() > mesh_.halfedge_handle(
EdgeHandle(0), 1).idx() ? he_it->idx() - 2 : he_it->idx()));
976 std::vector<HalfEdgeHandle> hes1;
977 for(
HalfEdgeIter he_it = mesh_.halfedges_begin(), he_end = mesh_.halfedges_end(); he_it != he_end; ++he_it) {
979 if(mesh_.halfedge(*he_it).from_vertex() == vh1) {
981 if(mesh_.edge_handle(*he_it) ==
EdgeHandle(0))
continue;
982 hes1.push_back(
HalfEdgeHandle(he_it->idx() > mesh_.halfedge_handle(
EdgeHandle(0), 1).idx() ? he_it->idx() - 2 : he_it->idx()));
988 std::set<HalfEdgeHandle> nhes0;
989 for(
HalfEdgeIter he_it = mesh_.halfedges_begin(), he_end = mesh_.halfedges_end(); he_it != he_end; ++he_it) {
990 if(mesh_.halfedge(*he_it).from_vertex() == vh0) {
991 nhes0.insert(*he_it);
995 std::set<HalfEdgeHandle> nhes1;
996 for(
HalfEdgeIter he_it = mesh_.halfedges_begin(), he_end = mesh_.halfedges_end(); he_it != he_end; ++he_it) {
997 if(mesh_.halfedge(*he_it).from_vertex() == vh1) {
998 nhes1.insert(*he_it);
1002 EXPECT_EQ(hes0.size(), nhes0.size());
1003 EXPECT_EQ(hes1.size(), nhes1.size());
1005 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes0.begin(),
1006 he_end = hes0.end(); he_it != he_end; ++he_it) {
1007 EXPECT_GT(nhes0.count(*he_it), 0u);
1010 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes1.begin(),
1011 he_end = hes1.end(); he_it != he_end; ++he_it) {
1012 EXPECT_GT(nhes1.count(*he_it), 0u);
1018 generatePolyhedralMesh(mesh_);
1021 he_it != mesh_.halfedges_end(); ++he_it) {
1023 const VertexHandle& fromVertex = mesh_.halfedge(*he_it).from_vertex();
1024 const VertexHandle& toVertex = mesh_.halfedge(*he_it).to_vertex();
1026 EXPECT_LE(fromVertex.idx(), 11);
1027 EXPECT_LE(toVertex.idx(), 11);
1030 mesh_.delete_vertex(VertexHandle(11));
1033 he_it != mesh_.halfedges_end(); ++he_it) {
1035 const VertexHandle& fromVertex = mesh_.halfedge(*he_it).from_vertex();
1036 const VertexHandle& toVertex = mesh_.halfedge(*he_it).to_vertex();
1038 EXPECT_LE(fromVertex.idx(), 10);
1039 EXPECT_LE(toVertex.idx(), 10);
1045 generatePolyhedralMesh(mesh_);
1048 f_it != mesh_.halffaces_end(); ++f_it) {
1050 std::vector<HalfEdgeHandle> hes = mesh_.halfface(*f_it).halfedges();
1051 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin();
1052 he_it != hes.end(); ++he_it) {
1053 EXPECT_LE(he_it->idx(), 39);
1060 f_it != mesh_.halffaces_end(); ++f_it) {
1062 std::vector<HalfEdgeHandle> hes = mesh_.halfface(*f_it).halfedges();
1063 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin();
1064 he_it != hes.end(); ++he_it) {
1065 EXPECT_LE(he_it->idx(), 37);
1072 generatePolyhedralMesh(mesh_);
1075 c_it != mesh_.cells_end(); ++c_it) {
1077 std::vector<HalfFaceHandle> hfs = mesh_.cell(*c_it).halffaces();
1078 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin();
1079 hf_it != hfs.end(); ++hf_it) {
1080 EXPECT_LE(hf_it->idx(), 21);
1081 EXPECT_LE(mesh_.opposite_halfface_handle(*hf_it).idx(), 21);
1085 mesh_.delete_face(FaceHandle(10));
1088 c_it != mesh_.cells_end(); ++c_it) {
1090 std::vector<HalfFaceHandle> hfs = mesh_.cell(*c_it).halffaces();
1091 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin();
1092 hf_it != hfs.end(); ++hf_it) {
1093 EXPECT_LE(hf_it->idx(), 19);
1094 EXPECT_LE(mesh_.opposite_halfface_handle(*hf_it).idx(), 19);
1101 generatePolyhedralMesh(mesh_);
1103 mesh_.enable_bottom_up_incidences(
false);
1106 he_it != mesh_.halfedges_end(); ++he_it) {
1108 const VertexHandle& fromVertex = mesh_.halfedge(*he_it).from_vertex();
1109 const VertexHandle& toVertex = mesh_.halfedge(*he_it).to_vertex();
1111 EXPECT_LE(fromVertex.idx(), 11);
1112 EXPECT_LE(toVertex.idx(), 11);
1115 mesh_.delete_vertex(VertexHandle(11));
1118 he_it != mesh_.halfedges_end(); ++he_it) {
1120 const VertexHandle& fromVertex = mesh_.halfedge(*he_it).from_vertex();
1121 const VertexHandle& toVertex = mesh_.halfedge(*he_it).to_vertex();
1123 EXPECT_LE(fromVertex.idx(), 10);
1124 EXPECT_LE(toVertex.idx(), 10);
1130 generatePolyhedralMesh(mesh_);
1132 mesh_.enable_bottom_up_incidences(
false);
1135 f_it != mesh_.halffaces_end(); ++f_it) {
1137 std::vector<HalfEdgeHandle> hes = mesh_.halfface(*f_it).halfedges();
1138 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin();
1139 he_it != hes.end(); ++he_it) {
1140 EXPECT_LE(he_it->idx(), 39);
1147 f_it != mesh_.halffaces_end(); ++f_it) {
1149 std::vector<HalfEdgeHandle> hes = mesh_.halfface(*f_it).halfedges();
1150 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin();
1151 he_it != hes.end(); ++he_it) {
1152 EXPECT_LE(he_it->idx(), 37);
1159 generatePolyhedralMesh(mesh_);
1161 mesh_.enable_bottom_up_incidences(
false);
1164 c_it != mesh_.cells_end(); ++c_it) {
1166 std::vector<HalfFaceHandle> hfs = mesh_.cell(*c_it).halffaces();
1167 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin();
1168 hf_it != hfs.end(); ++hf_it) {
1169 EXPECT_LE(hf_it->idx(), 21);
1170 EXPECT_LE(mesh_.opposite_halfface_handle(*hf_it).idx(), 21);
1174 mesh_.delete_face(FaceHandle(10));
1177 c_it != mesh_.cells_end(); ++c_it) {
1179 std::vector<HalfFaceHandle> hfs = mesh_.cell(*c_it).halffaces();
1180 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin();
1181 hf_it != hfs.end(); ++hf_it) {
1182 EXPECT_LE(hf_it->idx(), 19);
1183 EXPECT_LE(mesh_.opposite_halfface_handle(*hf_it).idx(), 19);
1194 generateHexahedralMesh(mesh_);
1196 EXPECT_EQ(12u, mesh_.n_vertices());
1197 EXPECT_EQ(20u, mesh_.n_edges());
1198 EXPECT_EQ(11u, mesh_.n_faces());
1199 EXPECT_EQ(2u, mesh_.n_cells());
1208 EXPECT_HANDLE_EQ(
HalfFaceHandle(12), mesh_.opposite_halfface_handle_in_cell(
1211 EXPECT_HANDLE_EQ(
HalfFaceHandle(20), mesh_.adjacent_halfface_on_sheet(
1213 EXPECT_HANDLE_EQ(
HalfFaceHandle(21), mesh_.adjacent_halfface_on_sheet(
1216 HexahedralMesh::CellSheetCellIter csc_it = mesh_.csc_iter(
CellHandle(0), HexahedralMesh::YF);
1219 HexahedralMesh::HalfFaceSheetHalfFaceIter hfshf_it = mesh_.hfshf_iter(
HalfFaceHandle(5));
1227 generateHexahedralMesh(mesh_);
1229 EXPECT_EQ(12u, mesh_.n_vertices());
1230 EXPECT_EQ(20u, mesh_.n_edges());
1231 EXPECT_EQ(11u, mesh_.n_faces());
1232 EXPECT_EQ(2u, mesh_.n_cells());
1234 mesh_.delete_vertex(VertexHandle(0));
1236 EXPECT_EQ(11u, mesh_.n_vertices());
1237 EXPECT_EQ(17u, mesh_.n_edges());
1238 EXPECT_EQ(8u, mesh_.n_faces());
1239 EXPECT_EQ(1u, mesh_.n_cells());
1243 EXPECT_EQ(3, hv_it->idx()); ++hv_it;
1244 EXPECT_EQ(4, hv_it->idx()); ++hv_it;
1245 EXPECT_EQ(5, hv_it->idx()); ++hv_it;
1246 EXPECT_EQ(6, hv_it->idx()); ++hv_it;
1247 EXPECT_EQ(7, hv_it->idx()); ++hv_it;
1248 EXPECT_EQ(10, hv_it->idx()); ++hv_it;
1249 EXPECT_EQ(9, hv_it->idx()); ++hv_it;
1250 EXPECT_EQ(8, hv_it->idx());
1255 generateHexahedralMesh(mesh_);
1257 EXPECT_EQ(12u, mesh_.n_vertices());
1258 EXPECT_EQ(20u, mesh_.n_edges());
1259 EXPECT_EQ(11u, mesh_.n_faces());
1260 EXPECT_EQ(2u, mesh_.n_cells());
1266 EXPECT_EQ(4, hv_it->idx()); ++hv_it;
1267 EXPECT_EQ(5, hv_it->idx()); ++hv_it;
1268 EXPECT_EQ(6, hv_it->idx()); ++hv_it;
1269 EXPECT_EQ(7, hv_it->idx()); ++hv_it;
1270 EXPECT_EQ(8, hv_it->idx()); ++hv_it;
1271 EXPECT_EQ(11, hv_it->idx()); ++hv_it;
1272 EXPECT_EQ(10, hv_it->idx()); ++hv_it;
1273 EXPECT_EQ(9, hv_it->idx());
1275 status[VertexHandle(0)].set_deleted(
true);
1277 status.garbage_collection(
false);
1279 EXPECT_EQ(1u, mesh_.n_cells());
1280 EXPECT_EQ(11u, mesh_.n_vertices());
1281 EXPECT_EQ(17u, mesh_.n_edges());
1282 EXPECT_EQ(8u, mesh_.n_faces());
1286 EXPECT_EQ(3, hv_it->idx()); ++hv_it;
1287 EXPECT_EQ(4, hv_it->idx()); ++hv_it;
1288 EXPECT_EQ(5, hv_it->idx()); ++hv_it;
1289 EXPECT_EQ(6, hv_it->idx()); ++hv_it;
1290 EXPECT_EQ(7, hv_it->idx()); ++hv_it;
1291 EXPECT_EQ(10, hv_it->idx()); ++hv_it;
1292 EXPECT_EQ(9, hv_it->idx()); ++hv_it;
1293 EXPECT_EQ(8, hv_it->idx());
1295 status.garbage_collection(
true);
1297 EXPECT_EQ(1u, mesh_.n_cells());
1298 EXPECT_EQ(8u, mesh_.n_vertices());
1299 EXPECT_EQ(12u, mesh_.n_edges());
1300 EXPECT_EQ(6u, mesh_.n_faces());
1304 EXPECT_EQ(0, hv_it->idx()); ++hv_it;
1305 EXPECT_EQ(1, hv_it->idx()); ++hv_it;
1306 EXPECT_EQ(2, hv_it->idx()); ++hv_it;
1307 EXPECT_EQ(3, hv_it->idx()); ++hv_it;
1308 EXPECT_EQ(4, hv_it->idx()); ++hv_it;
1309 EXPECT_EQ(7, hv_it->idx()); ++hv_it;
1310 EXPECT_EQ(6, hv_it->idx()); ++hv_it;
1311 EXPECT_EQ(5, hv_it->idx());
1316 generateHexahedralMesh(mesh_);
1320 status[VertexHandle(0)].set_deleted(
true);
1322 status.garbage_collection(
false);
1324 status.garbage_collection(
false);
1326 EXPECT_EQ(1u, mesh_.n_cells());
1327 EXPECT_EQ(11u, mesh_.n_vertices());
1328 EXPECT_EQ(17u, mesh_.n_edges());
1329 EXPECT_EQ(8u, mesh_.n_faces());
1334 generateHexahedralMesh(mesh_);
1340 status.garbage_collection(
false);
1342 EXPECT_EQ(1u, mesh_.n_cells());
1343 EXPECT_EQ(12u, mesh_.n_vertices());
1344 EXPECT_EQ(19u, mesh_.n_edges());
1345 EXPECT_EQ(9u, mesh_.n_faces());
1350 generateHexahedralMesh(mesh_);
1356 status.garbage_collection(
false);
1358 EXPECT_EQ(0u, mesh_.n_cells());
1359 EXPECT_EQ(12u, mesh_.n_vertices());
1360 EXPECT_EQ(19u, mesh_.n_edges());
1361 EXPECT_EQ(8u, mesh_.n_faces());
1366 generateHexahedralMesh(mesh_);
1374 status.garbage_collection(
true);
1376 EXPECT_EQ(1u, mesh_.n_cells());
1377 EXPECT_EQ(8u, mesh_.n_vertices());
1378 EXPECT_EQ(12u, mesh_.n_edges());
1379 EXPECT_EQ(6u, mesh_.n_faces());
1384 generateHexahedralMesh(mesh_);
1388 status[VertexHandle(0)].set_deleted(
true);
1390 status.garbage_collection(
true);
1392 EXPECT_EQ(1u, mesh_.n_cells());
1393 EXPECT_EQ(6u, mesh_.n_faces());
1394 EXPECT_EQ(12u, mesh_.n_edges());
1395 EXPECT_EQ(8u, mesh_.n_vertices());
1400 generateHexahedralMesh(mesh_);
1406 status.garbage_collection(
true);
1408 EXPECT_EQ(1u, mesh_.n_cells());
1409 EXPECT_EQ(6u, mesh_.n_faces());
1410 EXPECT_EQ(12u, mesh_.n_edges());
1411 EXPECT_EQ(8u, mesh_.n_vertices());
1416 generateHexahedralMesh(mesh_);
1420 status[FaceHandle(0)].set_deleted(
true);
1422 status.garbage_collection(
true);
1424 EXPECT_EQ(1u, mesh_.n_cells());
1425 EXPECT_EQ(6u, mesh_.n_faces());
1426 EXPECT_EQ(12u, mesh_.n_edges());
1427 EXPECT_EQ(8u, mesh_.n_vertices());
1432 generateHexahedralMesh(mesh_);
1438 status.garbage_collection(
true);
1440 EXPECT_EQ(1u, mesh_.n_cells());
1441 EXPECT_EQ(6u, mesh_.n_faces());
1442 EXPECT_EQ(12u, mesh_.n_edges());
1443 EXPECT_EQ(8u, mesh_.n_vertices());
1448 generateHexahedralMesh(mesh_);
1454 status.garbage_collection(
false);
1456 EXPECT_EQ(0u, mesh_.n_cells());
1457 EXPECT_EQ(8u, mesh_.n_faces());
1458 EXPECT_EQ(19u, mesh_.n_edges());
1459 EXPECT_EQ(12u, mesh_.n_vertices());
1461 status.garbage_collection(
true);
1463 EXPECT_EQ(0u, mesh_.n_cells());
1464 EXPECT_EQ(0u, mesh_.n_faces());
1465 EXPECT_EQ(0u, mesh_.n_edges());
1466 EXPECT_EQ(0u, mesh_.n_vertices());
1471 generateHexahedralMesh(mesh_);
1473 EXPECT_EQ(12u, mesh_.n_vertices());
1474 EXPECT_EQ(20u, mesh_.n_edges());
1475 EXPECT_EQ(11u, mesh_.n_faces());
1476 EXPECT_EQ(2u, mesh_.n_cells());
1480 status[VertexHandle(0)].set_deleted(
true);
1482 std::vector<VertexHandle> vhs;
1483 std::vector<VertexHandle*> track_vhs;
1484 std::vector<HalfEdgeHandle*> hh_empty;
1485 std::vector<HalfFaceHandle*> hfh_empty;
1486 std::vector<CellHandle*> ch_empty;
1489 for (; v_it != mesh_.vertices_end(); ++v_it)
1490 vhs.push_back(*v_it);
1492 for (std::vector<VertexHandle>::iterator it = vhs.begin(); it != vhs.end(); ++it)
1493 track_vhs.push_back(&(*it));
1495 status.garbage_collection(track_vhs, hh_empty, hfh_empty, ch_empty,
false);
1497 EXPECT_HANDLE_EQ(vhs[0], VertexHandle(-1));
1498 EXPECT_HANDLE_EQ(vhs[11], VertexHandle(10));
1500 EXPECT_EQ(1u, mesh_.n_cells());
1501 EXPECT_EQ(11u, mesh_.n_vertices());
1502 EXPECT_EQ(17u, mesh_.n_edges());
1503 EXPECT_EQ(8u, mesh_.n_faces());
1508 generateHexahedralMesh(mesh_);
1514 std::vector<HalfEdgeHandle> hhs;
1515 std::vector<VertexHandle*> vh_empty;
1516 std::vector<HalfEdgeHandle*> track_hh;
1517 std::vector<HalfFaceHandle*> hfh_empty;
1518 std::vector<CellHandle*> ch_empty;
1521 for (; hh_it != mesh_.halfedges_end(); ++hh_it)
1522 hhs.push_back(*hh_it);
1524 for (std::vector<HalfEdgeHandle>::iterator it = hhs.begin(); it != hhs.end(); ++it)
1525 track_hh.push_back(&(*it));
1527 status.garbage_collection(vh_empty, track_hh, hfh_empty, ch_empty,
false);
1535 EXPECT_EQ(0u, mesh_.n_cells());
1536 EXPECT_EQ(8u, mesh_.n_faces());
1537 EXPECT_EQ(19u, mesh_.n_edges());
1538 EXPECT_EQ(12u, mesh_.n_vertices());
1540 status.garbage_collection(vh_empty, track_hh, hfh_empty, ch_empty,
true);
1542 for (std::vector<HalfEdgeHandle>::iterator it = hhs.begin(); it != hhs.end(); ++it)
1543 EXPECT_EQ(it->idx(), -1);
1545 EXPECT_EQ(0u, mesh_.n_cells());
1546 EXPECT_EQ(0u, mesh_.n_faces());
1547 EXPECT_EQ(0u, mesh_.n_edges());
1548 EXPECT_EQ(0u, mesh_.n_vertices());
1553 generateHexahedralMesh(mesh_);
1557 status[FaceHandle(0)].set_deleted(
true);
1559 std::vector<HalfFaceHandle> hfhs;
1560 std::vector<VertexHandle*> vh_empty;
1561 std::vector<HalfEdgeHandle*> hh_empty;
1562 std::vector<HalfFaceHandle*> track_hfh;
1563 std::vector<CellHandle*> ch_empty;
1566 for (; hfh_it != mesh_.halffaces_end(); ++hfh_it)
1567 hfhs.push_back(*hfh_it);
1569 for (std::vector<HalfFaceHandle>::iterator it = hfhs.begin(); it != hfhs.end(); ++it)
1570 track_hfh.push_back(&(*it));
1572 status.garbage_collection(vh_empty, hh_empty, track_hfh, ch_empty,
true);
1581 EXPECT_EQ(1u, mesh_.n_cells());
1582 EXPECT_EQ(6u, mesh_.n_faces());
1583 EXPECT_EQ(12u, mesh_.n_edges());
1584 EXPECT_EQ(8u, mesh_.n_vertices());
1589 generateHexahedralMesh(mesh_);
1595 std::vector<CellHandle> chs;
1596 std::vector<VertexHandle*> vh_empty;
1597 std::vector<HalfEdgeHandle*> hh_empty;
1598 std::vector<HalfFaceHandle*> hfh_empty;
1599 std::vector<CellHandle*> track_ch;
1602 for (; c_it != mesh_.cells_end(); ++c_it)
1603 chs.push_back(*c_it);
1605 for (std::vector<CellHandle>::iterator it = chs.begin(); it != chs.end(); ++it)
1606 track_ch.push_back(&(*it));
1608 status.garbage_collection(vh_empty, hh_empty, hfh_empty, track_ch,
true);
1610 EXPECT_HANDLE_EQ(chs[0], HexahedralMesh::InvalidCellHandle);
1613 EXPECT_EQ(1u, mesh_.n_cells());
1614 EXPECT_EQ(6u, mesh_.n_faces());
1615 EXPECT_EQ(12u, mesh_.n_edges());
1616 EXPECT_EQ(8u, mesh_.n_vertices());
1621 generateHexahedralMesh(mesh_);
1637 FaceHandle fh10(10);
1651 status[VertexHandle(0)].set_deleted(
true);
1653 status.garbage_collection(
false);
1655 EXPECT_EQ(1u, mesh_.n_cells());
1656 EXPECT_EQ(11u, mesh_.n_vertices());
1657 EXPECT_EQ(17u, mesh_.n_edges());
1658 EXPECT_EQ(8u, mesh_.n_faces());
1660 std::set<int> fprops_i;
1661 for(
FaceIter f_it = mesh_.f_iter(); f_it.valid(); ++f_it) {
1662 fprops_i.insert(fprop[*f_it]);
1665 EXPECT_EQ(0u, fprops_i.count(11));
1666 EXPECT_EQ(1u, fprops_i.count(10));
1667 EXPECT_EQ(1u, fprops_i.count(9));
1668 EXPECT_EQ(0u, fprops_i.count(8));
1669 EXPECT_EQ(0u, fprops_i.count(7));
1670 EXPECT_EQ(1u, fprops_i.count(6));
1671 EXPECT_EQ(1u, fprops_i.count(5));
1672 EXPECT_EQ(1u, fprops_i.count(4));
1673 EXPECT_EQ(1u, fprops_i.count(3));
1674 EXPECT_EQ(1u, fprops_i.count(2));
1675 EXPECT_EQ(1u, fprops_i.count(1));
1680 generateHexahedralMesh(mesh_);
1696 FaceHandle fh10(10);
1710 status[FaceHandle(0)].set_deleted(
true);
1712 status.garbage_collection(
false);
1714 EXPECT_EQ(1u, mesh_.n_cells());
1715 EXPECT_EQ(12u, mesh_.n_vertices());
1716 EXPECT_EQ(20u, mesh_.n_edges());
1717 EXPECT_EQ(10u, mesh_.n_faces());
1719 std::set<int> fprops_i;
1720 for(
FaceIter f_it = mesh_.f_iter(); f_it.valid(); ++f_it) {
1721 fprops_i.insert(fprop[*f_it]);
1724 EXPECT_EQ(0u, fprops_i.count(11));
1725 EXPECT_EQ(1u, fprops_i.count(10));
1726 EXPECT_EQ(1u, fprops_i.count(9));
1727 EXPECT_EQ(1u, fprops_i.count(8));
1728 EXPECT_EQ(1u, fprops_i.count(7));
1729 EXPECT_EQ(1u, fprops_i.count(6));
1730 EXPECT_EQ(1u, fprops_i.count(5));
1731 EXPECT_EQ(1u, fprops_i.count(4));
1732 EXPECT_EQ(1u, fprops_i.count(3));
1733 EXPECT_EQ(1u, fprops_i.count(2));
1734 EXPECT_EQ(1u, fprops_i.count(1));
1739 generateHexahedralMesh(mesh_);
1759 EXPECT_HANDLE_EQ(HexahedralMesh::InvalidHalfEdgeHandle, heInv);
1764 generateHexahedralMesh(mesh_);
1770 std::vector<HalfEdgeHandle> hes;
1771 hes.push_back(he0); hes.push_back(he2);
1775 hes.push_back(he0); hes.push_back(he4);
1782 hes.push_back(he16); hes.push_back(he18);
1786 hes.push_back(he0); hes.push_back(he18);
1793 hes.push_back(he17); hes.push_back(he19);
1800 EXPECT_HANDLE_EQ(HexahedralMesh::InvalidHalfFaceHandle, hfInv);
1805 generateHexahedralMesh(mesh_);
1814 std::vector<VertexHandle> vs;
1815 vs.push_back(v0); vs.push_back(v1); vs.push_back(v2);
1818 vs.push_back(v2); vs.push_back(v1); vs.push_back(v0);
1821 vs.push_back(v2); vs.push_back(v1); vs.push_back(v5);
1824 vs.push_back(v6); vs.push_back(v5); vs.push_back(v4);
1827 vs.push_back(v4); vs.push_back(v5); vs.push_back(v6);
1830 vs.push_back(v0); vs.push_back(v1); vs.push_back(v4);
1833 vs.push_back(v0); vs.push_back(v1); vs.push_back(v6);
1841 EXPECT_HANDLE_EQ(HexahedralMesh::InvalidHalfFaceHandle, hfInv0);
1842 EXPECT_HANDLE_EQ(HexahedralMesh::InvalidHalfFaceHandle, hfInv1);
1847 generateHexahedralMesh(mesh_);
1851 status[FaceHandle(0)].set_deleted(
true);
1853 status.garbage_collection(
false);
1855 EXPECT_EQ(1u, mesh_.n_cells());
1856 EXPECT_EQ(10u, mesh_.n_faces());
1857 EXPECT_EQ(20u, mesh_.n_edges());
1858 EXPECT_EQ(12u, mesh_.n_vertices());
1860 std::vector<VertexHandle> vs;
1861 vs.push_back(VertexHandle(0));
1862 vs.push_back(VertexHandle(1));
1863 vs.push_back(VertexHandle(2));
1864 vs.push_back(VertexHandle(3));
1865 vs.push_back(VertexHandle(4));
1866 vs.push_back(VertexHandle(7));
1867 vs.push_back(VertexHandle(6));
1868 vs.push_back(VertexHandle(5));
1872 EXPECT_HANDLE_NE(HexahedralMesh::InvalidCellHandle, ch);
1874 EXPECT_EQ(2u, mesh_.n_cells());
1875 EXPECT_EQ(11u, mesh_.n_faces());
1876 EXPECT_EQ(20u, mesh_.n_edges());
1877 EXPECT_EQ(12u, mesh_.n_vertices());
1882 generateHexahedralMesh(mesh_);
1886 status[FaceHandle(0)].set_deleted(
true);
1888 status.garbage_collection(
true);
1890 EXPECT_EQ(1u, mesh_.n_cells());
1891 EXPECT_EQ(6u, mesh_.n_faces());
1892 EXPECT_EQ(12u, mesh_.n_edges());
1893 EXPECT_EQ(8u, mesh_.n_vertices());
1900 std::vector<VertexHandle> vs;
1905 vs.push_back(VertexHandle(0));
1906 vs.push_back(VertexHandle(3));
1907 vs.push_back(VertexHandle(2));
1908 vs.push_back(VertexHandle(1));
1912 EXPECT_HANDLE_NE(HexahedralMesh::InvalidCellHandle, ch);
1914 EXPECT_EQ(2u, mesh_.n_cells());
1915 EXPECT_EQ(11u, mesh_.n_faces());
1916 EXPECT_EQ(20u, mesh_.n_edges());
1917 EXPECT_EQ(12u, mesh_.n_vertices());
1924 generatePolyhedralMesh(mesh_);
1926 Vec3d p1(0.0, 0.0, 0.0);
1927 Vec3d p2(1.0, 0.0, 0.0);
1928 Vec3d p3(1.0, 1.0, 0.0);
1929 Vec3d p4(0.0, 1.0, 0.0);
1931 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(0))[0], p1[0]);
1932 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(0))[1], p1[1]);
1933 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(0))[2], p1[2]);
1935 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(1))[0], p2[0]);
1936 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(1))[1], p2[1]);
1937 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(1))[2], p2[2]);
1939 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(2))[0], p3[0]);
1940 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(2))[1], p3[1]);
1941 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(2))[2], p3[2]);
1943 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(3))[0], p4[0]);
1944 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(3))[1], p4[1]);
1945 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(3))[2], p4[2]);
1947 EXPECT_EQ(12u, mesh_.n_vertices());
1949 Vec3d p1n(1.0, 1.0, 1.0);
1950 Vec3d p2n(0.0, 1.0, 2.0);
1951 Vec3d p3n(0.0, 0.0, 3.0);
1952 Vec3d p4n(1.0, 0.0, 4.0);
1957 Vec3d p5(0.0, 0.0, 1.0);
1958 Vec3d p6(1.0, 0.0, 1.0);
1959 Vec3d p7(1.0, 1.0, 1.0);
1960 Vec3d p8(0.0, 1.0, 1.0);
1962 Vec3d p9(0.0, 0.0, 2.0);
1963 Vec3d p10(1.0, 0.0, 2.0);
1964 Vec3d p11(1.0, 1.0, 2.0);
1965 Vec3d p12(0.0, 1.0, 2.0);
1967 std::vector<Vec3d> new_vertices;
1969 new_vertices.push_back(p1n);
1970 new_vertices.push_back(p2n);
1971 new_vertices.push_back(p3n);
1972 new_vertices.push_back(p4n);
1974 new_vertices.push_back(p5);
1975 new_vertices.push_back(p6);
1976 new_vertices.push_back(p7);
1977 new_vertices.push_back(p8);
1978 new_vertices.push_back(p9);
1979 new_vertices.push_back(p10);
1980 new_vertices.push_back(p11);
1981 new_vertices.push_back(p12);
1983 mesh_.swap_vertices(new_vertices);
1985 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(0))[0], p1n[0]);
1986 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(0))[1], p1n[1]);
1987 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(0))[2], p1n[2]);
1989 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(1))[0], p2n[0]);
1990 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(1))[1], p2n[1]);
1991 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(1))[2], p2n[2]);
1993 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(2))[0], p3n[0]);
1994 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(2))[1], p3n[1]);
1995 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(2))[2], p3n[2]);
1997 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(3))[0], p4n[0]);
1998 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(3))[1], p4n[1]);
1999 EXPECT_DOUBLE_EQ(mesh_.vertex(VertexHandle(3))[2], p4n[2]);
2001 EXPECT_EQ(12u, mesh_.n_vertices());
2007 mesh.delete_vertex(VertexHandle(0));
2008 mesh.collect_garbage();
2009 EXPECT_DOUBLE_EQ(mesh.vertex(VertexHandle(0))[1], 1);
2013 mesh_.enable_deferred_deletion(
true);
2014 mesh_.enable_fast_deletion(
false);
2015 testDeferredDelete(mesh_);
2018 mesh_.enable_deferred_deletion(
true);
2019 mesh_.enable_fast_deletion(
true);
2020 testDeferredDelete(mesh_);
2026 ASSERT_FALSE(vh.is_valid());
2028 ASSERT_FALSE(eh.is_valid());
2030 ASSERT_FALSE(heh.is_valid());
2032 ASSERT_FALSE(fh.is_valid());
2034 ASSERT_FALSE(hfh.is_valid());
2036 ASSERT_FALSE(ch.is_valid());
2049 EXPECT_EQ(copy.n_vertices(), mesh_.n_vertices());
2050 EXPECT_EQ(copy.vertex(v0)[0], 1);
2051 mesh_.set_vertex(v0,
Vec3d(2, 2, 2));
2052 EXPECT_EQ(copy.vertex(v0)[0], 1);
2056 EXPECT_EQ(assigned.
vertex(v0)[0], 2);
2058 EXPECT_EQ(mesh_.vertex(v0)[0], 2);
2061 moved = std::move(std::move(mesh_));
2062 EXPECT_EQ(moved.
vertex(v0)[0], 2);
2065 EXPECT_EQ(move_constructed.vertex(v0)[0], 1);
SmartVertexHandle add_vertex(const Point _p)
void set_vertex(VertexHandle _vh, const VecT &_p)
Set the coordinates of point _vh.
const VecT & vertex(VertexHandle _vh) const
Get point _vh's coordinates.
Iterate over all vertices of a hexahedron in a specific order.