23 #ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_ 24 #define SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_ 26 #include <gudhi/Off_reader.h> 34 namespace skeleton_blocker {
39 template<
typename Complex>
42 typedef typename Complex::Vertex_handle Vertex_handle;
43 typedef typename Complex::Point Point;
45 const bool load_only_points_;
50 load_only_points_(load_only_points) { }
52 void init(
int dim,
int num_vertices,
int num_faces,
int num_edges) {
57 void point(
const std::vector<double>& point) {
58 complex_.add_vertex(Point(point.begin(), point.end()));
61 void maximal_face(
const std::vector<int>& face) {
62 if (!load_only_points_) {
63 for (
size_t i = 0; i < face.size(); ++i)
64 for (
size_t j = i + 1; j < face.size(); ++j) {
65 complex_.add_edge_without_blockers(Vertex_handle(face[i]), Vertex_handle(face[j]));
76 template<
typename Complex>
79 typedef typename Complex::Vertex_handle Vertex_handle;
80 typedef typename Complex::Simplex Simplex;
81 typedef typename Complex::Point Point;
83 const bool load_only_points_;
84 std::vector<Point> points_;
85 std::vector<Simplex> maximal_faces_;
90 load_only_points_(load_only_points) { }
92 void init(
int dim,
int num_vertices,
int num_faces,
int num_edges) {
93 maximal_faces_.reserve(num_faces);
94 points_.reserve(num_vertices);
97 void point(
const std::vector<double>& point) {
98 points_.emplace_back(point.begin(), point.end());
101 void maximal_face(
const std::vector<int>& face) {
102 if (!load_only_points_) {
105 s.add_vertex(Vertex_handle(x));
106 maximal_faces_.emplace_back(s);
111 complex_ = make_complex_from_top_faces<Complex>(maximal_faces_.begin(), maximal_faces_.end(),
112 points_.begin(), points_.end());
119 template<
typename Complex>
128 bool read_only_points =
false,
bool is_flag =
false) : valid_(false) {
129 std::ifstream stream(name_file);
130 if (stream.is_open()) {
131 if (is_flag || read_only_points) {
134 valid_ = off_reader.
read(off_visitor);
138 valid_ = off_reader.
read(off_visitor);
154 template<
typename Complex>
155 class Skeleton_blocker_off_writer {
162 Skeleton_blocker_off_writer(
const std::string & name_file,
const Complex& save_complex) {
163 typedef typename Complex::Vertex_handle Vertex_handle;
165 std::ofstream stream(name_file);
166 if (stream.is_open()) {
168 size_t num_triangles = std::distance(save_complex.triangle_range().begin(), save_complex.triangle_range().end());
169 stream << save_complex.num_vertices() <<
" " << num_triangles <<
" 0 \n";
173 std::map<Vertex_handle, size_t> vertex_num;
174 size_t current_vertex = 0;
176 for (
auto v : save_complex.vertex_range()) {
177 vertex_num[v] = current_vertex++;
178 const auto& pt(save_complex.point(v));
184 for (
const auto & t : save_complex.triangle_range()) {
187 stream << vertex_num[x] <<
" ";
192 std::cerr <<
"could not open file " << name_file << std::endl;
199 namespace skbl = skeleton_blocker;
203 #endif // SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_ bool read(OffVisitor &off_visitor)
Read an OFF file and calls the following methods :
Definition: Off_reader.h:65
Definition: SimplicialComplexForAlpha.h:26
Skeleton_blocker_off_reader(const std::string &name_file, Complex &read_complex, bool read_only_points=false, bool is_flag=false)
Definition: Skeleton_blocker_off_io.h:127
OFF file reader top class visitor.
Definition: Off_reader.h:43
Off reader visitor that can be passed to Off_reader to read a Skeleton_blocker_complex.
Definition: Skeleton_blocker_off_io.h:40
bool is_valid() const
Definition: Skeleton_blocker_off_io.h:146
Off reader visitor that can be passed to Off_reader to read a Skeleton_blocker_complex.
Definition: Skeleton_blocker_off_io.h:77
Class that allows to load a Skeleton_blocker_complex from an off file.
Definition: Skeleton_blocker_off_io.h:120