output_meshes_to_medit.h
1 /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2  * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3  * Author(s): Siargey Kachanovich
4  *
5  * Copyright (C) 2019 Inria
6  *
7  * Modification(s):
8  * - YYYY/MM Author: Description of the modification
9  */
10 
11 #ifndef IO_OUTPUT_MESHES_TO_MEDIT_H_
12 #define IO_OUTPUT_MESHES_TO_MEDIT_H_
13 
14 #include <gudhi/IO/Mesh_medit.h>
15 
16 #include <Eigen/Dense>
17 
18 #include <cstdlib> // for std::size_t
19 #include <fstream> // for std::ofstream
20 #include <vector>
21 #include <type_traits> // for std::enable_if
22 #include <tuple> // for std::get
23 #include <utility> // for std::make_pair
24 
25 namespace Gudhi {
26 
27 namespace coxeter_triangulation {
28 
29 using Vertex_points = Mesh_medit::Vertex_points;
30 using Mesh_elements = Mesh_medit::Mesh_elements;
31 using Scalar_field_range = Mesh_medit::Scalar_field_range;
32 
33 template <std::size_t I = 0, typename... Meshes>
34 typename std::enable_if<I == sizeof...(Meshes), void>::type fill_meshes(Vertex_points& vertex_points,
35  Mesh_elements& edges, Mesh_elements& triangles,
36  Mesh_elements& tetrahedra,
37  Scalar_field_range& triangles_scalar_range,
38  Scalar_field_range& tetrahedra_scalar_range,
39  std::size_t index, const Meshes&... meshes) {}
40 
41 template <std::size_t I = 0, typename... Meshes>
42 typename std::enable_if<I != sizeof...(Meshes), void>::type fill_meshes(Vertex_points& vertex_points,
43  Mesh_elements& edges, Mesh_elements& triangles,
44  Mesh_elements& tetrahedra,
45  Scalar_field_range& triangles_scalar_range,
46  Scalar_field_range& tetrahedra_scalar_range,
47  std::size_t index, const Meshes&... meshes) {
48  auto mesh = std::get<I>(std::forward_as_tuple(meshes...));
49  for (const auto& v : mesh.vertex_points) vertex_points.push_back(v);
50  for (const auto& e : mesh.edges) {
51  std::vector<std::size_t> edge;
52  for (const auto& v_i : e.first) edge.push_back(v_i + index);
53  edges.emplace_back(edge, e.second);
54  }
55  for (const auto& t : mesh.triangles) {
56  std::vector<std::size_t> triangle;
57  for (const auto& v_i : t.first) triangle.push_back(v_i + index);
58  triangles.emplace_back(triangle, t.second);
59  }
60  for (const auto& t : mesh.tetrahedra) {
61  std::vector<std::size_t> tetrahedron;
62  for (const auto& v_i : t.first) tetrahedron.push_back(v_i + index);
63  tetrahedra.emplace_back(tetrahedron, t.second);
64  }
65  for (const auto& b : mesh.triangles_scalar_range) triangles_scalar_range.push_back(b);
66  for (const auto& b : mesh.tetrahedra_scalar_range) tetrahedra_scalar_range.push_back(b);
67  fill_meshes<I + 1, Meshes...>(vertex_points, edges, triangles, tetrahedra, triangles_scalar_range,
68  tetrahedra_scalar_range, index + mesh.vertex_points.size(), meshes...);
69 }
70 
80 template <typename... Meshes>
81 void output_meshes_to_medit(std::size_t amb_d, std::string file_name, const Meshes&... meshes) {
82  Vertex_points vertex_points;
83  Mesh_elements edges, triangles, tetrahedra;
84  Scalar_field_range triangles_scalar_range, tetrahedra_scalar_range;
85  fill_meshes(vertex_points, edges, triangles, tetrahedra, triangles_scalar_range, tetrahedra_scalar_range, 0,
86  meshes...);
87 
88  std::ofstream ofs(file_name + ".mesh", std::ofstream::out);
89  std::ofstream ofs_bb(file_name + ".bb", std::ofstream::out);
90 
91  if (amb_d == 2) {
92  ofs << "MeshVersionFormatted 1\nDimension 2\n";
93  ofs_bb << "2 1 ";
94  ofs << "Vertices\n" << vertex_points.size() << "\n";
95  for (auto p : vertex_points) {
96  ofs << p[0] << " " << p[1] << " 2\n";
97  }
98  ofs << "Edges " << edges.size() << "\n";
99  for (auto e : edges) {
100  for (auto v : e.first) ofs << v << " ";
101  ofs << e.second << std::endl;
102  }
103  ofs << "Triangles " << triangles.size() << "\n";
104  for (auto s : triangles) {
105  for (auto v : s.first) {
106  ofs << v << " ";
107  }
108  ofs << s.second << std::endl;
109  }
110 
111  ofs_bb << triangles_scalar_range.size() << " 1\n";
112  for (auto& b : triangles_scalar_range) ofs_bb << b << "\n";
113 
114  } else {
115  ofs << "MeshVersionFormatted 1\nDimension 3\n";
116  ofs_bb << "3 1 ";
117  ofs << "Vertices\n" << vertex_points.size() << "\n";
118  for (auto p : vertex_points) {
119  ofs << p[0] << " " << p[1] << " " << p[2] << " 2\n";
120  }
121  ofs << "Edges " << edges.size() << "\n";
122  for (auto e : edges) {
123  for (auto v : e.first) ofs << v << " ";
124  ofs << e.second << std::endl;
125  }
126  ofs << "Triangles " << triangles.size() << "\n";
127  for (auto s : triangles) {
128  for (auto v : s.first) {
129  ofs << v << " ";
130  }
131  ofs << s.second << std::endl;
132  }
133  ofs << "Tetrahedra " << tetrahedra.size() << "\n";
134  for (auto s : tetrahedra) {
135  for (auto v : s.first) {
136  ofs << v << " ";
137  }
138  ofs << s.second << std::endl;
139  }
140 
141  ofs_bb << triangles_scalar_range.size() + tetrahedra_scalar_range.size() << " 1\n";
142  for (auto& b : triangles_scalar_range) ofs_bb << b << "\n";
143  for (auto& b : tetrahedra_scalar_range) ofs_bb << b << "\n";
144  }
145 
146  ofs.close();
147  ofs_bb.close();
148 }
149 
150 } // namespace coxeter_triangulation
151 
152 } // namespace Gudhi
153 
154 #endif
void output_meshes_to_medit(std::size_t amb_d, std::string file_name, const Meshes &... meshes)
Outputs a text file with specified meshes that can be visualized in Medit.
Definition: output_meshes_to_medit.h:81
std::vector< Eigen::VectorXd > Vertex_points
Type of a range of vertices.
Definition: Mesh_medit.h:31
std::vector< double > Scalar_field_range
Type of a range of scalar field .
Definition: Mesh_medit.h:40
std::vector< Mesh_element > Mesh_elements
Type of a range of mesh elements.
Definition: Mesh_medit.h:38
GUDHIdev  Version 3.5.0  - C++ library for Topological Data Analysis (TDA) and Higher Dimensional Geometry Understanding.  - Copyright : MIT Generated on Fri Jan 14 2022 18:28:42 for GUDHIdev by Doxygen 1.9.1