1+ #include " faces_single_dimension.hpp"
2+
3+ namespace wmtk ::simplex {
4+ std::vector<Tuple> vertices (const Mesh& m, const Simplex& simplex)
5+ {
6+ if (simplex.primitive_type () == PrimitiveType::Vertex) {
7+ return {};
8+ }
9+
10+ const Tuple v0 = simplex.tuple ();
11+ const Tuple v1 = m.switch_edge (m.switch_vertex (v0));
12+
13+ if (simplex.primitive_type () == PrimitiveType::Edge) {
14+ return {v0, v1};
15+ }
16+
17+ const Tuple v2 = m.switch_vertex (m.switch_edge (v0));
18+
19+ if (simplex.primitive_type () == PrimitiveType::Face) {
20+ return {v0, v1, v2};
21+ }
22+
23+ const Tuple v3 = m.switch_vertex (m.switch_edge (m.switch_face (v0)));
24+
25+ if (simplex.primitive_type () == PrimitiveType::Tetrahedron) {
26+ return {v0, v1, v2, v3};
27+ }
28+
29+ throw std::runtime_error (" unknown primitive type" );
30+ }
31+
32+ std::vector<Tuple> edges (const Mesh& m, const Simplex& simplex)
33+ {
34+ if (simplex.primitive_type () == PrimitiveType::Vertex ||
35+ simplex.primitive_type () == PrimitiveType::Edge) {
36+ return {};
37+ }
38+
39+ const Tuple e0 = simplex.tuple ();
40+ const Tuple e1 = m.switch_edge (m.switch_vertex (e0 ));
41+ const Tuple e2 = m.switch_vertex (m.switch_edge (e0 ));
42+
43+ if (simplex.primitive_type () == PrimitiveType::Face) {
44+ return {e0 , e1 , e2 };
45+ }
46+
47+ const Tuple e3 = m.switch_edge (m.switch_face (e0 ));
48+ const Tuple e4 = m.switch_edge (m.switch_face (e1 ));
49+ const Tuple e5 = m.switch_edge (m.switch_face (e2 ));
50+
51+ if (simplex.primitive_type () == PrimitiveType::Tetrahedron) {
52+ return {e0 , e1 , e2 , e3 , e4 , e5 };
53+ }
54+
55+ throw std::runtime_error (" unknown primitive type" );
56+ }
57+
58+ std::vector<Tuple> faces (const Mesh& m, const Simplex& simplex)
59+ {
60+ if (simplex.primitive_type () == PrimitiveType::Vertex ||
61+ simplex.primitive_type () == PrimitiveType::Edge ||
62+ simplex.primitive_type () == PrimitiveType::Face) {
63+ return {};
64+ }
65+
66+ const Tuple f0 = simplex.tuple ();
67+ const Tuple f1 = m.switch_edge (m.switch_face (f0));
68+ const Tuple f2 = m.switch_edge (m.switch_face (m.switch_edge (m.switch_vertex (f0))));
69+ const Tuple f3 = m.switch_edge (m.switch_face (m.switch_vertex (m.switch_edge (f0))));
70+
71+ if (simplex.primitive_type () == PrimitiveType::Tetrahedron) {
72+ return {f0, f1, f2, f3};
73+ }
74+
75+ throw std::runtime_error (" unknown primitive type" );
76+ }
77+
78+ std::vector<Tuple>
79+ faces_single_dimension (const Mesh& mesh, const Simplex& simplex, const PrimitiveType face_type)
80+ {
81+ switch (face_type) {
82+ case PrimitiveType::Vertex: return vertices (mesh, simplex);
83+ case PrimitiveType::Edge: return edges (mesh, simplex);
84+ case PrimitiveType::Face: return faces (mesh, simplex);
85+ case PrimitiveType::Tetrahedron: return {};
86+ default : throw std::runtime_error (" unknown primitive type" ); break ;
87+ }
88+ }
89+ } // namespace wmtk::simplex
0 commit comments