Wildmeshing Toolkit
Loading...
Searching...
No Matches
RawSimplexCollection.hpp
1#pragma once
2
3#include <cassert>
4#include "RawSimplex.hpp"
5
6namespace wmtk::simplex {
7
9{
10public:
11 RawSimplexCollection() = default;
12
13 // RawSimplexCollection(std::vector<RawSimplex>&& simplices = {})
14 // : m_simplices(std::move(simplices))
15 //{}
16
20 // const std::vector<RawSimplex>& simplex_vector() const { return m_simplices; }
21
25 const std::vector<Vertex>& vertices() const;
26 const std::vector<Edge>& edges() const;
27 const std::vector<Face>& faces() const;
28 const std::vector<Tet>& tets() const;
29
30 void reserve_vertices(size_t new_capacity) { m_v.reserve(new_capacity); }
31 void reserve_edges(size_t new_capacity) { m_e.reserve(new_capacity); }
32 void reserve_faces(size_t new_capacity) { m_f.reserve(new_capacity); }
33 void reserve_tets(size_t new_capacity) { m_t.reserve(new_capacity); }
34
40 void add(const Vertex& s) { m_v.emplace_back(s); }
41 void add(const Edge& s) { m_e.emplace_back(s); }
42 void add(const Face& s) { m_f.emplace_back(s); }
43 void add(const Tet& s) { m_t.emplace_back(s); }
49 void add_with_faces(const Edge& s)
50 {
51 add(s);
53 }
54 void add_with_faces(const Face& s)
55 {
56 add(s);
58 }
59 void add_with_faces(const Tet& s)
60 {
61 add(s);
63 }
64
65 void add(const RawSimplexCollection& simplex_collection);
66
70 void sort_and_clean();
71
77 bool contains(const Vertex& simplex) const
78 {
79 assert(std::is_sorted(m_v.begin(), m_v.end()));
80 return std::binary_search(m_v.begin(), m_v.end(), simplex);
81 }
82 bool contains(const Edge& simplex) const
83 {
84 assert(std::is_sorted(m_e.begin(), m_e.end()));
85 return std::binary_search(m_e.begin(), m_e.end(), simplex);
86 }
87 bool contains(const Face& simplex) const
88 {
89 assert(std::is_sorted(m_f.begin(), m_f.end()));
90 return std::binary_search(m_f.begin(), m_f.end(), simplex);
91 }
92 bool contains(const Tet& simplex) const
93 {
94 assert(std::is_sorted(m_t.begin(), m_t.end()));
95 return std::binary_search(m_t.begin(), m_t.end(), simplex);
96 }
97
103 static RawSimplexCollection get_union(
104 const RawSimplexCollection& collection_a,
105 const RawSimplexCollection& collection_b);
106
112 static RawSimplexCollection get_intersection(
113 const RawSimplexCollection& collection_a,
114 const RawSimplexCollection& collection_b);
115
122 const RawSimplexCollection& collection_a,
123 const RawSimplexCollection& collection_b);
124
128 template <int N>
129 static RawSimplexCollection faces_from_simplex(const RawSimplex<N>& simplex);
130
131 std::vector<Face> faces_with_edge(const Edge& e) const;
132
133 size_t size() const;
134
135 bool operator==(const RawSimplexCollection& that) const;
136 bool operator!=(const RawSimplexCollection& that) const;
137
138private:
139 std::vector<Vertex> m_v;
140 std::vector<Edge> m_e;
141 std::vector<Face> m_f;
142 std::vector<Tet> m_t;
143};
144
145template <int N>
147{
148 const auto& v = simplex.vertices();
149
151
152 if constexpr (N == 1) {
153 // do nothing
154 } else if constexpr (N == 2) {
155 sc.m_v.emplace_back(Vertex(v[0]));
156 sc.m_v.emplace_back(Vertex(v[1]));
157 } else if constexpr (N == 3) {
158 sc.m_v.emplace_back(Vertex(v[0]));
159 sc.m_v.emplace_back(Vertex(v[1]));
160 sc.m_v.emplace_back(Vertex(v[2]));
161 sc.m_e.emplace_back(Edge(v[0], v[1]));
162 sc.m_e.emplace_back(Edge(v[0], v[2]));
163 sc.m_e.emplace_back(Edge(v[1], v[2]));
164 } else {
165 static_assert(N == 4);
166
167 sc.m_v.emplace_back(Vertex(v[0]));
168 sc.m_v.emplace_back(Vertex(v[1]));
169 sc.m_v.emplace_back(Vertex(v[2]));
170 sc.m_v.emplace_back(Vertex(v[3]));
171 sc.m_e.emplace_back(Edge(v[0], v[1]));
172 sc.m_e.emplace_back(Edge(v[0], v[2]));
173 sc.m_e.emplace_back(Edge(v[0], v[3]));
174 sc.m_e.emplace_back(Edge(v[1], v[2]));
175 sc.m_e.emplace_back(Edge(v[1], v[3]));
176 sc.m_e.emplace_back(Edge(v[2], v[3]));
177 sc.m_f.emplace_back(Face(v[0], v[1], v[2]));
178 sc.m_f.emplace_back(Face(v[0], v[1], v[3]));
179 sc.m_f.emplace_back(Face(v[0], v[2], v[3]));
180 sc.m_f.emplace_back(Face(v[1], v[2], v[3]));
181 }
182
183 return sc;
184}
185
186} // namespace wmtk::simplex
Definition RawSimplex.hpp:46
Definition RawSimplex.hpp:57
Definition RawSimplexCollection.hpp:9
static bool are_simplex_collections_equal(const RawSimplexCollection &collection_a, const RawSimplexCollection &collection_b)
Check if the two simplex collections are equal.
Definition RawSimplexCollection.cpp:92
void add(const Vertex &s)
Add simplex to the collection.
Definition RawSimplexCollection.hpp:40
const std::vector< Vertex > & vertices() const
Return const reference to the RawSimplex vector.
Definition RawSimplexCollection.cpp:7
static RawSimplexCollection faces_from_simplex(const RawSimplex< N > &simplex)
Get all faces of the simplex.
Definition RawSimplexCollection.hpp:146
static RawSimplexCollection get_intersection(const RawSimplexCollection &collection_a, const RawSimplexCollection &collection_b)
Get intersection of two simplex collections.
Definition RawSimplexCollection.cpp:70
static RawSimplexCollection get_union(const RawSimplexCollection &collection_a, const RawSimplexCollection &collection_b)
Get union of two simplex collections.
Definition RawSimplexCollection.cpp:48
bool contains(const Vertex &simplex) const
Check if simplex is contained in collection.
Definition RawSimplexCollection.hpp:77
void sort_and_clean()
Sort simplex vector and remove duplicates.
Definition RawSimplexCollection.cpp:35
void add_with_faces(const Edge &s)
Add the simplex and its faces to the collection.
Definition RawSimplexCollection.hpp:49
Definition RawSimplex.hpp:17
Definition RawSimplex.hpp:37