Skip to content

Commit 3e3bdda

Browse files
committed
Simple init from bootstrap
1 parent 692d26f commit 3e3bdda

File tree

7 files changed

+140
-36
lines changed

7 files changed

+140
-36
lines changed

CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
cmake_minimum_required(VERSION 3.17)
2-
project(abf++)
2+
project(OpenABF)
33

44
set(CMAKE_CXX_STANDARD 14)
55

66
include_directories(${CMAKE_SOURCE_DIR}/include)
7+
set(public_hdrs
8+
include/OpenABF/ABF.hpp
9+
include/OpenABF/HalfEdgeMesh.hpp
10+
)
711

8-
add_executable(abf_test main.cpp)
12+
add_executable(abf_test ${public_hdrs} main.cpp)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
# ABF++
1+
# OpenABF

include/OpenABF/ABF.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
3+
#include "OpenABF/HalfEdgeMesh.hpp"
4+
5+
namespace OpenABF
6+
{
7+
8+
template <typename T, size_t Dims = 3>
9+
class ABF
10+
{
11+
struct VertProperties {
12+
};
13+
14+
struct EdgeProperties {
15+
T alpha{0};
16+
T beta{0};
17+
T weight{0};
18+
};
19+
20+
struct FaceProperties {
21+
};
22+
23+
using HEM =
24+
HalfEdgeMesh<T, Dims, VertProperties, EdgeProperties, FaceProperties>;
25+
26+
public:
27+
HEM mesh;
28+
};
29+
30+
} // namespace OpenABF
Lines changed: 71 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
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+
1014
namespace detail
1115
{
1216
struct ExpandType {
@@ -17,19 +21,24 @@ struct ExpandType {
1721
};
1822
} // namespace detail
1923

20-
struct DefaultEdgeProperties {
21-
};
24+
template <typename T>
2225
struct DefaultVertexProperties {
2326
};
27+
28+
template <typename T>
29+
struct DefaultEdgeProperties {
30+
};
31+
32+
template <typename T>
2433
struct DefaultFaceProperties {
2534
};
2635

2736
template <
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>>
3342
class HalfEdgeMesh
3443
{
3544
private:
@@ -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+
181235
private:
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

include/abf++/ABF.hpp

Lines changed: 0 additions & 7 deletions
This file was deleted.

logo.png

15.1 KB
Loading

main.cpp

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,41 @@
11
#include <iostream>
22

3-
#include "abf++/ABF.hpp"
4-
#include "abf++/HalfEdgeMesh.hpp"
3+
#include "OpenABF/ABF.hpp"
4+
#include "OpenABF/HalfEdgeMesh.hpp"
55

66
int main()
77
{
8-
HalfEdgeMesh<> hem;
8+
OpenABF::ABF<float> abf;
99

10-
hem.insertVertex(0, 0, 0);
11-
hem.insertVertex(1, 0, 0);
12-
hem.insertVertex(1, -1, 0);
13-
hem.insertVertex(1, 1, 0);
10+
abf.mesh.insertVertex(0, 0, 0);
11+
abf.mesh.insertVertex(1, 0, 0);
12+
abf.mesh.insertVertex(1, -1, 0);
13+
abf.mesh.insertVertex(1, 1, 0);
1414

15-
hem.insertFace(0, 1, 2);
16-
hem.insertFace(0, 3, 1);
15+
abf.mesh.insertFace(0, 1, 2);
16+
abf.mesh.insertFace(0, 3, 1);
17+
abf.mesh.insertFace(0, 2, 3);
1718

18-
std::cout << "End." << std::endl;
19+
std::cout << "Interior vertices: [edges]" << std::endl;
20+
size_t count{0};
21+
for (const auto& v : abf.mesh.interior_vertices()) {
22+
std::cout << "\t- Vertex " << v->idx << ": ";
23+
for (const auto& e : v->edges()) {
24+
if (count++ > 0) {
25+
std::cout << ", ";
26+
}
27+
std::cout << e->vertex->idx << "<->" << e->next->vertex->idx;
28+
}
29+
}
30+
std::cout << std::endl;
31+
32+
std::cout << "Boundary vertices: ";
33+
count = 0;
34+
for (const auto& v : abf.mesh.boundary_vertices()) {
35+
if (count++ > 0) {
36+
std::cout << ", ";
37+
}
38+
std::cout << v->idx;
39+
}
40+
std::cout << std::endl;
1941
}

0 commit comments

Comments
 (0)