33#include < algorithm>
44#include < array>
55#include < iostream>
6+ #include < iterator>
67#include < map>
78#include < memory>
89#include < vector>
910
11+ namespace OpenABF
12+ {
13+
1014namespace detail
1115{
1216struct ExpandType {
@@ -17,19 +21,24 @@ struct ExpandType {
1721};
1822} // namespace detail
1923
20- struct DefaultEdgeProperties {
21- };
24+ template <typename T>
2225struct DefaultVertexProperties {
2326};
27+
28+ template <typename T>
29+ struct DefaultEdgeProperties {
30+ };
31+
32+ template <typename T>
2433struct DefaultFaceProperties {
2534};
2635
2736template <
28- typename T = float ,
37+ typename T,
2938 size_t Dim = 3 ,
30- typename VertexProperties = DefaultVertexProperties,
31- typename EdgeProperties = DefaultEdgeProperties,
32- typename FaceProperties = DefaultFaceProperties>
39+ typename VertexProperties = DefaultVertexProperties<T> ,
40+ typename EdgeProperties = DefaultEdgeProperties<T> ,
41+ typename FaceProperties = DefaultFaceProperties<T> >
3342class HalfEdgeMesh
3443{
3544private:
@@ -57,13 +66,31 @@ class HalfEdgeMesh
5766 return std::make_shared<Vertex>(std::forward<Args>(args)...);
5867 }
5968
60- bool is_boundary () const
69+ auto edges () -> std::vector<EdgePtr>
6170 {
62- if (edge) {
63- return edge->pair == nullptr ;
64- }
65- throw std::runtime_error (
66- " Unreferenced vertex: " + std::to_string (idx));
71+ std::vector<EdgePtr> ret;
72+ auto e = edge;
73+ do {
74+ if (not e->pair ) {
75+ throw std::runtime_error (
76+ " Cannot enumerate edges for boundary_vertices vertex." );
77+ }
78+ ret.push_back (e);
79+ e = e->pair ->next ;
80+ } while (e != edge);
81+ return ret;
82+ }
83+
84+ auto is_boundary () const -> bool
85+ {
86+ auto e = edge;
87+ do {
88+ if (not e->pair ) {
89+ return true ;
90+ }
91+ e = e->pair ->next ;
92+ } while (e != edge);
93+ return false ;
6794 }
6895
6996 size_t idx{0 };
@@ -78,6 +105,8 @@ class HalfEdgeMesh
78105 return std::make_shared<Edge>(std::forward<Args>(args)...);
79106 }
80107
108+ auto is_boundary () const -> bool { return pair == nullptr ; }
109+
81110 EdgePtr pair;
82111 EdgePtr next;
83112 VertPtr vertex;
@@ -102,7 +131,7 @@ class HalfEdgeMesh
102131 HalfEdgeMesh () = default ;
103132
104133 template <typename ... Args>
105- size_t insertVertex (Args... args)
134+ auto insertVertex (Args... args) -> size_t
106135 {
107136 auto vert = Vertex::New (std::forward<Args>(args)...);
108137 vert->idx = verts_.size ();
@@ -111,7 +140,7 @@ class HalfEdgeMesh
111140 }
112141
113142 template <typename ... Args>
114- size_t insertFace (Args... args)
143+ auto insertFace (Args... args) -> size_t
115144 {
116145 // Make a new face structure
117146 auto face = Face::New ();
@@ -121,6 +150,7 @@ class HalfEdgeMesh
121150 EdgePtr prevEdge;
122151 for (const auto & idx : {args...}) {
123152 // Make a new edge
153+ // TODO: Make sure edge doesn't already exist?
124154 auto newEdge = Edge::New ();
125155 newEdge->face = face;
126156
@@ -178,9 +208,33 @@ class HalfEdgeMesh
178208 return faces_.size () - 1 ;
179209 }
180210
211+ auto vertices () -> std::vector<VertPtr> { return verts_; }
212+
213+ auto edges () -> std::vector<EdgePtr> { return edges_; }
214+
215+ auto faces () -> std::vector<FacePtr> { return faces_; }
216+
217+ auto interior_vertices () -> std::vector<VertPtr>
218+ {
219+ std::vector<VertPtr> ret;
220+ std::copy_if (
221+ verts_.begin (), verts_.end (), std::back_inserter (ret),
222+ [](auto x) { return not x->is_boundary (); });
223+ return ret;
224+ }
225+
226+ auto boundary_vertices () -> std::vector<VertPtr>
227+ {
228+ std::vector<VertPtr> ret;
229+ std::copy_if (
230+ verts_.begin (), verts_.end (), std::back_inserter (ret),
231+ [](auto x) { return x->is_boundary (); });
232+ return ret;
233+ }
234+
181235private:
182236 // Find edge by start and end vertex indices
183- EdgePtr find_edge_ (size_t start, size_t end)
237+ auto find_edge_ (size_t start, size_t end) -> EdgePtr
184238 {
185239 // Get edges with this start index
186240 auto range = edges_.equal_range (start);
@@ -194,4 +248,5 @@ class HalfEdgeMesh
194248 }
195249 return nullptr ;
196250 }
197- };
251+ };
252+ } // namespace OpenABF
0 commit comments